![]() |
發布時間: 2019-4-9 15:05
正文摘要:從論壇下載的一個8層電梯的,從仿真文件夾里的hex.可以仿真數碼管正常顯示,但是從程序.C文件生成的hex.文件仿真數碼管就亂碼或者不顯示 求大神幫忙,急!! |
這兩個hex不是一個 |
LZ 使用那能正常仿真的 hex 文件不就行了么,顯然這個 hex 文件不是直接從這個 C 文件生成的 |
有大神幫忙看看嘛 |
#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 ; } } |