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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1751|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

注釋很詳細(xì)的單片機(jī)交通燈程序Proteus仿真原理圖 可修改通行時間功能很多

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基本要求
(1)控制器:推薦51系列單片機(jī);
(2)仿真軟件:Proteus 7.7;
(3)路口為十字路口,需要加入行人的通行時間,橙色燈的3秒等待功能必須添加;
(4)可以在允許期間隨時修改各個路口的通行時間;
(5)通行策略如下:每個路口的車輛依次通行,即通行完A路口后,在進(jìn)行B路口的車輛通行,在某個路口通行時,其他路口的車輛均處于等待狀態(tài),在沒有車輛進(jìn)入的路口(除車輛右轉(zhuǎn)外),可進(jìn)行人行通道是否通行的設(shè)置。

系統(tǒng)組成要求
輸入部分:
允許控制:按鈕(1),切換信息顯示的路口;
參數(shù)設(shè)置:按鈕(5),功能切換(修改、退出)、(修改項(xiàng))移動、減少(1秒)、增加(1秒);
(修改項(xiàng)為每個路口的車輛(直行、左轉(zhuǎn))通行時間,人行時間根據(jù)其他路口時間的設(shè)置自動獲取)
(按鍵也可采用KEYPAD-PHONE模塊進(jìn)行整合,利用文字功能進(jìn)行在相關(guān)數(shù)字下進(jìn)行標(biāo)注)
顯示部分:
采用LCD1602進(jìn)行相關(guān)信息的顯示,信息顯示項(xiàng)為:路口、直行時間(秒)、左轉(zhuǎn)時間(秒)、人行通道時間(秒);均采用倒計(jì)時方式,正值表示允許通行,負(fù)值表示等待。
采用TRAFFIC LIGHTS模塊進(jìn)行三色交通燈的模擬,LED燈進(jìn)行人行通道的模擬。
數(shù)據(jù)連接部分(推薦,非硬性要求)
由于輸出數(shù)據(jù)線較多,可以采用74HC595等并串轉(zhuǎn)換期間進(jìn)行信息的顯示。

運(yùn)行流程(功能要求)
(1)系統(tǒng)開始運(yùn)行時可立即進(jìn)入工作狀態(tài);
(2)按下切換按鈕,可以在LCD上觀測到各個路口的相關(guān)時間數(shù)據(jù);
(3)按下修改按鈕,工作狀態(tài)被打斷,此時可以進(jìn)行各個路口車輛運(yùn)行時間的修改。

工作量要求
   根據(jù)技術(shù)指標(biāo)或功能要求合理設(shè)計(jì)整個課題的實(shí)現(xiàn)邏輯,完成總體設(shè)計(jì);
   利用Proteus仿真軟件搭建完整的控制系統(tǒng),對于不能直接仿真的模塊尋找合理的替代方式;
   設(shè)計(jì)合理的系統(tǒng)控制流程;
   利用(Keil C)μVision軟件編寫C語言控制程序,并完成系統(tǒng)功能的調(diào)試;

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


