標(biāo)題: 基于單片機(jī)交通顯示系統(tǒng)源代碼與Proteus仿真 [打印本頁]

作者: 柴新宇    時(shí)間: 2020-12-30 22:51
標(biāo)題: 基于單片機(jī)交通顯示系統(tǒng)源代碼與Proteus仿真
由單片機(jī),交通燈狀態(tài)顯示系統(tǒng)、LED數(shù)碼顯示系統(tǒng)等幾大部分組成。系統(tǒng)除基本的交通燈功能外,還具有倒計(jì)時(shí)、緊急情況處理等功能,較好的模擬實(shí)現(xiàn)了十字路口可能出現(xiàn)的狀況。
本系統(tǒng)采用單片機(jī)C語言編寫,主要編寫了主程序,LED數(shù)碼管顯示程序等?傮w上完成了軟件的編寫。

交通顯示系統(tǒng)
1.
  設(shè)計(jì)要求

(2)信號燈分綠燈,紅燈,黃燈,每次綠燈換紅燈時(shí),黃燈亮3秒。

(3)東西干道和南北干道交替控制,每次干道綠燈交替時(shí),有3秒鐘所有干道的交通燈都是黃燈閃爍3秒鐘,提示已經(jīng)進(jìn)入路口的車輛迅速通過。

(4)當(dāng)遇到突發(fā)狀況時(shí),各個(gè)方向靜止通行,顯示紅燈,并維持5秒倒計(jì)時(shí)。

2.分析

(1)分析目前交通路口的基本控制技術(shù)以及各種通行方案,并以此為基礎(chǔ)提出自己的交通控制的初步方案。

(2)及系統(tǒng)應(yīng)擁有的各項(xiàng)功能,在這里,本設(shè)計(jì)除了有信號燈狀態(tài)控制能實(shí)現(xiàn)基本的交通功能,還增加了倒計(jì)時(shí)顯示提示。

(3)進(jìn)行顯示電路,燈狀態(tài)電路,按鍵電路的設(shè)計(jì)和各器件的選擇及連接,大體分配各個(gè)器件及模塊的基本功能要求。

(4)進(jìn)行軟件系統(tǒng)的設(shè)計(jì),對于本系統(tǒng),本人采用C語言編寫,對單片機(jī)內(nèi)部結(jié)構(gòu)和工作情況做了充足的研究,了解定時(shí)器,中斷以及延時(shí)原理,總體上完成了軟件的設(shè)計(jì)。

圖1系統(tǒng)框圖
3. 硬件設(shè)計(jì)分析
3.1單片機(jī)選型:AT89C51

與MCS-51單片機(jī)產(chǎn)品兼容,8k字節(jié)在系統(tǒng)可編程Flash存儲(chǔ)器,1000次可檫寫周期,全靜態(tài)操作:0Hz~33Hz,三級加密程序存儲(chǔ)器,32個(gè)可編程I/O口線,三個(gè)16位定時(shí)器/計(jì)數(shù)器八個(gè)中斷源、全雙工UART串行通道、低功耗空閑和掉電模式、掉電后中斷可喚醒、看門狗定時(shí)器、雙數(shù)據(jù)指針、掉電標(biāo)識符。

當(dāng)8051的ALE及/PSEN兩引腳輸出高電平,RST引腳高電平到時(shí),單片機(jī)復(fù)位。RST/VPD端的高電平,若直接由啟動(dòng)瞬間產(chǎn)生,則為啟動(dòng)復(fù)位,若通過按動(dòng)按鈕產(chǎn)生高電平復(fù)位稱手動(dòng)復(fù)位。圖中,上電時(shí),接通電源,電容器C相當(dāng)于瞬間短路,+5V加到了RST/VPD端,該高電平使8051全機(jī)復(fù)位。若運(yùn)行過程中,需要程序從頭執(zhí)行,只需按動(dòng)按鈕S,則直接把+5V加到了RST/VPD端,從而復(fù)位。顯然,該電路即可以上電復(fù)位,也可以手動(dòng)復(fù)位,是常用復(fù)位電路之一[5]。

3.3數(shù)碼管顯示
圖4數(shù)碼管顯示

