久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2815|回復: 0
打印 上一主題 下一主題
收起左側

單片機交通燈詳細設計學習資料 Proteus仿真代碼等

[復制鏈接]
跳轉到指定樓層
樓主
ID:488648 發表于 2021-4-2 14:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
交通燈處在十字路口上。它有紅﹑黃﹑綠三種顏色的燈組成。紅燈亮時道路上的車輛停止運行;黃燈是一種過渡用的信號燈,當它亮時,表示道路上的紅綠色信號燈即將進行轉換。下面拿東西南北四個方向來說明。當東西方向允許行車(或者左轉)的時候,南北方向就禁止行車,即此時東西方向的綠燈亮紅燈滅,而南北方向的綠燈滅紅燈亮。反之當南北方向允許行車(或者左轉)的時候,東西方向就禁止行車,即此時南北方向的綠燈亮紅燈滅,而東西方向的綠燈滅紅燈亮。同時當有特殊的情況發生時,能手動控制各個方向的信號燈。設計任務就是將這一電路用單片機來實現具體的控制。交通燈以AT89S51單片機為設計核心,須掌握單片機的軟件設計及調試方法。
設計目的:
1、鞏固和加深對單片機原理和接口技術知識的理解;
2、培養根據課題需要選學參考書籍、查閱手冊和文獻資料的能力;
3、學會方案論證的比較方法,拓寬知識,初步掌握工程設計的基本方法;
4、掌握常用儀器、儀表的正確使用方法,學會軟、硬件的設計和調試方法;
5、能正確反映設計和實驗成果,能用計算機繪制電路圖和流程圖;
設計要求:
1、東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s;
2、本項目為典型的LED顯示和中斷定時電路。利用定時器T0產生每250us一次的中斷,每4000次中斷為1s;
3、對兩個方向分別顯示紅、綠、黃燈,并顯示相應的剩余時間。值得注意的是,A方向紅燈時間=B方向綠燈時間+黃燈緩沖時間;
4、時間可設置;
5、溫度顯示;
6、緊急控制;
7、黃燈時聲音提示行人車輛;
8、萬年歷顯示;
9、增加左轉彎方向燈;
四、單片機系統電路設計
4.1時鐘電路

時鐘電路用于產生MCS-51單片機工作時所必須的時鐘控制信號。其內部電路在時鐘信號控制下,嚴格地按時序執行指令進行工作。在執行指令時,CPU首先要到程序存儲器中取出需要執行的指令操作碼,然后譯碼,并由時序電路產生一系列控制信號去完成指令所規定操作。本設計采用12MHz晶振和兩個30PF瓷片電容,他們構成一個穩定的自激振蕩器。該電容的大小影響振蕩器頻率的高低、振蕩器的穩定性和起振的快速性。為單片機提供標準時鐘。其中兩個瓷片電容起微調作用。

4.1 時鐘電路圖

4.2復位電路

單片機在可靠的復位之后, 才會從 0000H地址開始有序的執行應用程序。同時,復位電路也是容易受到外部噪聲干擾的敏感部分之一。單片機必須保證系統可靠的進行復位,具有一定的抗干擾的能力。采用上電復位方式,RST管腳接低電平。為保證復位可靠,RC時間常數應大于兩個機器周期,電容取10uf,電阻取10K歐。


4.2 復位電路圖

4.3交通燈電路

根據前面的設計內容與原理分析,電路設計中應有控制模塊、顯示模塊本電路的設計,將發光二極管作為信號燈的材料。電源將采用5V的直流電源。東西兩個方向的綠燈是同時亮的,為了簡化電路可以讓這兩個燈接同一個引腳。同理,東西方向的黃燈、紅燈也可以分別接同一個引腳。南北方向同上。這樣我們可以用一個8位口控制16盞信號燈。 各信號燈均是共陽極接法,LED正極均接電源,負極通過保護電阻接單片機P1口。這樣單片機引腳的輸出一個低電平時,相應的信號燈就被點亮。路口上的四個分別是紅燈,黃燈,綠燈,左轉向燈。

4.3 交通燈電路圖

4.4倒計時顯示電路

