找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1682|回复: 4
收起左侧

单片机8层电梯仿真,数码管不显示

[复制链接]
ID:273674 发表于 2019-4-9 15:05 | 显示全部楼层 |阅读模式
从论坛下载的一个8层电梯的,从仿真文件夹里的hex.可以仿真数码管正常显示,但是从程序.C文件生成的hex.文件仿真数码管就乱码或者不显示
求大神帮忙,急!!
微信图片_20190409150412.png 微信图片_20190409150405.png

代码.doc

92 KB, 下载次数: 13

回复

使用道具 举报

ID:273674 发表于 2019-4-9 16:13 | 显示全部楼层
#include <reg52.h>                 //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
#define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
#include <intrins.h>

//数码管段选定义       0    1    2    3   4           5        6         7          8           9       
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0xdf,0xdb
//                                           A        B         C          D           E   F        不显示
                                         };         //断码       

uchar dis_smg[8] = { 0 };

bit flag_100ms,flag_1s;       
bit flag_stop = 1;   //用做到了相应的楼停下

sbit xia   = P2^0;
sbit zhong = P2^1;
sbit shang = P2^2;

uchar value2;
uchar flag_start ;     //启动标志位  1为起动步进电机 否则关闭电机
uchar flag_z_f;        //正反标志位  0为顺时钟 1为逆时史上转

sbit led1 = P1^7;          //8个发光二极管定义
sbit led2 = P1^6;
sbit led3 = P1^5;
sbit led4 = P1^4;
sbit led5 = P1^3;
sbit led6 = P1^2;
sbit led7 = P1^1;
sbit led8 = P1^0;

sbit dj1 = P2^7;   //电机IO口定义
sbit dj2 = P2^5;   //电机IO口定义
sbit dj3 = P2^4;   //电机IO口定义
sbit dj4 = P2^3;   //电机IO口定义


uchar dt_1;  //1楼电梯标志位
uchar dt_2;  //2楼电梯标志位
uchar dt_3;  //3楼电梯标志位
uchar dt_4;  //4楼电梯标志位
uchar dt_5;  //5楼电梯标志位
uchar dt_6;  //6楼电梯标志位
uchar dt_7;  //7楼电梯标志位
uchar dt_8;  //8楼电梯标志位

uchar dt_value = 1;  //电梯到哪一层的变量
uchar dt_s_x ;    //电梯上下的标志位
sbit  VSDA = P3^7;
sbit  VCS  = P2^6;  
sbit  VSCL = P0^5;

void Delay(unsigned int i)//延时
{
        while(--i);
}

/***********************小延时函数**************************/
void  delay_us (unsigned int us)
{

        while(us--)
        {
                _nop_();
        }
}

/***********************正转****************************/
void zheng(uchar dat)
{
        switch(dat)
        {
                case 0: dj1=1;dj2=0;dj3=0;dj4=0; break;
                case 1: dj1=0;dj2=1;dj3=0;dj4=0; break;
                case 2: dj1=0;dj2=0;dj3=1;dj4=0; break;
                case 3: dj1=0;dj2=0;dj3=0;dj4=1; break;
        }
}

/***********************正转****************************/
void fan(uchar dat)
{
        switch(dat)
        {
                case 0: dj1=0;dj2=0;dj3=0;dj4=1; break;
                case 1: dj1=0;dj2=0;dj3=1;dj4=0; break;
                case 2: dj1=0;dj2=1;dj3=0;dj4=0; break;
                case 3: dj1=1;dj2=0;dj3=0;dj4=0; break;
        }
}

/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
        uint i,j;
        for(i=0;i<q;i++)
                for(j=0;j<120;j++);
}


/***********************语音程序************************/
void Send_threelines(unsigned char addr)
{
   unsigned char i;
        VCS=0;
        delay_1ms(5);  /* 片选拉低5ms */
    for(i=0;i<8;i++)
        {
                VSCL=0;
                if(addr&0x01)
                {
                        VSDA=1;
                }                                                                  
                else
                        VSDA=0;
                addr<<=1;
                delay_us(150); /* 150us */
                VSCL=1;
                delay_us(150); /* 150us */
        }
        VCS=1;
        delay_1ms(30);
}