此處采用的數(shù)碼管時(shí)共陰極數(shù)碼管,G、F、E、D、C、B、A七個(gè)端口是輸入端口,對其各位進(jìn)行賦值,置位則亮,復(fù)位則滅,用此來顯示出相應(yīng)的數(shù)字;1、2兩端用來控制高位和低位的選通顯示,只要對端口置位,便可以選擇該端口,并對其所代表的位進(jìn)行賦值,顯示。正常通行狀況下,數(shù)碼管從30秒開始倒計(jì)時(shí),各個(gè)方向,對應(yīng)點(diǎn)亮紅綠黃燈。遇到突發(fā)狀況,數(shù)碼管從5秒開始倒計(jì)時(shí),各方向禁止通行,點(diǎn)亮紅燈。

3.4紅綠燈顯示
圖5紅綠燈顯示

每個(gè)路口都采用了3個(gè)LED燈來顯示,分別代表紅綠黃三種燈,來模擬路口交通的變換。其中D7和D8表示轉(zhuǎn)彎模塊[6]。

以南北方向舉例,正常狀況下,從30秒開始倒計(jì)時(shí),南北方向可直行,即綠燈(D6)亮起,東西方向禁止通行,亮紅燈(D2)。當(dāng)顯示至15秒時(shí),南北方向可直行和轉(zhuǎn)彎,即兩個(gè)綠燈(D6和D7)亮起,東西方向禁止通行,亮紅燈(D2)。當(dāng)顯示至3秒時(shí),通知車輛快速通過,南北黃燈(D5)閃爍,東西方向禁止通行,亮紅燈(D2)。

3.5鍵盤:獨(dú)立鍵盤+中斷
圖6獨(dú)立鍵盤+中斷

采用開關(guān)來控制進(jìn)入中斷,可以在路口出現(xiàn)緊急情況時(shí),拉動(dòng)開關(guān)。使紅綠燈發(fā)生相應(yīng)的改變,已處理緊急情況下車輛通行。

當(dāng)發(fā)生突發(fā)情況時(shí),如救護(hù)車通過,接通上面的按鍵,各個(gè)方向中止當(dāng)前狀態(tài),即禁止通行,各個(gè)方向點(diǎn)亮紅燈,并維持5秒倒計(jì)時(shí)。當(dāng)結(jié)束5秒倒計(jì)時(shí),各個(gè)方向恢復(fù)到中止前的狀態(tài)。





3.6系統(tǒng)原理圖
圖7總電路圖
4. 軟件設(shè)計(jì)
4.1總體流程
圖8流程圖





4.2循環(huán)流程控制思路
圖9流程控制圖
  仿真分析
5.1正常運(yùn)行狀態(tài)
圖10正常運(yùn)行狀態(tài)














5.2左右行顯示
圖11左右行顯示
5.3黃燈閃爍顯示
圖12黃燈閃爍顯示