采用74HC164實現數字的顯示,單片機IO口將段碼通過74HC164串入并出發送給數碼管,大大節約了IO口,74HC164 是高速硅門 CMOS 器件,與低功耗肖特基型 TTL (LSTTL) 器件的引腳兼容。74HC164是 8 位邊沿觸發式移位寄存器,串行輸入數據,然后并行輸出。數據通過兩個輸入端(DSA 或 DSB)之一串行輸入;任一輸入端可以用作高電平使能端,控制另一輸入端的數據輸入。兩個輸入端或者連接在一起,或者把不用的輸入端接高電平,不能懸空。 時鐘 (CP) 每次由低變高時,數據右移一位,輸入到 Q0,Q0是兩個數據輸入端(DSA 和 DSB)的邏輯與,它將上升時鐘沿之前保持一個建立時間的長度。主復位 (MR) 輸入端上的一個低電平將使其它所有輸入端都無效,同時非同步地清除寄存器,強制所有的輸出為低電平。

4.4 倒計時電路圖

4.5緊急按鍵控制

單片機采用循環查詢的方式識別按鍵是否被按下,緊急按鍵控制有5個部分,當URGENT按鍵按下時,南北,東西方向均為紅燈,此時此路口禁止通行,URGENT按鍵按下后通過其余四個按鍵分別控制只有南北方向允許通行,只有東西方向允許通行,只有南北方向允許左轉彎,,只有東西方向允許左轉彎等四個狀態。


4.5 緊急按鍵電路圖

4.6時間設置按鍵

單片機采用外部中斷方式識別時間設置按鍵是否被按下,兩個按鍵分別控制通行時間的增加和減小。每按下依次,通行時間會增加或減少一秒。

4.6 時間設置按鍵電路圖

4.7溫度傳感器電路

通過DS18B20實現隨溫度的測量,單片機讀取溫度值并顯示出來,DS18B20的讀寫時序和測溫原理與DS1820相同,只是得到的溫度值的位數因分辨率不同而不同,且溫度轉換時的延時時間由2s減為750ms。低溫度系數晶振的振蕩頻率受溫度影響很小,用于產生固定頻率的脈沖信號發送給計數器1。高溫度系數晶振隨溫度變化其振蕩頻率明顯改變,所產生的信號作為計數器2的脈沖輸入。計數器1和溫度寄存器被預置在-55℃所對應的一個基數值。計數器1對低溫度系數晶振產生的脈沖信號進行減法計數,當計數器1的預置值減到0時,溫度寄存器的值將加1,計數器1的預置將重新被裝入,計數器1重新開始對低溫度系數晶振產生的脈沖信號進行計數,如此循環直到計數器2計數到0時,停止溫度寄存器值的累加,此時溫度寄存器中的數值即為所測溫度。斜率累加器用于補償和修正測溫過程中的非線性,其輸出用于修正計數器1的預置值。

4.7 溫度傳感器電路圖

4.8溫度顯示電路
4.8 溫度顯示電路圖

4.9黃燈蜂鳴器提示

蜂鳴器選擇有源蜂鳴器,單片機IO經過驅動電路連接到蜂鳴器上,通過單片機IO口輸出高低電平控制蜂鳴器發出或者不發聲音,每當黃燈亮時,蜂鳴器用來提示行人和車輛。

4.9 蜂鳴器電路圖

4.10萬年歷顯示電路
4.10 萬年歷電路圖

4.11總體電路
4.11 總體電路圖


五、程序設計
5.1軟件設計方案

1、 為了使倒計時更為準確,使用定時器作為倒計時的基準時間,系統使用12M的晶振,定時器采用方式二,定時器設置為250us中斷一次。

2、 設置開機初始化狀態,東西方向為綠燈,南北方向為紅燈,然后開始正常工作。

3、 每個方向的通行時間各由兩位LED數碼顯示,通行時間可設置,綠燈向紅燈轉換前黃燈亮3秒鐘,并且有蜂鳴器提醒。

4、 數碼管使用靜態顯示加74HC164方式。

5.2程序流程圖
5.1 程序流程圖

