找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2103|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)模擬電梯運(yùn)行的源程序 帶詳細(xì)注釋

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1060226 發(fā)表于 2023-1-4 11:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include <reg51.h>                 //調(diào)用單片機(jī)頭文件
#define uchar unsigned char  //無符號(hào)字符型 宏定義        變量范圍0~255
#define uint  unsigned int         //無符號(hào)整型 宏定義        變量范圍0~65535


//數(shù)碼管段選定義 0     1    2    3           4           5        6         7          8           9        
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
//                                           A        B         C          D           E   F        不顯示
                                         0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};         //斷碼        

uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

bit flag_100ms,flag_1s;        
bit flag_stop = 1;   //用做到了相應(yīng)的樓停下

sbit beep  = P3^7;
sbit xia   = P3^6;
sbit zhong = P3^5;
sbit shang = P3^4;

uchar value2;



sbit led1 = P0^0;          //8個(gè)發(fā)光二極管定義
sbit led2 = P0^1;
sbit led3 = P0^2;
sbit led4 = P0^3;
sbit led5 = P0^4;
sbit led6 = P0^5;
sbit led7 = P0^6;
sbit led8 = P0^7;

uchar dt_1;  //1樓電梯標(biāo)志位
uchar dt_2;  //2樓電梯標(biāo)志位
uchar dt_3;  //3樓電梯標(biāo)志位
uchar dt_4;  //4樓電梯標(biāo)志位
uchar dt_5;  //5樓電梯標(biāo)志位
uchar dt_6;  //6樓電梯標(biāo)志位
uchar dt_7;  //7樓電梯標(biāo)志位
uchar dt_8;  //8樓電梯標(biāo)志位

uchar dt_value = 1;  //電梯到哪一層的變量
uchar dt_s_x ;    //電梯上下的標(biāo)志位

/****************獨(dú)立按鍵處理函數(shù)************************/           

#define key_io P2
uchar key_can;

void key()
{
        static uchar key_new = 0,key_old = 0,key_value = 0;
        key_io = 0xff;
        if(key_new == 0)                 //按鍵松開
        {
                if((key_io & 0xff) == 0xff)
                        key_value ++;
                else
                        key_value = 0;
                if(key_value >= 5)         //按鍵松開松手檢測(cè)
                {
                        key_value = 0;
                        key_new = 1;        //按鍵松開后進(jìn)入等待按鍵狀態(tài)
                }
        }
        else
        {
                if((key_io & 0xff) != 0xff)         //按鍵按下
                        key_value ++;
                else
                        key_value =0;
                if(key_value >= 5)        //按鍵按下消抖
                {
                        key_value = 0;
                        key_new = 0;           //按鍵松開后進(jìn)入等待松開按鍵狀態(tài)
                }
        }
        key_can = 20;
        if((key_new == 0) && (key_old == 1))
        {
                switch(key_io)
                {
                        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;          //得到按鍵值
                }
//                dis_smg[0] = smg_du[key_can];
        }                        
        key_old = key_new;         
}

void key_with()
{
        if(key_can == 1)
        {
                led1 = 0;         //點(diǎn)亮發(fā)光二極管
                dt_1 = 1;         //
        }               
        if(key_can == 2)
        {
                led2 = 0;         //點(diǎn)亮發(fā)光二極管
                dt_2 = 1;
        }        
        if(key_can == 3)
        {
                led3 = 0;        //點(diǎn)亮發(fā)光二極管
                dt_3 = 1;
        }        
        if(key_can == 4)
        {
                led4 = 0;        //點(diǎn)亮發(fā)光二極管
                dt_4 = 1;
        }        
        if(key_can == 5)
        {
                led5 = 0;        //點(diǎn)亮發(fā)光二極管
                dt_5 = 1;
        }        
        if(key_can == 6)
        {
                led6 = 0;        //點(diǎn)亮發(fā)光二極管
                dt_6 = 1;
        }        
        if(key_can == 7)
        {
                led7 = 0;        
                dt_7 = 1;
        }        
        if(key_can == 8)
        {
                led8 = 0;        
                dt_8 = 1;
        }        
}
/*********************當(dāng)電梯不動(dòng)時(shí)、判斷是向上、還是向下**********************/
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)         //電梯在第5層停下不走了
                {
                        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)         //電梯在第5層停下不走了
                {
                        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)          //電梯在第5層停下不走了
                {
                        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;                                         
                        }        
                }        
        }
}

/****************電梯向上、做最后的判斷是否還要繼續(xù)向上****************/
void dt_shang_guan()
{
        uchar value;
        if(dt_s_x == 1)    //電梯向上  做最后的判斷是否還要繼續(xù)向上
        {
                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;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                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;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;        
                }               
                else if(dt_value == 3)        //在第3層
                {
                        value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                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;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                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;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;               
                }               
                else if(dt_value == 6)        //在第6層
                {
                        value = dt_7 + dt_8;
                        if(value == 0)         //說明上面沒有人按下
            {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                        
                }        
                else if(dt_value == 7)        //在第7層
                {
                        value = dt_8;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                shang = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;        
                }               
                else if(dt_value == 8)        //在第8層
                {
                        dt_s_x = 0;  //電梯停下不動(dòng)了
                        shang = 1;                //關(guān)閉上字
                        zhong = 1;         
                }               
        }        
}