單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #defineuintunsignedint
  4. #defineucharunsignedchar
  5. uchartemp,aa,nn;
  6. sbitrn=P2^0;              //南北紅燈
  7. sbitnb=P2^1;              //南北黃燈
  8. sbitgn=P2^2;              //南北綠燈
  9. sbitrw=P2^3;              //東西方向紅燈
  10. sbitdx=P2^4;              //東西方向黃燈
  11. sbitgw=P2^5;              //東西方向綠燈
  12. sbitshi=P3^6;              //十位
  13. sbitge=P3^7;//個(gè)位
  14. bitflag=0;
  15. ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,
  16. 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
  17. 0x79,0x71};/*將數(shù)字0123456789的16進(jìn)制數(shù)定義成數(shù)組用以顯示*/
  18. voiddelay(uintz);//延遲
  19. voiddisp(uintn);
  20. voidnb_flash(void);
  21. voiddx_flash(void);
  22. voidxint0();
  23. voidtimer0();
  24. voidLED_ON();
  25. voidxint1();
  26. voidnanbei();
  27. voiddongxi();/*將所使用的子函數(shù)定義*/
  28. voidmain()
  29. {
  30. uintnum;
  31. num=0;
  32. aa=0;
  33. TMOD=0x01;                                          //方式116位定時(shí)器
  34. TH0=(65536-50000)/256;//定義裝入定時(shí)器高8位的時(shí)間常數(shù)                                         
  35. TL0=(65536-50000)%256;//定義裝入定時(shí)器低8位的時(shí)間常數(shù)                                                                                                                                                         
  36. EA=1;                                                        //開關(guān)總中斷
  37. ET0=1;                                                        //允許定時(shí)器T0中斷
  38. TR0=1;                                                        //打開定時(shí)器T0
  39. EX0=1;                                                        //允許外部中斷0中斷
  40. IT0=0;                                                        //禁止T0溢出中斷
  41. EX1=1;                                                        //允許外部中斷1中斷
  42. IT1=1;/*中斷初始化*/              //允許T1溢出
  43. while(1)
  44. {
  45. nanbei();
  46. nb_flash();
  47. dongxi();
  48. }
  49. }
  50. voiddelay(uintz)                                                                      //延遲
  51. {uintx,y;
  52. for(x=z;x>0;x--)
  53. for(y=110;y>0;y--);
  54. }
  55. voidtimer0()interrupt1
  56. {
  57. TH0=(65536-50000)/256;
  58. TL0=(65536-50000)%256;
  59. aa++;
  60. if(aa==9)
  61. {
  62. aa=0;
  63. flag=1;
  64. }
  65. }
  66. voiddisp(uintn)/*顯示子函數(shù)*/
  67. {
  68. while(!flag)              //flag=0
  69. {
  70. ge=0;
  71. P0=table[n%10];
  72. delay(50);
  73. shi=1;
  74. ge=1;
  75. shi=0;
  76. P0=table[n/10];
  77. delay(50);
  78. shi=1;
  79. ge=1;
  80. }
  81. if(flag==1)
  82. flag=0;
  83. }
  84. voidnanbei()/*南北方向的紅綠燈和數(shù)碼管顯示子函數(shù)*/
  85. {
  86. uintnum;
  87. num=30;
  88.               disp(num);
  89. while(num<=30&&num>15)
  90. {
  91. num--;
  92. P2=0xf3;
  93. disp(num);
  94. }
  95. while(num<=15&&num>4)/*南北方向及轉(zhuǎn)彎的紅綠燈和數(shù)碼管顯示子函數(shù)*/
  96. {
  97. num--;
  98. P2=0xb3;
  99. disp(num);
  100. }
  101. }
  102. voidnb_flash(void)/*南北方向的黃燈和數(shù)碼管顯示子函數(shù)*/
  103. {
  104. uinta;
  105. for(a=3;a>0;a--)
  106. {
  107. P2=0xf5;
  108. nb=1;                            //
  109. delay(100);
  110. nb=0;                            //
  111. disp(a);
  112. }
  113. }
  114. voiddongxi()/*東西方向的紅綠燈和數(shù)碼管顯示子函數(shù)*/
  115. {
  116. uintnum;
  117. num=30;
  118. while(num<=30&&num>15)
  119. {
  120. P2=0xde;
  121.               disp(num);
  122. num--;
  123. }
  124. while(num<=15&&num>3)/*東西方向及轉(zhuǎn)彎的紅綠燈和數(shù)碼管顯示子函數(shù)*/
  125. {
  126. num--;
  127. P2=0x5e;
  128. disp(num);
  129. }
  130. while(num<=3&&num>0)/*東西方向的黃燈和數(shù)碼管顯示子函數(shù)*/
  131. {
  132. P2=0xee;
  133. dx=1;                            //
  134. delay(100);
  135. dx=0;                                          //
  136. disp(num);
  137. num--;
  138. }
  139. }
  140. voidxint0()interrupt2/*中斷定義*/
  141. {
  142. TH0=(65536-50000)/256;
  143. TL0=(65536-50000)%256;
  144. LED_ON();                                          //
  145. }
  146. voidLED_ON()                            //中斷2全紅燈
  147. {
  148. uintb;
  149. rn=0;                                          //南北紅
  150. rw=0;                                          //東西紅
  151. gn=1;                                          //南北綠
  152. gw=1;                                          //東西綠
  153. nb=1;                                          //南北黃
  154. dx=1;                                          //東西黃
  155. for(b=5;b>0;b--)
  156. {
  157. ge=0;
  158. shi=1;
  159. P0=table[b];
  160. delay(1000);
  161. ge=1;
  162. shi=1;
  163. }
  164. return;
  165. }
復(fù)制代碼

全部資料51hei下載地址:
基于單片機(jī)交通顯示系統(tǒng)的設(shè)計(jì)與仿真.zip (522.66 KB, 下載次數(shù): 11)





歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1