5.3程序源碼
  1. #include <REGX51.H>
  2. unsigned int n=0;
  3. unsigned int second=0;
  4. unsigned int sec=0;
  5. unsigned int min=0;
  6. unsigned int hou=0;
  7. unsigned int day=0;
  8. unsigned int time_heng=80;                            //東西通行時間
  9. unsigned int time_zong=60;                            //南北通行時間
  10. unsigned int heng_left=5;       //東西左轉時間
  11. unsigned int shu_left=5;        //南北左轉時間
  12. sbit DAT1=P2^0;
  13. sbit CLK1=P2^1;
  14. sbit DAT2=P2^2;
  15. sbit CLK2=P2^3;
  16. #define DQ   P3_7
  17. unsigned char m;                                                             //溫度整數
  18. unsigned char s;                                                             //溫度小數
  19. int array[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
  20. void seg(unsigned int seg_num)
  21. {
  22.               unsigned int ten;
  23.               unsigned int unit;
  24.               int i,num;
  25.               ten=seg_num/10;
  26.               unit=seg_num%10;
  27.               num=array[unit]+0x80;
  28.               for(i=0;i<8;i++)
  29.               {
  30.                             CLK2=0;
  31.                             DAT2=num&0x01;
  32.                             CLK2=1;
  33.                             num>>=1;
  34.               }            
  35.               num=array[ten];
  36.               for(i=0;i<8;i++)
  37.               {
  38.                             CLK2=0;
  39.                             DAT2=num&0x01;
  40.                             CLK2=1;
  41.                             num>>=1;
  42.               }                           
  43. }
  44. void DaoJiShi_seg(unsigned int hen_num,unsigned int shu_num)
  45. {
  46.               unsigned int ten;
  47.               unsigned int unit;
  48.               int i,num;
  49.               ten=shu_num/10;
  50.               unit=shu_num%10;
  51.               num=array[unit];
  52.               for(i=0;i<8;i++)
  53.               {
  54.                             CLK1=0;
  55.                             DAT1=num&0x01;
  56.                             CLK1=1;
  57.                             num>>=1;
  58.               }            
  59.               num=array[ten];
  60.               for(i=0;i<8;i++)
  61.               {
  62.                             CLK1=0;
  63.                             DAT1=num&0x01;
  64.                             CLK1=1;
  65.                             num>>=1;
  66.               }
  67.               ten=hen_num/10;
  68.               unit=hen_num%10;
  69.               num=array[unit];
  70.               for(i=0;i<8;i++)
  71.               {
  72.                             CLK1=0;
  73.                             DAT1=num&0x01;
  74.                             CLK1=1;
  75.                             num>>=1;
  76.               }            
  77.               num=array[ten];
  78.               for(i=0;i<8;i++)
  79.               {
  80.                             CLK1=0;
  81.                             DAT1=num&0x01;
  82.                             CLK1=1;
  83.                             num>>=1;
  84.               }                           
  85. }
  86. void Disp(unsigned int seg_m,unsigned int seg_s)
  87. {
  88.               unsigned int ten;
  89.               unsigned int unit;
  90.               ten=seg_s/10;
  91.               unit=seg_s%10;
  92.               SBUF=array[unit];
  93.               while(TI==0);
  94.               TI=0;
  95.               SBUF=array[ten];
  96.               while(TI==0);
  97.               TI=0;
  98.               ten=seg_m/10;
  99.               unit=seg_m%10;
  100.               SBUF=array[unit]+0x80;
  101.               while(TI==0);
  102.               TI=0;
  103.               SBUF=array[ten];
  104.               while(TI==0);
  105.               TI=0;            
  106. }
  107. void Delay_DS18B20(int num)
  108. {
  109.   while(num--) ;
  110. }
  111. void Init_DS18B20(void)
  112. {
  113.   unsigned char x=0;
  114.   DQ = 1;        
  115.   Delay_DS18B20(8);   
  116.   DQ = 0;        
  117.   Delay_DS18B20(80);  
  118.   DQ = 1;        
  119.   Delay_DS18B20(14);
  120.   x = DQ;         
  121.   Delay_DS18B20(20);
  122. }
  123. unsigned char ReadOneChar(void)
  124. {
  125.   unsigned char i=0;
  126.   unsigned char dat = 0;
  127.   for (i=8;i>0;i--)
  128.   {
  129.     DQ = 0;   
  130.     dat>>=1;
  131. DQ = 1;   
  132.     if(DQ)
  133.     dat|=0x80;
  134.     Delay_DS18B20(4);
  135.   }
  136.   return(dat);
  137. }
  138. void WriteOneChar(unsigned char dat)
  139. {
  140.   unsigned char i=0;
  141.   for (i=8; i>0; i--)
  142.   {
  143.     DQ = 0;
  144.     DQ = dat&0x01;
  145.     Delay_DS18B20(5);
  146.     DQ = 1;
  147.     dat>>=1;
  148.   }
  149. }
  150. unsigned int ReadTemperature(void)
  151. {
  152.   unsigned char a=0;
  153.   unsigned char b=0;
  154.   unsigned int t=0;
  155.   float tt=0;
  156.   Init_DS18B20();
  157.   WriteOneChar(0xCC);
  158.   WriteOneChar(0x44);
  159.   Init_DS18B20();
  160.   WriteOneChar(0xCC);
  161.   WriteOneChar(0xBE);
  162.   a=ReadOneChar();   
  163.   b=ReadOneChar();   
  164.   t=b;                                                         
  165.   t<<=8;                                            
  166.   t=t|a;                                            
  167.   tt=t*0.0625;                              
  168.   t= tt*10+0.5;      
  169.   return(t);                              
  170. }
  171. void check_wendu(void)
  172. {
  173.               unsigned int a,b,c;
  174.               c=ReadTemperature();                                               
  175.               a=c/100;                                                                                       
  176.               b=c/10-a*10;                                                                        
  177.               m=c/10;                                                                                         
  178.               s=c-a*100-b*10;                                                               
  179.               if(m<0){m=0;n=0;}                                                         
  180.               if(m>99){m=99;n=9;}                                                              
  181. }

  182. void main()
  183. {
  184.               P3_4=0;
  185.               SCON=0x00;

  186.               TMOD=0x02;
  187.               TH0=256-250;
  188.               TL0=256-250;
  189.               ET0=1;

  190.               IT0=1;
  191.               EX0=1;
  192.               IT1=1;
  193.               EX1=1;

  194.               EA=1;
  195.               TR0=1;
  196.               P1=0xF3;
  197.               P2_5=1;
  198.               P2_6=1;
  199.               P2_7=1;
  200.               P3_6=1;
  201.               while(1)
  202.               {
  203.                             Loop:
  204.                             if(P2_4==1){TR0=1;}
  205.                             if(P2_4==0)
  206.                             {
  207.                                           TR0=0;
  208.                                           P1=0xF6;
  209.                                           RECEIVED:
  210.                                           if(P2_5==0){P1=0xF3;goto RECEIVED;}
  211.                                           if(P2_6==0){P1=0xDE;goto RECEIVED;}
  212.                                           if(P2_7==0){P1=0xB7;goto RECEIVED;}
  213.                                           if(P3_6==0){P1=0x7E;goto RECEIVED;}
  214.                                           goto Loop;
  215.                             }
  216.                             if(n>=4000)
  217.                             {
  218.                                           n=0;
  219.                                           second++;
  220.                                           sec++;
  221.                                           if(second<time_heng)                                                                                                               {DaoJiShi_seg(time_heng-second,time_heng+3+heng_left+3-second); seg(sec);seg(min);seg(hou);seg(day);}
  222.                                           if(second>=time_heng&&second<time_heng+3)                                                            {DaoJiShi_seg(time_heng+3-second,time_heng+3+heng_left+3-second);seg(sec);seg(min);seg(hou);seg(day);}
  223.                                           if(second>=time_heng+3&&second<time_heng+3+heng_left)                                                                               {DaoJiShi_seg(time_heng+3+heng_left-second,time_heng+3+heng_left+3-second);seg(sec);seg(min);seg(hou);seg(day);}
  224.                                           if(second>=time_heng+3+heng_left&&second<time_heng+3+heng_left+3)                                    {DaoJiShi_seg(time_heng+3+heng_left+3-second,time_heng+3+heng_left+3-second);seg(sec);seg(min);seg(hou);seg(day);}
  225.                                           if(second>=time_heng+3+heng_left+3&&second<time_heng+3+heng_left+3+time_zong)                                                       {DaoJiShi_seg(time_heng+3+heng_left+3+time_zong+3+shu_left+3-second,time_heng+3+heng_left+3+time_zong-second);seg(sec);seg(min);seg(hou);seg(day);}
  226.                                           if(second>=time_heng+3+heng_left+3+time_zong&&second<time_heng+3+heng_left+3+time_zong+3)            {DaoJiShi_seg(time_heng+3+heng_left+3+time_zong+3+shu_left+3-second,time_heng+3+heng_left+3+time_zong+3-second);seg(sec);seg(min);seg(hou);seg(day);}
  227.                                           if(second>=time_heng+3+heng_left+3+time_zong+3&&second<time_heng+3+heng_left+3+time_zong+3+shu_left) {DaoJiShi_seg(time_heng+3+heng_left+3+time_zong+3+shu_left+3-second,time_heng+3+heng_left+3+time_zong+3+shu_left-second);seg(sec);seg(min);seg(hou);seg(day);}
  228.                                           if(second>=time_heng+3+heng_left+3+time_zong+3+shu_left)                                             {DaoJiShi_seg(time_heng+3+heng_left+3+time_zong+3+shu_left+3-second,time_heng+3+heng_left+3+time_zong+3+shu_left+3-second);seg(sec);seg(min);seg(hou);seg(day);}
  229.                                           check_wendu();
  230.                                           Disp(m,s);
  231.                             }
  232.                             if(second==time_heng)                                      {P1=0xF5;P3_4=1;}
  233.                             if(second==time_heng+3)                                    {P1=0xB7;P3_4=0;}
  234.                             if(second==time_heng+3+heng_left)                          {P1=0xF5;P3_4=1;}
  235.                             if(second==time_heng+3+heng_left+3)                        {P1=0xDE;P3_4=0;}
  236.                             if(second==time_heng+3+heng_left+3+time_zong)              {P1=0xEE;P3_4=1;}
  237.                             if(second==time_heng+3+heng_left+3+time_zong+3)            {P1=0x7E;P3_4=0;}
  238.                             if(second==time_heng+3+heng_left+3+time_zong+3+shu_left)   {P1=0xEE;P3_4=1;}
  239.                             if(second==time_heng+3+heng_left+3+time_zong+3+shu_left+3) {second=0;P1=0xF3;P3_4=0;}
  240.                             if(sec==60)                                                             {sec=0;min++;}
  241.                             if(min==60)                                                                                                                                                                           {min=0;hou++;}
  242.                             if(hou==24)                                                                                                                                                                           {hou=0;day++;}
  243.                             if(day==30)                                                                                                                                                                           {day=0;}
  244.               }
  245. }
  246. void t0() interrupt 1
  247. {
  248.               n++;            
  249. }
  250. void int0() interrupt 0
  251. {
  252. EX0=0;
  253. time_heng++;
  254. time_zong++;
  255. EX0=1;            
  256. }
  257. void int1() interrupt 2
  258. {
  259. EX1=0;
  260. time_heng--;
  261. time_zong--;            
  262. EX1=1;
  263. }
復制代碼


六、仿真結果
6.1 仿真結果圖


七、實際電路
7.1 實際電路圖

全部資料51hei下載地址:
仿真程序.7z (5.02 MB, 下載次數: 25)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九亚洲| 免费视频成人国产精品网站 | 欧美色a v | 日韩电影中文字幕 | 久久久久资源 | 九九综合 | 精品99爱视频在线观看 | 亚洲日本免费 | 91精品国产91久久久久久密臀 | 国产日屁| 日韩成人在线看 | 亚洲精品电影在线观看 | 综合精品 | 91久久精品一区二区二区 | 欧美一区二区三区电影 | 久久成人精品视频 | 中文字幕在线视频免费视频 | 成人网视频 | 亚洲不卡在线观看 | 成人国产精品免费观看 | h片在线免费看 | 精品国产不卡一区二区三区 | 亚洲国产精品日韩av不卡在线 | 99热精品在线观看 | 国产黄色麻豆视频 | av免费网址 | 久久久久久久综合 | 九色视频网| 性高湖久久久久久久久3小时 | 成人免费视频观看 | 亚洲一区二区三区在线 | 成人3d动漫一区二区三区91 | 成人亚洲在线 | 亚洲精品久久久蜜桃网站 | 一级毛片网 | 成人在线小视频 | avtt国产| 欧美成人h版在线观看 | 国产欧美日韩一区 | 国产精品成人品 | 91久久夜色 |