/********************独立按键程序*****************/
uchar key_can;         //按键值

void key()         //独立按键程序
{
        static uchar key_new;
        key_can = 20;                   //按键值还原
        P3 |= 0xff;
        if(P3 != 0xff)                //按键按下
        {
                delay_1ms(1);                     //按键消抖动
                if((P3 != 0xff) && (key_new == 1))
                {                                                //确认是按键按下
                        key_new = 0;
                        switch(P3)
                        {
                                case 0xfe: key_can = 1; break;          //得到按键值
                                case 0xfd: key_can = 2; break;          //得到按键值
                                case 0xfb: key_can = 3; break;          //得到按键值
                                case 0xf7: key_can = 4; break;          //得到按键值
                                case 0xef: key_can = 5; break;          //得到按键值
                                case 0xdf: key_can = 6; break;          //得到按键值
                                case 0xbf: key_can = 7; break;          //得到按键值
                                case 0x7f: key_can = 8; break;          //得到按键值
                        }
                }                       
        }
        else
                key_new = 1;       
}

void key_with()
{
        if(key_can == 1)
        {
                led1 = 1;         //点亮发光二极管
                dt_1 = 1;         //
        }               
        if(key_can == 2)
        {
                led2 = 1;         //点亮发光二极管
                dt_2 = 1;
        }       
        if(key_can == 3)
        {
                led3 = 1;        //点亮发光二极管
                dt_3 = 1;
        }       
        if(key_can == 4)
        {
                led4 = 1;        //点亮发光二极管
                dt_4 = 1;
        }       
        if(key_can == 5)
        {
                led5 = 1;        //点亮发光二极管
                dt_5 = 1;
        }       
        if(key_can == 6)
        {
                led6 = 1;        //点亮发光二极管
                dt_6 = 1;
        }       
        if(key_can == 7)
        {
                led7 = 1;       
                dt_7 = 1;
        }       
        if(key_can == 8)
        {
                led8 = 1;       
                dt_8 = 1;
        }       
}
/*********************当电梯不动时、判断是向上、还是向下**********************/
void tiandi_shang_xia()
{
        static uchar value;
        if(dt_s_x == 0)
        {
               
                flag_stop = 1;
                if(dt_value == 1)         //电梯在第1层停下不走了
                {
                        value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                }                       
                if(dt_value == 2)         //电梯在第2层停下不走了
                {
                        value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                        value = dt_1;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                                
                        }       
                }
                if(dt_value == 3)         //电梯在第3层停下不走了
                {
                        value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                        value = dt_1 + dt_2;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;       
                                                                        
                        }       
                }       
                if(dt_value == 4)         //电梯在第4层停下不走了
                {
                        value = + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                        value = dt_1 + dt_2 + dt_3;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                                
                        }       
                }       
                if(dt_value == 5)         //电梯在第5层停下不走了
                {
                        value = dt_6 + dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;
                                xia = 1;                                                
                        }
                        value = dt_1 + dt_2 + dt_3 + dt_4;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                                
                        }       
                }       
                if(dt_value == 6)         //电梯在第6层停下不走了
                {
                        value =  dt_7 + dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;
                                xia = 1;                                                
                        }
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                                
                        }       
                }       
                if(dt_value == 7)         //电梯在第7层停下不走了
                {
                        value = dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                                
                        }       
                }       
                if(dt_value == 8)          //电梯在第8层停下不走了
                {
                        value = dt_8;
                        if(value != 0)
                        {
                                dt_s_x = 1;   //电梯向上走       
                                shang = 0;          //显示上
                                zhong = 0;       
                                xia = 1;                                        
                        }
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6;
                        if(value != 0)
                        {
                                dt_s_x = 2;   //电梯向下走       
                                xia = 0;          //显示下
                                zhong = 0;       
                                shang = 1;                                        
                        }       
                }       
                if(dt_s_x == 1)       
                {                          
                        flag_start = 1 ;     //运行
                        flag_z_f = 0;        //向上
                }
                if(dt_s_x == 2)       
                {                          
                        flag_start = 1 ;     //运行
                        flag_z_f = 1;        //向下
                }
                if(dt_s_x == 0)                                  
                {
                        flag_start = 0 ;     //停下
                        flag_z_f = 1;        //
                }
        }
}

