找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機交通燈proteus仿真和代碼(適用于課程設計)

[復制鏈接]
跳轉到指定樓層
樓主
ID:404878 發(fā)表于 2018-11-22 17:10 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
(分享設計)通過定時器計數,數碼管顯示倒計時,led燈顯示通行狀態(tài)。按鍵1功能是在緊急車輛通過時,按下開關,使四個方向均為紅燈,放行20S。按鍵2可改變紅綠燈的狀態(tài)。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  1. /*****************************************************
  2.        十字路口交通燈控制 C 程序

  3. ******************************************************/
  4. #include        <reg52.h>
  5. #define        uchar        unsigned char
  6. #define        uint        unsigned int
  7. /*****定義控制位**********************/
  8. //東西方向交通燈
  9. sbit        EW_LED2=P2^3;        //EW_LED2控制位
  10. sbit        EW_LED1=P2^2;        //EW_LED1控制位
  11. //南北方向交通燈
  12. sbit        SN_LED2=P2^1;        //SN_LED2控制位
  13. sbit        SN_LED1=P2^0;        //SN_LED1控制位

  14. sbit    SN_Yellow=P1^6;//SN黃燈
  15. sbit    EW_Yellow=P1^2;//EW黃燈

  16. bit     Flag_SN_Yellow; //SN黃燈標志位
  17. bit     Flag_EW_Yellow;//EW黃燈標志位
  18. uchar   flag_EW=0;//EW方向交通管制標志位
  19. uchar   flag_SN=0;//SN方向交通管制標志位
  20. int        Time_EW;//東西方向倒計時單元
  21. int        Time_SN;//南北方向倒計時單元
  22. static uchar count;           //計數用的變量
  23. uchar a,b,c,d,e,f,g;   //保護斷點變量
  24. char red_time=30,yellow_time=5,green_time=25; //程序初始化賦值,正常模式
  25. uchar code table[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共陰極段碼0~~~~9段選碼
  26. uchar code S[5]={0XD7,0XE7,0X7D,0X7E,0x77};//交通信號燈控制代碼
  27. /**********************延時子程序************************/
  28. void        Delay(uchar         a)
  29.         {
  30.                 uchar        i;
  31.                 i=a;
  32.                 while(i--){;}
  33.         }
  34. /*****************顯示子函數**************************/
  35. void        Display(void)
  36.         {        //顯示東西方向交通燈
  37.                 char h,l;
  38.                 h=Time_EW/10;
  39.                 l=Time_EW%10;
  40.               P0=table[l];
  41.                 EW_LED2=1; //東西方向選中個位
  42.                 Delay(2);
  43.                 EW_LED2=0; //清屏
  44.             P0=table[h];
  45.                 EW_LED1=1; //東西方向選中十位
  46.                 Delay(2);
  47.                 EW_LED1=0; //清屏
  48.            //顯示南北方向交通燈
  49.                 h=Time_SN/10;
  50.                 l=Time_SN%10;
  51.                 P0=table[l];
  52.                 SN_LED2=1; //南北方向選中個位
  53.                 Delay(2);
  54.                 SN_LED2=0; //清屏
  55.             P0=table[h];
  56.                 SN_LED1=1; //南北方向選中十位
  57.                 Delay(2);
  58.                 SN_LED1=0; //清屏
  59. }
  60. /**********************T0中斷服務程序*******************/
  61.         void timer0(void)interrupt 1 using 1
  62. {        
  63.         TH0=(65536-50000)/256;         //定時器定時50ms
  64.         TL0=(65536-50000)%256;
  65.         count++;
  66.         if(count==10)
  67.         { //黃燈閃爍程序
  68.           if(Flag_SN_Yellow==1) //測試南北黃燈標志位
  69.           {SN_Yellow=~SN_Yellow;}
  70.           if(Flag_EW_Yellow==1)  //測試東西黃燈標志位
  71.           {EW_Yellow=~EW_Yellow;}
  72.         }
  73.         if(count==20)
  74.         {
  75.         //倒計時
  76.         Time_EW--;
  77.         Time_SN--;
  78.         //黃燈閃爍程序
  79.         if(Flag_SN_Yellow==1)//測試南北黃燈標志位
  80.             {SN_Yellow=~SN_Yellow;}
  81.         if(Flag_EW_Yellow==1)//測試東西黃燈標志位
  82.             {EW_Yellow=~EW_Yellow;}
  83.         count=0;
  84.         }
  85. }
  86. /*********************主程序開始**********************/
  87. void        main(void)
  88. {         
  89.     TMOD=0x01;//定時器工作于方式1
  90.         TH0=(65536-50000)/256;//定時器賦初值
  91.         TL0=(65536-50000)%256;
  92.         EA=1; //CPU開中斷總允許
  93.         ET0=1;//開定時中斷
  94.     TR0=1;//啟動定時
  95.         EX0=1;//外部中斷0允許位
  96.         IT0=1;//選擇外部中斷0是跳沿觸發(fā)
  97.         EX1=1;//外部中斷1允許位
  98.         IT1=1;//選擇外部中斷1是跳沿觸發(fā)
  99.         while(1)         
  100.         {                flag_EW=0;//EW方向交通管制標志位                        
  101.                         Flag_EW_Yellow=0;           //EW關黃燈顯示信號
  102.                         Time_EW=red_time;                                          
  103.                         Time_SN=green_time;               
  104.                                 while(Time_SN>0)
  105.                             {
  106.                                  P1=S[0];         //SN通行,EW紅燈
  107.                              Display();
  108.                                 }
  109.                         /*******黃燈閃爍**********/
  110.                            P1=0xF7;
  111.                         Time_SN=yellow_time;                          //
  112.                                 while(Time_SN>0)
  113.                            {
  114.                             Flag_SN_Yellow=1;         //SN開黃燈信號位                 
  115.                             Display();
  116.                            }
  117.                         
  118.                           flag_SN=0;//SN方向交通管制標志位
  119.                         Flag_SN_Yellow=0;  //SN關黃燈顯示信號
  120.                         Time_EW=green_time;
  121.                         Time_SN=red_time;
  122.                             while(Time_EW>0)
  123.                             {P1=S[2];         //EW通行,SN紅燈
  124.                                  Display();}
  125.                         /*******黃燈閃爍**********/
  126.                         P1=0X7F;
  127.                         Time_EW=yellow_time;
  128.                                 while(Time_EW>0)
  129.                            {Flag_EW_Yellow=1;//EW開黃燈信號位        
  130.                             Display();}               
  131.         }
  132. }
  133. /*
  134. *********************外部中斷0服務程序******************
  135. 緊急情況按下鍵后四個方向的燈都變?yōu)榧t色并倒計時20秒
  136. */
  137. void int0_int (void) interrupt 0 using 0
  138. {        
  139.         EA=0;
  140.         a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保護斷點
  141.         EA=1;
  142.         IP=0x02;
  143.         Time_EW=Time_SN=20;                                          
  144.         while(Time_EW>0)
  145.         {P1=0X77;Display();}                        
  146.         Flag_EW_Yellow=0;                                                                  
  147.         Flag_SN_Yellow=0;
  148.         while(Time_EW==0)
  149.         {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢復現(xiàn)場
  150. }
  151. /**********************外部中斷1服務程序******************
  152. 在SN放行期間,若EW有車而SN無車,按下開關K供EW放行15S;
  153. 在EW放行期間,若SN有車而EW無車,按下開關K供SN放行15S。
  154. */
  155. void int1_int (void) interrupt 2  
  156. {
  157.   EA=0;
  158.   a=TH0;b=TL0;c=Time_EW;d=Time_SN;e=Flag_EW_Yellow;f=P1;g=count;//保護斷點
  159.   EA=1;
  160.   IP=0X02;
  161.   if(P1==S[0])
  162.   {
  163.   if(flag_EW==0)
  164.   {
  165.   Time_EW=Time_SN=15;
  166.   while(Time_EW>0)
  167.   {P1=S[2];Display();}                        
  168.   Flag_EW_Yellow=0;                                                                  
  169.   Flag_SN_Yellow=0;
  170.   }
  171.   flag_SN=1;
  172.   }
  173.   if(P1==S[2])
  174.   {
  175.   if(flag_SN==0)
  176.   {
  177.   Time_EW=Time_SN=15;
  178.   while(Time_EW>0)
  179.   {P1=S[0];Display();}                        
  180.   Flag_EW_Yellow=0;                                                                  
  181.   Flag_SN_Yellow=0;
  182.   }
  183.   flag_EW=1;
  184.   }
  185.   while(Time_EW==0)
  186. {TH0=a;TL0=b;Time_EW=c;Time_SN=d;Flag_EW_Yellow=e;P1=f;count=g;}//恢復現(xiàn)場
  187. }
復制代碼

所有資料51hei提供下載:
交通燈.zip (43.53 KB, 下載次數: 173)


評分

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

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:404878 發(fā)表于 2018-11-22 17:10 | 只看該作者
有問題的可以交流一下。
回復

使用道具 舉報

板凳
ID:430334 發(fā)表于 2019-1-17 22:14 | 只看該作者
仿真在哪
回復

使用道具 舉報

地板
ID:731522 發(fā)表于 2020-5-4 12:55 | 只看該作者
謝謝分享
回復

使用道具 舉報

5#
ID:768157 發(fā)表于 2020-6-7 08:28 來自手機 | 只看該作者
lzDestiny 發(fā)表于 2018-11-22 17:10
有問題的可以交流一下。

hex文件打不開啊
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表