電路原理圖如下:
word版.docx
(22.88 KB, 下載次數: 27)
2018-9-17 13:34 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
原理圖.doc
(524.5 KB, 下載次數: 34)
2018-9-17 13:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
0.jpg (59.99 KB, 下載次數: 17)
下載附件
2018-9-17 18:28 上傳
單片機源程序如下:
- #include <reg52.h> //調用單片機頭文件
- #define uchar unsigned char //無符號字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無符號整型 宏定義 變量范圍0~65535
- uchar code smg_du[]=
- {
- 0xEE,/*0*/
- 0xA0,/*1*/
- 0xCD,/*2*/
- 0xE9,/*3*/
- 0xA3,/*4*/
- 0x6B,/*5*/
- 0x6F,/*6*/
- 0xE0,/*7*/
- 0xEF,/*8*/
- 0xEB,/*9*/
- };
- bit flag_100ms,flag_1s;
- bit flag_stop = 1; //用做到了相應的樓停下
- sbit beep = P2^7;
- 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 led8 = P1^7; //8個發光二極管定義
- sbit led7 = P1^6;
- sbit led6 = P1^5;
- sbit led5 = P1^4;
- sbit led4 = P1^3;
- sbit led3 = P1^2;
- sbit led2 = P1^1;
- sbit led1 = P1^0;
- sbit dj1 = P2^6; //電機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 ; //電梯上下的標志位
- void Delay(unsigned int i)//延時
- {
- while(--i);
- }
- /***********************正轉****************************/
- void zheng(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;
- }
- }
- /***********************反轉****************************/
- void fan(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;
- }
- }
- /***********************1ms延時函數*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /********************獨立按鍵程序*****************/
- 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_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6+dt_7;
- 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; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 2) //當到了第二層的時候
- {
- if(dt_2 == 1)
- {
- led2 = 0; //關閉第二層發光二極管
- dt_2 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 3) //當到了第3層的時候
- {
- if(dt_3 == 1)
- {
- led3 = 0; //關閉第3層發光二極管
- dt_3 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 4) //當到了第4層的時候
- {
- if(dt_4 == 1)
- {
- led4 = 0; //關閉第4層發光二極管
- dt_4 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 5) //當到了第5層的時候
- {
- if(dt_5 == 1)
- {
- led5 = 0; //關閉第5層發光二極管
- dt_5 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 6) //當到了第6層的時候
- {
- if(dt_6 == 1)
- {
- led6 = 0; //關閉第6層發光二極管
- dt_6 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 7) //當到了第7層的時候
- {
- if(dt_7 == 1)
- {
- led7 = 0; //關閉第7層發光二極管
- dt_7 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- else if(dt_value == 8) //當到了第8層的時候
- {
- if(dt_8 == 1)
- {
- led8 = 0; //關閉第8層發光二極管
- dt_8 = 0; //清零電機在的標志
- flag_stop = 0; //到停下
- beep = 0; //打開蜂鳴器
- }
- }
- }
- }
- }
- }
- 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 >= 10) //1.0s
- {
- beep = 1; //關閉蜂鳴器
- }
- 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 ;
- }
- }
復制代碼
所有資料51hei提供下載:
程序.docx
(18.57 KB, 下載次數: 29)
2018-9-17 13:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|