/****************电梯向上、做最后的判断是否还要继续向上****************/
void dt_shang_guan()
{
        uchar value;
        if(dt_s_x == 1)    //电梯向上  做最后的判断是否还要继续向上
        {
                if(dt_value == 1)        //在第1层
                {
                        value = dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       
                }               
                else if(dt_value == 2)        //在第2层
                {
                        value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       
                }               
                else if(dt_value == 3)        //在第3层
                {
                        value = + dt_6 + dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;                                         
                        }else
                                flag_stop = 1;         
                }               
                else if(dt_value == 4)        //在第4层
                {
                        value = dt_5 + dt_6 + dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                
                }               
                else if(dt_value == 5)        //在第5层
                {
                        value = dt_6 + dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;               
                }               
                else if(dt_value == 6)        //在第6层
                {
                        value = dt_7 + dt_8;
                        if(value == 0)         //说明上面没有人按下
            {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                       
                }       
                else if(dt_value == 7)        //在第7层
                {
                        value = dt_8;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                shang = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       
                }               
                else if(dt_value == 8)        //在第8层
                {
                        dt_s_x = 0;  //电梯停下不动了
                        shang = 1;                //关闭上字
                        zhong = 1;         
                }               
        }       
}

/****************电梯向下、做最后的判断是否还要继续向下****************/
void dt_xia_guan()
{
        uchar value;
        if(dt_s_x == 2)    //电梯向下  做最后的判断是否还要继续向下
        {
                if(dt_value == 1)        //在第1层
                {
                        dt_s_x = 0;  //电梯停下不动了
                        xia = 1;                //关闭上字
                        zhong = 1;         
                        flag_stop = 1;       
                }               
                else if(dt_value == 2)        //在第2层
                {
                        value = dt_1;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       
                }               
                else if(dt_value == 3)        //在第3层
                {
                        value = dt_1 + dt_2;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;                                         
                        }else
                                flag_stop = 1;         
                }               
                else if(dt_value == 4)        //在第4层
                {
                        value = dt_2 + dt_3;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                
                }               
                else if(dt_value == 5)        //在第5层
                {
                        value = dt_1 + dt_2 + dt_4;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;               
                }               
                else if(dt_value == 6)        //在第6层
                {
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
                        if(value == 0)         //说明上面没有人按下
            {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                       
                }       
                else if(dt_value == 7)        //在第7层
                {
                        value = dt_1 + dt_2  + dt_4 + dt_5+ dt_6;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       
                }               
                else if(dt_value == 8)        //在第8层
                {
                        value =   dt_3 + dt_4 + dt_5 + dt_6 + dt_7;
                        if(value == 0)         //说明上面没有人按下
                        {
                                dt_s_x = 0;  //电梯停下不动了  
                                xia = 1;                //关闭上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;       

                       
                }               
        }               
}

/***********************电梯处理函数************************/
void td_dis()
{
        uchar value,value1;
        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
        if(value != 0)
        {                   //100ms
                if(flag_stop == 1)        //到相应的楼了  要停下
                {
/***************************向上走电梯***********************************/       
                        if(dt_s_x != 0)                  //向上走电梯
                        {
                                value1 ++;
                                if(value1 >= 10)  //1s
                                {
                                        value1 = 0;
                                        if(dt_s_x == 1)                  //向上走电梯
                                        {
                                                dt_value ++;
                                                shang = 0;                //显示上字
                                                zhong = 0;
                                        }
                                        if(dt_s_x == 2)                  //向下走电梯
                                        {
                                                dt_value --;
                                                xia = 0;                //显示下字
                                                zhong = 0;
                                        }                                       
                                        if(dt_value == 1)           //当到了第一层的时候
                                        {
                                                if(dt_1 == 1)
                                                {
                                                        led1 = 0;                 //关闭第一层发光二极管
                                                        dt_1 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(1) ;      //1楼到了
                                                }                                
                                        }
                                        else if(dt_value == 2)           //当到了第二层的时候
                                        {
                                                if(dt_2 == 1)
                                                {
                                                        led2 = 0;                 //关闭第二层发光二极管
                                                        dt_2 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(2) ;      //2楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 3)           //当到了第3层的时候
                                        {
                                                if(dt_3 == 1)
                                                {
                                                        led3 = 0;                 //关闭第3层发光二极管
                                                        dt_3 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(3) ;      //3楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 4)           //当到了第4层的时候
                                        {
                                                if(dt_4 == 1)
                                                {
                                                        led4 = 0;                 //关闭第4层发光二极管
                                                        dt_4 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(3) ;      //3楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 5)           //当到了第5层的时候
                                        {
                                                if(dt_5 == 1)
                                                {
                                                        led5 = 0;                 //关闭第5层发光二极管
                                                        dt_5 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(5) ;      //5楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 6)           //当到了第6层的时候
                                        {
                                                if(dt_6 == 1)
                                                {
                                                        led6 = 0;                 //关闭第6层发光二极管
                                                        dt_6 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(6) ;      //6楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 7)           //当到了第7层的时候
                                        {
                                                if(dt_7 == 1)
                                                {
                                                        led7 = 0;                 //关闭第7层发光二极管
                                                        dt_7 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(7) ;      //7楼到了                                        }                                
                                                }                                
                                        }
                                        else if(dt_value == 8)           //当到了第8层的时候
                                        {
                                                if(dt_8 == 1)
                                                {
                                                        led8 = 0;                 //关闭第8层发光二极管
                                                        dt_8 = 0;        //清零电机在的标志
                                                        flag_stop = 0;   //到停下
                                                        Send_threelines(8) ;      //8楼到了                                        }                                
                                                }                                
                                        }
                                }
                        }               
                }                                                
        }
        if(flag_stop == 0)
        {
                value2 ++;
                if(value2 % 5 == 0)
                {
                        if(dt_s_x == 1)           //上
                        {
                                shang = ~shang;
                                zhong = ~zhong;                               
                        }
                        if(dt_s_x == 2)           //下
                        {
                                zhong = ~zhong;
                                xia = ~xia;                               
                        }               
                }
                if(value2 >= 20)
                {
                        value2 = 0;                                
                        dt_shang_guan();  //电梯向上  做最后的判断是否还要继续向上
                        dt_xia_guan();          //电梯向下  做最后的判断是否还要继续向下

                }
        }       
}


/*************定时器0初始化程序***************/
void time_init()          
{
        EA   = 1;                   //开总中断
        TMOD = 0X01;          //定时器0、工作方式1
        ET0  = 1;                  //开定时器0中断
        TR0  = 1;                  //允许定时器0定时
}

/******************主程序**********************/          
void main()
{
        uchar i;
        P1 = 0x00;
        P0 = 0X00;           //单片机IO口初始化
        time_init();   //定时器初始化
        while(1)
        {
                key();                  //按键程序
                if(key_can < 20)
                {          
                        if(dt_s_x == 0)
                        {
                                value2 = 0;
                                flag_stop = 1;
                        }
                        key_with();               
                }  
                tiandi_shang_xia();          //当电梯不动时、判断是向上、还是向下
                P0 = smg_du[dt_value];          //显示
                if(flag_100ms  == 1)
                {
                        flag_100ms = 0;
                        td_dis();                 //电梯处理函数
                }
                if(flag_start == 1)
                {
                        for(i=0;i<4;i++)                    //4相
                        {
                                if(flag_z_f == 0)
                                {
                                        zheng(i);      //电机正转
                                }
                                else
                                {
                                        fan(i);        //电机反转
                                }
                                Delay(650);        //改变这个参数可以调整电机转速
                        }
                }

        }
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{       
        static uchar value;
        TH0 = 0x3c;
        TL0 = 0xb0;     // 50ms
        value ++;
        if(value % 2 == 0)
        {
                flag_100ms = 1 ;
        }
}
回复

使用道具 举报

ID:273674 发表于 2019-4-9 22:50 | 显示全部楼层
有大神帮忙看看嘛
回复

使用道具 举报

ID:96682 发表于 2019-4-9 23:47 | 显示全部楼层
LZ 使用那能正常仿真的 hex 文件不就行了么,显然这个 hex 文件不是直接从这个 C 文件生成的
回复

使用道具 举报

ID:52944 发表于 2019-4-10 10:34 | 显示全部楼层
这两个hex不是一个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表