/****************電梯向下、做最后的判斷是否還要繼續(xù)向下****************/
void dt_xia_guan()
{
        uchar value;
        if(dt_s_x == 2)    //電梯向下  做最后的判斷是否還要繼續(xù)向下
        {
                if(dt_value == 1)        //在第1層
                {
                        dt_s_x = 0;  //電梯停下不動(dòng)了
                        xia = 1;                //關(guān)閉上字
                        zhong = 1;         
                        flag_stop = 1;        
                }               
                else if(dt_value == 2)        //在第2層
                {
                        value = dt_1;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;        
                }               
                else if(dt_value == 3)        //在第3層
                {
                        value = dt_1 + dt_2;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;                                          
                        }else
                                flag_stop = 1;         
                }               
                else if(dt_value == 4)        //在第4層
                {
                        value = dt_1 + dt_2 + dt_3;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                 
                }               
                else if(dt_value == 5)        //在第5層
                {
                        value = dt_1 + dt_2 + dt_3 + dt_4;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                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;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;                        
                }        
                else if(dt_value == 7)        //在第7層
                {
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;        
                }               
                else if(dt_value == 8)        //在第8層
                {
                        value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7;
                        if(value == 0)         //說明上面沒有人按下
                        {
                                dt_s_x = 0;  //電梯停下不動(dòng)了  
                                xia = 1;                //關(guān)閉上字
                                zhong = 1;  
                        }else
                                flag_stop = 1;        

                        
                }               
        }               
}

/***********************電梯處理函數(shù)************************/
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)        //到相應(yīng)的樓了  要停下
                {
/***************************向上走電梯***********************************/        
                        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)           //當(dāng)?shù)搅说谝粚拥臅r(shí)候
                                        {
                                                if(dt_1 == 1)
                                                {
                                                        led1 = 1;                 //關(guān)閉第一層發(fā)光二極管
                                                        dt_1 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 2)           //當(dāng)?shù)搅说诙䦟拥臅r(shí)候
                                        {
                                                if(dt_2 == 1)
                                                {
                                                        led2 = 1;                 //關(guān)閉第二層發(fā)光二極管
                                                        dt_2 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 3)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_3 == 1)
                                                {
                                                        led3 = 1;                 //關(guān)閉第3層發(fā)光二極管
                                                        dt_3 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 4)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_4 == 1)
                                                {
                                                        led4 = 1;                 //關(guān)閉第4層發(fā)光二極管
                                                        dt_4 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 5)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_5 == 1)
                                                {
                                                        led5 = 1;                 //關(guān)閉第5層發(fā)光二極管
                                                        dt_5 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 6)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_6 == 1)
                                                {
                                                        led6 = 1;                 //關(guān)閉第6層發(fā)光二極管
                                                        dt_6 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 7)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_7 == 1)
                                                {
                                                        led7 = 1;                 //關(guān)閉第7層發(fā)光二極管
                                                        dt_7 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                        else if(dt_value == 8)           //當(dāng)?shù)搅说?層的時(shí)候
                                        {
                                                if(dt_8 == 1)
                                                {
                                                        led8 = 1;                 //關(guān)閉第8層發(fā)光二極管
                                                        dt_8 = 0;        //清零電機(jī)在的標(biāo)志
                                                        flag_stop = 0;   //到停下
                                                        beep = 0;        //打開蜂鳴器
                                                }                                 
                                        }
                                }
                        }               
                }                                                
        }
        if(flag_stop == 0)
        {
//                        flag_stop = 1;        
//                        value1 = 0;
                value2 ++;
                if(value2 % 3 == 0)
                {
                        if(dt_s_x == 1)           //上
                        {
                                shang = ~shang;
                                zhong = ~zhong;                                
                        }
                        if(dt_s_x == 2)           //下
                        {
                                zhong = ~zhong;
                                xia = ~xia;                                
                        }               
                }
                if(value2 >= 10) //1.0s
                {                        
                        beep = 1;  //關(guān)閉蜂鳴器
                }
                if(value2 >= 20)
                {
                        value2 = 0;                                 
                        dt_shang_guan();  //電梯向上  做最后的判斷是否還要繼續(xù)向上
                        dt_xia_guan();          //電梯向下  做最后的判斷是否還要繼續(xù)向下

                }
        }        
}


/*************定時(shí)器0初始化程序***************/
void time_init()         
{
        EA   = 1;                   //開總中斷
        TMOD = 0X01;          //定時(shí)器0、工作方式1
        ET0  = 1;                  //開定時(shí)器0中斷
        TR0  = 1;                  //允許定時(shí)器0定時(shí)
}

/******************主程序**********************/           
void main()
{
        dis_smg[0] = smg_du[1];        
        time_init();
        while(1)
        {
                key();                  //按鍵程序
                if(key_can < 20)
                {         
                        if(dt_s_x == 0)
                        {
                                value2 = 0;
                                flag_stop = 1;
                        }
                        key_with();               
                }  
                tiandi_shang_xia();          //當(dāng)電梯不動(dòng)時(shí)、判斷是向上、還是向下
                dis_smg[0] = smg_du[dt_value];          //顯示
                P1 = ~dis_smg[0];
                if(flag_100ms  == 1)
                {
                        flag_100ms = 0;
                        td_dis();                 //電梯處理函數(shù)
                }
        }
}

/*************定時(shí)器0中斷服務(wù)程序***************/
void time0_int() interrupt 1
{        
        static uchar value;
        TH0 = 0x3c;
        TL0 = 0xb0;     // 50ms
        value ++;
        if(value % 4 == 0)
        {
                flag_100ms = 1 ;
        }
}

屏幕截圖 2023-01-04 111759.png (119.07 KB, 下載次數(shù): 83)

原理圖

原理圖

模擬電梯keil程序.7z

21.34 KB, 下載次數(shù): 16, 下載積分: 黑幣 -5

keil程序

電梯文檔.doc

280.65 KB, 下載次數(shù): 12, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1149940 發(fā)表于 2025-5-10 14:43 | 只看該作者
可以再發(fā)一份嗎
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表