單片機(jī)源程序如下(注釋非常詳細(xì)):
  1. #include "Common.h"
  2. #include "lcd1602.h"
  3. #include "stdio.h"


  4. //引腳定義
  5. sbit KeyChangeDisp = P2^3;                //切換顯示按鍵
  6. sbit KeySet = P2^4;                //設(shè)置模式按鍵
  7. sbit KeyMove = P2^5;        //移動按鍵
  8. sbit KeyAdd = P2^6;                //加按鍵
  9. sbit KeySub = P2^7;                //減按鍵

  10. /* 直行交通燈定義 */
  11. sbit LedRedNS = P1^2;        // 南北直行方向紅燈
  12. sbit LedGreenNS = P1^0;        // 南北直行方向綠燈
  13. sbit LedYellowNS = P1^1;// 南北直行方向黃燈
  14. sbit LedRedEW = P1^5;        // 東西直行方向紅燈
  15. sbit LedGreenEW = P1^3;        // 東西直行方向綠燈
  16. sbit LedYellowEW = P1^4;// 東西直行方向黃燈

  17. /* 左轉(zhuǎn)交通燈定義 */
  18. sbit LedLeftRedNS = P3^2;        // 南北左轉(zhuǎn)方向紅燈
  19. sbit LedLeftGreenNS = P3^0;        // 南北左轉(zhuǎn)方向綠燈
  20. sbit LedLeftYellowNS = P3^1;// 南北左轉(zhuǎn)方向黃燈
  21. sbit LedLeftRedEW = P3^5;        // 東西左轉(zhuǎn)方向紅燈
  22. sbit LedLeftGreenEW = P3^3;        // 東西左轉(zhuǎn)方向綠燈
  23. sbit LedLeftYellowEW = P3^4;// 東西左轉(zhuǎn)方向黃燈

  24. /* 人行道交通燈定義 */
  25. sbit LedPeopleRedNS = P1^6;                // 南北人行紅燈
  26. sbit LedPeopleGreenNS = P1^7;        // 南北人行綠燈
  27. sbit LedPeopleRedEW = P3^6;                // 東西人行紅燈
  28. sbit LedPeopleGreenEW = P3^7;        // 東西人行綠燈

  29. /* 定義變量保存各方向的剩余時間,正數(shù)為剩余通行時間,負(fù)數(shù)為剩余等待時間 */
  30. char RnTime_NS = 0;                  //南北方向直行剩余時間
  31. char RnTime_EW = 0;                  //東西方向直行剩余時間
  32. char RnLeftTime_NS = 0;          //南北方向左轉(zhuǎn)剩余時間
  33. char RnLeftTime_EW = 0;          //東西方向左轉(zhuǎn)剩余時間
  34. char RnPeopleTime_NS = 0;          //南北方向人行剩余時間
  35. char RnPeopleTime_EW = 0;          //東西方向人行剩余時間


  36. //相關(guān)變量定義
  37. Uint8 TimeGreen_NS=5;  //南北方向運(yùn)行時間
  38. Uint8 TimeGreen_EW=5;  //東西方向運(yùn)行時間
  39. Uint8 TimeLeftGreen_NS=5;  //南北左轉(zhuǎn)方向運(yùn)行時間
  40. Uint8 TimeLeftGreen_EW=5;  //東西左轉(zhuǎn)方向運(yùn)行時間
  41. Uint8 TimeYellow = 3;        //黃燈時間
  42. Uint8 index=0;  
  43. Uint8 flag_1S;          //1s時間基準(zhǔn)標(biāo)志
  44. Uint8 IntTimes=0;       //記錄定時器中斷次數(shù)
  45. Uint8 Time_NS,Time_WE;  //南北方向、東西方向換燈前剩余時間  

  46. Uint8 code StrNS1[] = "NS:  SF  TL XING";
  47. Uint8 code StrEW1[] = "EW:  SF  TL XING";
  48. Uint8      StrNum[] = "                ";
  49. Uint8 code Str[]    = "NS  NSL  EW  EWL";

  50. Uint8 DispState = 0;        // 顯示的狀態(tài),0為顯示南北方向信息,1為顯示東西方向信息
  51. Uint8 CopyLightP1;                //備份交通燈狀態(tài)
  52. Uint8 CopyLightP3;                //備份交通燈狀態(tài)
  53. Uint8 State = 0;                //系統(tǒng)運(yùn)行狀態(tài)標(biāo)志位,0:正常運(yùn)行;1:設(shè)置南北直行方向通行時間;2設(shè)置南北左轉(zhuǎn)通行時間
  54.                                                 //3:設(shè)置東西直行通行時間;4設(shè)置東西左轉(zhuǎn)通行時間
  55.                                                                                        

  56. //函數(shù)聲明
  57. void KeyScan();                                                  //按鍵掃描
  58. void Display();                        //數(shù)碼管動態(tài)顯示
  59. void InitTimer0();                                            //定時器0初始化,提供時間基準(zhǔn)
  60. void FlashLED();                                                                //控制交通燈的變化
  61. void ProcTime();                        // 處理各個方向剩余時間和等待時間
  62. //主函數(shù)
  63. void main()
  64. {
  65.     InitTimer0();       //定時器0初始化
  66.         Init1602();                        //初始化LCD1602
  67.     while (1)
  68.     {
  69.                 KeyScan();                  //按鍵掃描
  70.         FlashLED();             //led指示燈掃描
  71.         if(flag_1S==1)          //定時器計(jì)時達(dá)到1秒
  72.         {
  73.             flag_1S=0;          //滿1秒標(biāo)志清零
  74.             Time_NS--;          //南北東西通行時間各減1
  75.             Time_WE--;
  76.                         ProcTime();                        // 處理各個方向剩余時間和等待時間
  77.         }
  78.     }
  79. }

  80. void Timer0() interrupt 1  //定時器0中斷
  81. {
  82.         TH0=(65536-20000)/256;             //50ms一次中斷
  83.         TL0=(65536-20000)%256;
  84.         IntTimes++;            //中斷次數(shù)計(jì)算器加一
  85.         if(IntTimes>=50)       //進(jìn)中斷50次,即為1秒
  86.         {
  87.                 IntTimes=0;         //中斷次數(shù)計(jì)算器清0
  88.                 if(State == 0)                //正常運(yùn)行模式下倒計(jì)時減一
  89.                     flag_1S=1;                //1秒標(biāo)志位置一        
  90.         }
  91. }

  92. void InitTimer0()              //定時器0初始化,提供時間基準(zhǔn)
  93. {
  94.         TMOD=0X01;                  //定時器0方式設(shè)置1
  95.         TH0=(65536-20000)/256;      //初值設(shè)置 20ms
  96.         TL0=(65536-20000)%256;      //初值設(shè)置  
  97.         ET0=1;                      //使能定時器0中斷
  98.         TR0=1;                      //開定時器0
  99.     EA=1;                       //開總中斷
  100. }

  101. void ProcTime()                        // 處理各個方向剩余時間和等待時間
  102. {
  103.         /* 大于0代表剩余為通行時間,每秒減一;小于0代表為等待時間(負(fù)數(shù)),每秒加一 */
  104.         if (RnTime_NS > 0)
  105.         {
  106.                 RnTime_NS--;
  107.         }
  108.         else if(RnTime_NS < 0)
  109.         {
  110.                 RnTime_NS++;
  111.         }
  112.         
  113.         if (RnTime_EW > 0)
  114.         {
  115.                 RnTime_EW--;
  116.         }
  117.         else if(RnTime_EW < 0)
  118.         {
  119.                 RnTime_EW++;
  120.         }
  121.         
  122.         if (RnLeftTime_NS > 0)
  123.         {
  124.                 RnLeftTime_NS--;
  125.         }
  126.         else if(RnLeftTime_NS < 0)
  127.         {
  128.                 RnLeftTime_NS++;
  129.         }
  130.         
  131.         if (RnLeftTime_EW > 0)
  132.         {
  133.                 RnLeftTime_EW--;
  134.         }
  135.         else if(RnLeftTime_EW < 0)
  136.         {
  137.                 RnLeftTime_EW++;
  138.         }
  139.         
  140.         if (RnPeopleTime_NS > 0)
  141.         {
  142.                 RnPeopleTime_NS--;
  143.         }
  144.         else if(RnPeopleTime_NS < 0)
  145.         {
  146.                 RnPeopleTime_NS++;
  147.         }
  148.         
  149.         if (RnPeopleTime_EW > 0)
  150.         {
  151.                 RnPeopleTime_EW--;
  152.         }
  153.         else if(RnPeopleTime_EW < 0)
  154.         {
  155.                 RnPeopleTime_EW++;
  156.         }
  157. }

  158. void Display()                        //lcd顯示顯示
  159. {
  160.         /* 顯示南北方向信息 */
  161.         if (DispState == 0)
  162.         {
  163.                 Write1602_Str(0, 1, StrNS1, 16);// 屏幕第一行
  164.                 sprintf(StrNum,"   %4.2d%4.2d%4.2d",(int)RnTime_NS,(int)RnLeftTime_NS,(int)RnPeopleTime_NS);
  165.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  166.         }
  167.         else if (DispState == 1)
  168.         {
  169.                 Write1602_Str(0, 1, StrEW1, 16);//寫字符串
  170.                 sprintf(StrNum,"   %4.2d%4.2d%4.2d",(int)RnTime_EW,(int)RnLeftTime_EW,(int)RnPeopleTime_EW);
  171.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  172.         }
  173. }

  174. void FlashLED()                                                //交通燈的變化
  175. {
  176.         if(State == 0)                                                //正常運(yùn)行模式
  177.         {
  178.                 if(Time_NS==0 || Time_WE==0)   //南北或東西方向有時間為0
  179.                 {
  180.                         switch(index)                           //改變紅綠燈的狀態(tài),狀態(tài)機(jī)
  181.                         {
  182.                                 case 0:                      /* 南北方向直行綠燈、南北人行綠燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)紅燈 */
  183.                                 {
  184.                                         index=1;           //下次進(jìn)入時切換方向
  185.                                         Time_NS = TimeGreen_NS;        // 南北直行方向綠燈剩余時間
  186.                                         Time_WE=TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2; //東西直行方向的等待時間
  187.                                        
  188.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  189.                                         RnTime_NS = Time_NS;
  190.                                         RnTime_EW = -(TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2);
  191.                                         RnLeftTime_NS = -TimeYellow - RnTime_NS;
  192.                                         RnLeftTime_EW = -(TimeGreen_EW + TimeYellow) + RnTime_EW;
  193.                                         RnPeopleTime_NS = RnTime_NS;        // 人行時間為對應(yīng)方向的直行時間
  194.                                         RnPeopleTime_EW = RnTime_EW;
  195.                                        
  196.                                         /* 南北方向直行綠燈、南北人行綠燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)紅燈 */
  197.                                         /* 直行交通燈 */
  198.                                         LedRedNS = 0;                // 南北直行方向紅燈
  199.                                         LedGreenNS = 1;                // 南北直行方向綠燈
  200.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  201.                                         LedRedEW = 1;                // 東西直行方向紅燈
  202.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  203.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  204.                                         /* 直行交通燈 */
  205.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  206.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  207.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  208.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  209.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  210.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  211.                                         /* 人行道交通燈 */
  212.                                         LedPeopleRedNS = 0;                // 南北人行紅燈
  213.                                         LedPeopleGreenNS = 1;        // 南北人行綠燈
  214.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  215.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  216.                                 }break;
  217.                                 case 1:          /* 南北方向直行黃燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西人行紅燈 */
  218.                                 {
  219.                                         index=2;       //下次進(jìn)入時切換方向
  220.                                         Time_NS = TimeYellow;        // 南北直行方向黃燈剩余時間
  221.                                          
  222.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  223.                                         RnTime_NS -= (TimeLeftGreen_NS + TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 4);
  224.                                         RnPeopleTime_NS = RnTime_NS;        // 人行時間為對應(yīng)方向的直行時間
  225.                                        
  226.                                         /* 南北方向直行黃燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西人行紅燈 */
  227.                                         /* 直行交通燈 */
  228.                                         LedRedNS = 0;                // 南北直行方向紅燈
  229.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  230.                                         LedYellowNS = 1;        // 南北直行方向黃燈
  231.                                         LedRedEW = 1;                // 東西直行方向紅燈
  232.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  233.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  234.                                         /* 直行交通燈 */
  235.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  236.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  237.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  238.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  239.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  240.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  241.                                         /* 人行道交通燈 */
  242.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  243.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  244.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  245.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  246.                                 }break;
  247.                                 case 2:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)綠燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
  248.                                 {
  249.                                         index=3;         //下次進(jìn)入時切換方向
  250.                                         Time_NS = TimeLeftGreen_NS;        // 南北左轉(zhuǎn)方向綠燈剩余時間
  251.                                        
  252.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  253.                                         RnLeftTime_NS += TimeLeftGreen_NS;
  254.                                        
  255.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)綠燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
  256.                                         /* 直行交通燈 */
  257.                                         LedRedNS = 1;                // 南北直行方向紅燈
  258.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  259.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  260.                                         LedRedEW = 1;                // 東西直行方向紅燈
  261.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  262.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  263.                                         /* 左轉(zhuǎn)交通燈 */
  264.                                         LedLeftRedNS = 0;        // 南北左轉(zhuǎn)方向紅燈
  265.                                         LedLeftGreenNS = 1;        // 南北左轉(zhuǎn)方向綠燈
  266.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  267.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  268.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  269.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  270.                                         /* 人行道交通燈 */
  271.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  272.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  273.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  274.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  275.                                 }break;
  276.                                 case 3:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)黃燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
  277.                                 {
  278.                                         index=4;         //下次進(jìn)入時切換方向
  279.                                         Time_NS = TimeYellow;        // 南北左轉(zhuǎn)方向黃燈剩余時間
  280.                                        
  281.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  282.                                         RnLeftTime_NS -= (TimeGreen_EW + TimeLeftGreen_EW + TimeGreen_NS + TimeYellow * 4);
  283.                                        
  284.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)黃燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
  285.                                         /* 直行交通燈 */
  286.                                         LedRedNS = 1;                // 南北直行方向紅燈
  287.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  288.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  289.                                         LedRedEW = 1;                // 東西直行方向紅燈
  290.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  291.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  292.                                         /* 左轉(zhuǎn)交通燈 */
  293.                                         LedLeftRedNS = 0;        // 南北左轉(zhuǎn)方向紅燈
  294.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  295.                                         LedLeftYellowNS = 1;// 南北左轉(zhuǎn)方向黃燈
  296.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  297.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  298.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  299.                                         /* 人行道交通燈 */
  300.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  301.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  302.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  303.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  304.                                 }break;
  305.                                 case 4:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西人行綠燈 */
  306.                                 {
  307.                                         index=5;         //下次進(jìn)入時切換方向
  308.                                         Time_NS = TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 2;        // 南北方向直行的等待時間
  309.                                         Time_WE = TimeGreen_EW; //東西直行方向綠燈的剩余時間
  310.                                        
  311.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  312.                                         RnTime_EW += TimeGreen_EW;
  313.                                         RnPeopleTime_EW = RnTime_EW;
  314.                                        
  315.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西人行綠燈 */
  316.                                         /* 直行交通燈 */
  317.                                         LedRedNS = 1;                // 南北直行方向紅燈
  318.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  319.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  320.                                         LedRedEW = 0;                // 東西直行方向紅燈
  321.                                         LedGreenEW = 1;                // 東西直行方向綠燈
  322.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  323.                                         /* 直行交通燈 */
  324.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  325.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  326.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  327.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  328.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  329.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  330.                                         /* 人行道交通燈 */
  331.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  332.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  333.                                         LedPeopleRedEW = 0;                // 東西人行紅燈
  334.                                         LedPeopleGreenEW = 1;        // 東西人行綠燈
  335.                                 }break;
  336.                                 case 5:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行黃燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
  337.                                 {
  338.                                         index=6;         //下次進(jìn)入時切換方向
  339.                                         Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
  340.                                        
  341.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  342.                                         RnTime_EW -= (TimeLeftGreen_EW + TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 4);
  343.                                         RnPeopleTime_EW = RnTime_EW;        // 人行時間為對應(yīng)方向的直行時間
  344.                                        
  345.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西左轉(zhuǎn)紅燈 */
  346.                                         /* 直行交通燈 */
  347.                                         LedRedNS = 1;                // 南北直行方向紅燈
  348.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  349.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  350.                                         LedRedEW = 0;                // 東西直行方向紅燈
  351.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  352.                                         LedYellowEW = 1;        // 東西直行方向黃燈

  353.                                         /* 直行交通燈 */
  354.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  355.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  356.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  357.                                         LedLeftRedEW = 1;        // 東西左轉(zhuǎn)方向紅燈
  358.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  359.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  360.                                         /* 人行道交通燈 */
  361.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  362.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  363.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  364.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  365.                                 }break;
  366.                                 case 6:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)綠燈,東西人行紅燈 */
  367.                                 {
  368.                                         index=7;         //下次進(jìn)入時切換方向
  369.                                         Time_WE = TimeLeftGreen_EW; //東西直行方向黃燈的剩余時間
  370.                                        
  371.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  372.                                         RnLeftTime_EW += TimeLeftGreen_EW;
  373.                                        
  374.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)綠燈,東西人行紅燈 */
  375.                                         /* 直行交通燈 */
  376.                                         LedRedNS = 1;                // 南北直行方向紅燈
  377.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  378.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  379.                                         LedRedEW = 1;                // 東西直行方向紅燈
  380.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  381.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  382.                                         /* 直行交通燈 */
  383.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  384.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  385.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  386.                                         LedLeftRedEW = 0;        // 東西左轉(zhuǎn)方向紅燈
  387.                                         LedLeftGreenEW = 1;        // 東西左轉(zhuǎn)方向綠燈
  388.                                         LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈

  389.                                         /* 人行道交通燈 */
  390.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  391.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  392.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  393.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  394.                                 }break;
  395.                                 case 7:           /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)黃燈,東西人行紅燈 */
  396.                                 {
  397.                                         index=0;         //下次進(jìn)入時切換方向
  398.                                         Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
  399.                                        
  400.                                         /* 計(jì)算各個方向的剩余時間和等待時間 */
  401.                                         RnLeftTime_EW -= (TimeGreen_NS + TimeLeftGreen_NS + TimeGreen_EW + TimeYellow * 4);
  402.                                        
  403.                                         /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)黃燈,東西人行紅燈 */
  404.                                         /* 直行交通燈 */
  405.                                         LedRedNS = 1;                // 南北直行方向紅燈
  406.                                         LedGreenNS = 0;                // 南北直行方向綠燈
  407.                                         LedYellowNS = 0;        // 南北直行方向黃燈
  408.                                         LedRedEW = 1;                // 東西直行方向紅燈
  409.                                         LedGreenEW = 0;                // 東西直行方向綠燈
  410.                                         LedYellowEW = 0;        // 東西直行方向黃燈

  411.                                         /* 直行交通燈 */
  412.                                         LedLeftRedNS = 1;        // 南北左轉(zhuǎn)方向紅燈
  413.                                         LedLeftGreenNS = 0;        // 南北左轉(zhuǎn)方向綠燈
  414.                                         LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  415.                                         LedLeftRedEW = 0;        // 東西左轉(zhuǎn)方向紅燈
  416.                                         LedLeftGreenEW = 0;        // 東西左轉(zhuǎn)方向綠燈
  417.                                         LedLeftYellowEW = 1;// 東西左轉(zhuǎn)方向黃燈

  418.                                         /* 人行道交通燈 */
  419.                                         LedPeopleRedNS = 1;                // 南北人行紅燈
  420.                                         LedPeopleGreenNS = 0;        // 南北人行綠燈
  421.                                         LedPeopleRedEW = 1;                // 東西人行紅燈
  422.                                         LedPeopleGreenEW = 0;        // 東西人行綠燈
  423.                                 }break;
  424.                                 
  425.                                 default:break;
  426.                         }
  427.                 }
  428.                 Display();                        //數(shù)碼管顯示剩余時間
  429.                
  430.                 /* index==2或者index==4或者index==6或者index==0時處于黃燈狀態(tài),黃燈閃爍 */
  431.                 if (index == 2)
  432.                 {
  433.                         /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
  434.                         if(IntTimes < 25)
  435.                         {
  436.                                 LedYellowNS = 0;        // 南北直行方向黃燈
  437.                         }
  438.                         else
  439.                         {
  440.                                 LedYellowNS = 1;        // 南北直行方向黃燈
  441.                         }
  442.                 }
  443.                 else if (index == 4)
  444.                 {
  445.                         /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
  446.                         if(IntTimes < 25)
  447.                         {
  448.                                 LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
  449.                         }
  450.                         else
  451.                         {
  452.                                 LedLeftYellowNS = 1;// 南北左轉(zhuǎn)方向黃燈
  453.                         }
  454.                 }
  455.                 else if (index == 6)
  456.                 {
  457.                         /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
  458.                         if(IntTimes < 25)
  459.                         {
  460.                                 LedYellowEW = 0;        // 東西直行方向黃燈
  461.                         }
  462.                         else
  463.                         {
  464.                                 LedYellowEW = 1;        // 東西直行方向黃燈
  465.                         }
  466.                 }
  467.                 else if (index == 0)
  468.                 {
  469.                         /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
  470.                         if(IntTimes < 25)
  471.                         {
  472.                                 LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
  473.                         }
  474.                         else
  475.                         {
  476.                                 LedLeftYellowEW = 1;// 東西左轉(zhuǎn)方向黃燈
  477.                         }
  478.                 }
  479.         }
  480.         else if(State == 1)                                                        //設(shè)置南北直行時間
  481.         {
  482.                 sprintf(StrNum,"%2.2d              ",(int)TimeGreen_NS);
  483.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  484.         }
  485.         else if(State == 2)                                                        //設(shè)置南北左轉(zhuǎn)時間
  486.         {
  487.                 sprintf(StrNum,"     %2.2d         ",(int)TimeGreen_EW);
  488.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  489.         }
  490.         else if(State == 3)                                                        //設(shè)置東西直行時間
  491.         {
  492.                 sprintf(StrNum,"         %2.2d     ",(int)TimeLeftGreen_NS);
  493.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  494.         }
  495.         else if(State == 4)                                                        //設(shè)置東西左轉(zhuǎn)時間
  496.         {
  497.                 sprintf(StrNum,"              %2.2d",(int)TimeLeftGreen_EW);
  498.                 Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
  499.         }
  500. }

  501. void SetModel()                                                        //紅綠燈設(shè)置模式
  502. {
  503.         if(State == 0)      //當(dāng)前為正常運(yùn)行模式
  504.         {
  505.                 State=1;        //狀態(tài)切換為設(shè)置南北通行時間
  506.                 Write1602_Str(0, 1, Str, 16);// 屏幕第一行
  507. //                CopyLightP1=P1;        //備份指示燈狀態(tài)
  508. //                CopyLightP3=P3;        //備份指示燈狀態(tài)
  509.         }
  510.         else                           //當(dāng)前為設(shè)置東西通行時間
  511.         {
  512.                 State=0;        //狀態(tài)切換為設(shè)置正常運(yùn)行模式
  513. //                P1=CopyLight;        //還原交通燈狀態(tài)
  514.         index=0;                                                //交通燈重新啟動
  515.         Time_NS=0;
  516.         Time_WE=0;        
  517.                
  518.                 RnTime_NS = 0;
  519.                 RnTime_EW = 0;
  520.                 RnLeftTime_NS = 0;
  521.                 RnLeftTime_EW = 0;
  522.                 RnPeopleTime_NS = 0;
  523.                 RnPeopleTime_EW = 0;
  524.         }
  525. }

  526. void ADDTime()                        //紅綠燈時間加
  527. {
  528.         if(State==1)               //當(dāng)前為設(shè)置南北通行時間
  529.         {
  530.                 if(TimeGreen_NS < 99)
  531.                         TimeGreen_NS++;  //南北通行時間加一
  532.         }
  533.         else if(State==2)   //當(dāng)前為設(shè)置東西通行時間
  534.         {
  535.                 if(TimeGreen_EW < 99)
  536.                         TimeGreen_EW++;  //東西通行時間加一
  537.         }
  538.         else if(State==3)   //當(dāng)前為設(shè)置東西通行時間
  539.         {
  540.                 if(TimeLeftGreen_NS < 99)
  541.                         TimeLeftGreen_NS++;  //東西通行時間加一
  542.         }
  543.         else if(State==4)   //當(dāng)前為設(shè)置東西通行時間
  544.         {
  545.                 if(TimeLeftGreen_EW < 99)
  546.                         TimeLeftGreen_EW++;  //東西通行時間加一
  547.         }
  548. }
  549. void SUBTime()                        //紅綠燈時間減
  550. {
  551.         if(State==1)               //當(dāng)前為設(shè)置南北通行時間
  552.         {
  553.                 if(TimeGreen_NS>1)
  554.                         TimeGreen_NS--;  //南北通行時間加一
  555.         }
  556.         else if(State==2)   //當(dāng)前為設(shè)置東西通行時間
  557.         {
  558.                 if(TimeGreen_EW>1)
  559.                         TimeGreen_EW--;  //東西通行時間加一
  560.         }
  561.         else if(State==3)   //當(dāng)前為設(shè)置東西通行時間
  562.         {
  563.                 if(TimeLeftGreen_NS>1)
  564.                         TimeLeftGreen_NS--;  //東西通行時間加一
  565.         }
  566.         else if(State==4)   //當(dāng)前為設(shè)置東西通行時間
  567.         {
  568.                 if(TimeLeftGreen_EW>1)
  569.                         TimeLeftGreen_EW--;  //東西通行時間加一
  570.         }
  571. }

  572. void MoveModel()                // 移動
  573. {
  574.         if (State > 0)
  575.         {
  576.                 State++;
  577.                 if(State > 4)
  578.                 {
  579.                         State = 1;
  580.                 }
  581.         }
  582. }

  583. void ChangeDisp()                        //切換顯示
  584. {
  585.         if(State==0)                       //當(dāng)前為正常運(yùn)行模式
  586.     {
  587.         if (DispState == 0)
  588.                 {
  589.                         DispState = 1;
  590.                 }
  591.                 else if (DispState == 1)
  592.                 {
  593.                         DispState = 0;
  594.                 }
  595.     }
  596. }

  597. void KeyScan()                                          //按鍵掃描
  598. {
  599.     if(KeyChangeDisp == 0)                             //設(shè)置按鍵按下
  600.     {
  601.         DelayMs(10);                                            //延時消抖
  602.         if(KeyChangeDisp == 0)                         //確認(rèn)按鍵按下
  603.         {
  604.             ChangeDisp();                                        //切換顯示
  605.                         while(KeyChangeDisp == 0);                //等待按鍵彈起
  606.         }
  607.     }
  608.         if(KeySet == 0)                                     //設(shè)置按鍵按下
  609.     {
  610.         DelayMs(10);                                            //延時消抖
  611.         if(KeySet == 0)                                 //確認(rèn)按鍵按下
  612.         {
  613.             SetModel();                                        //切換顯示
  614.                         while(KeySet == 0);                                //等待按鍵彈起
  615.         }
  616.     }
  617.         if(KeyMove == 0)                                 //設(shè)置按鍵按下
  618.     {
  619.         DelayMs(10);                                    //延時消抖
  620.         if(KeyMove == 0)                             //確認(rèn)按鍵按下
  621.         {
  622.             MoveModel();                                        //移動設(shè)置位置
  623.                         while(KeyMove == 0);                        //等待按鍵彈起
  624.         }
  625.     }
  626.     if(KeyAdd == 0)                                 //設(shè)置按鍵按下
  627.     {
  628.         DelayMs(10);                                    //延時消抖
  629.         if(KeyAdd == 0)                             //確認(rèn)按鍵按下
  630.         {
  631.              ADDTime();                                                //紅綠燈時間加
  632.                         while(KeyAdd == 0);                                //等待按鍵彈起
  633.         }
  634.     }
  635.     if(KeySub == 0)                                 //設(shè)置按鍵按下
  636.     {
  637.         DelayMs(10);                                    //延時消抖
  638.         if(KeySub == 0)                             //確認(rèn)按鍵按下
  639.         {
  640.             SUBTime();                                                //紅綠燈時間減
  641.                         while(KeySub == 0);                                //等待按鍵彈起
  642.         }
  643.     }
  644. }
復(fù)制代碼

Keil5代碼與Proteus7與8.13仿真下載:
交通燈.rar (93.07 KB, 下載次數(shù): 35)


評分

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

查看全部評分

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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲不卡在线观看 | 成人免费视频 | 高清av在线 | 欧美性猛片aaaaaaa做受 | 国产精品区二区三区日本 | 欧美男人天堂 | 日韩视频―中文字幕 | 91精品国产乱码久久久久久久 | 黄色大片免费网站 | 精品一区二区三区在线视频 | 亚洲综合在线视频 | 青青久在线视频 | 国产高清在线精品一区二区三区 | 久久亚洲综合 | 日韩电影在线一区 | 一区二区三区四区免费观看 | 日本成人片在线观看 | 成人精品在线观看 | 日韩综合色 | 毛片com| 亚洲视频在线观看 | 日韩精品视频在线 | 日韩免费成人av | 国产精品久久久久久久久大全 | 操久久| 日韩欧美三级电影 | 自拍偷拍视频网 | 91免费在线视频 | 精品视频在线观看 | 久久久久久av | 亚洲婷婷六月天 | 亚洲欧洲精品成人久久奇米网 | 精品一区二区三区在线观看国产 | 丝袜美腿av | av资源中文在线 | 成人一区二区三区 | 美女毛片 | 中文字幕在线观看一区 | 美日韩免费视频 | 日韩成人在线播放 | 欧美日韩不卡合集视频 |