基本要求
(1)控制器:推薦51系列單片機;
(2)仿真軟件:Proteus 7.7;
(3)路口為十字路口,需要加入行人的通行時間,橙色燈的3秒等待功能必須添加;
(4)可以在允許期間隨時修改各個路口的通行時間;
(5)通行策略如下:每個路口的車輛依次通行,即通行完A路口后,在進行B路口的車輛通行,在某個路口通行時,其他路口的車輛均處于等待狀態,在沒有車輛進入的路口(除車輛右轉外),可進行人行通道是否通行的設置。
系統組成要求
輸入部分:
允許控制:按鈕(1),切換信息顯示的路口;
參數設置:按鈕(5),功能切換(修改、退出)、(修改項)移動、減少(1秒)、增加(1秒);
(修改項為每個路口的車輛(直行、左轉)通行時間,人行時間根據其他路口時間的設置自動獲取)
(按鍵也可采用KEYPAD-PHONE模塊進行整合,利用文字功能進行在相關數字下進行標注)
顯示部分:
采用LCD1602進行相關信息的顯示,信息顯示項為:路口、直行時間(秒)、左轉時間(秒)、人行通道時間(秒);均采用倒計時方式,正值表示允許通行,負值表示等待。
采用TRAFFIC LIGHTS模塊進行三色交通燈的模擬,LED燈進行人行通道的模擬。
數據連接部分(推薦,非硬性要求)
由于輸出數據線較多,可以采用74HC595等并串轉換期間進行信息的顯示。
運行流程(功能要求)
(1)系統開始運行時可立即進入工作狀態;
(2)按下切換按鈕,可以在LCD上觀測到各個路口的相關時間數據;
(3)按下修改按鈕,工作狀態被打斷,此時可以進行各個路口車輛運行時間的修改。
工作量要求
根據技術指標或功能要求合理設計整個課題的實現邏輯,完成總體設計;
利用Proteus仿真軟件搭建完整的控制系統,對于不能直接仿真的模塊尋找合理的替代方式;
設計合理的系統控制流程;
利用(Keil C)μVision軟件編寫C語言控制程序,并完成系統功能的調試;
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif (150.86 KB, 下載次數: 30)
下載附件
2023-6-8 17:17 上傳
單片機源程序如下(注釋非常詳細):
- #include "Common.h"
- #include "lcd1602.h"
- #include "stdio.h"
- //引腳定義
- sbit KeyChangeDisp = P2^3; //切換顯示按鍵
- sbit KeySet = P2^4; //設置模式按鍵
- sbit KeyMove = P2^5; //移動按鍵
- sbit KeyAdd = P2^6; //加按鍵
- sbit KeySub = P2^7; //減按鍵
- /* 直行交通燈定義 */
- sbit LedRedNS = P1^2; // 南北直行方向紅燈
- sbit LedGreenNS = P1^0; // 南北直行方向綠燈
- sbit LedYellowNS = P1^1;// 南北直行方向黃燈
- sbit LedRedEW = P1^5; // 東西直行方向紅燈
- sbit LedGreenEW = P1^3; // 東西直行方向綠燈
- sbit LedYellowEW = P1^4;// 東西直行方向黃燈
- /* 左轉交通燈定義 */
- sbit LedLeftRedNS = P3^2; // 南北左轉方向紅燈
- sbit LedLeftGreenNS = P3^0; // 南北左轉方向綠燈
- sbit LedLeftYellowNS = P3^1;// 南北左轉方向黃燈
- sbit LedLeftRedEW = P3^5; // 東西左轉方向紅燈
- sbit LedLeftGreenEW = P3^3; // 東西左轉方向綠燈
- sbit LedLeftYellowEW = P3^4;// 東西左轉方向黃燈
- /* 人行道交通燈定義 */
- sbit LedPeopleRedNS = P1^6; // 南北人行紅燈
- sbit LedPeopleGreenNS = P1^7; // 南北人行綠燈
- sbit LedPeopleRedEW = P3^6; // 東西人行紅燈
- sbit LedPeopleGreenEW = P3^7; // 東西人行綠燈
- /* 定義變量保存各方向的剩余時間,正數為剩余通行時間,負數為剩余等待時間 */
- char RnTime_NS = 0; //南北方向直行剩余時間
- char RnTime_EW = 0; //東西方向直行剩余時間
- char RnLeftTime_NS = 0; //南北方向左轉剩余時間
- char RnLeftTime_EW = 0; //東西方向左轉剩余時間
- char RnPeopleTime_NS = 0; //南北方向人行剩余時間
- char RnPeopleTime_EW = 0; //東西方向人行剩余時間
- //相關變量定義
- Uint8 TimeGreen_NS=5; //南北方向運行時間
- Uint8 TimeGreen_EW=5; //東西方向運行時間
- Uint8 TimeLeftGreen_NS=5; //南北左轉方向運行時間
- Uint8 TimeLeftGreen_EW=5; //東西左轉方向運行時間
- Uint8 TimeYellow = 3; //黃燈時間
- Uint8 index=0;
- Uint8 flag_1S; //1s時間基準標志
- Uint8 IntTimes=0; //記錄定時器中斷次數
- Uint8 Time_NS,Time_WE; //南北方向、東西方向換燈前剩余時間
- Uint8 code StrNS1[] = "NS: SF TL XING";
- Uint8 code StrEW1[] = "EW: SF TL XING";
- Uint8 StrNum[] = " ";
- Uint8 code Str[] = "NS NSL EW EWL";
- Uint8 DispState = 0; // 顯示的狀態,0為顯示南北方向信息,1為顯示東西方向信息
- Uint8 CopyLightP1; //備份交通燈狀態
- Uint8 CopyLightP3; //備份交通燈狀態
- Uint8 State = 0; //系統運行狀態標志位,0:正常運行;1:設置南北直行方向通行時間;2設置南北左轉通行時間
- //3:設置東西直行通行時間;4設置東西左轉通行時間
-
- //函數聲明
- void KeyScan(); //按鍵掃描
- void Display(); //數碼管動態顯示
- void InitTimer0(); //定時器0初始化,提供時間基準
- void FlashLED(); //控制交通燈的變化
- void ProcTime(); // 處理各個方向剩余時間和等待時間
- //主函數
- void main()
- {
- InitTimer0(); //定時器0初始化
- Init1602(); //初始化LCD1602
- while (1)
- {
- KeyScan(); //按鍵掃描
- FlashLED(); //led指示燈掃描
- if(flag_1S==1) //定時器計時達到1秒
- {
- flag_1S=0; //滿1秒標志清零
- Time_NS--; //南北東西通行時間各減1
- Time_WE--;
- ProcTime(); // 處理各個方向剩余時間和等待時間
- }
- }
- }
- void Timer0() interrupt 1 //定時器0中斷
- {
- TH0=(65536-20000)/256; //50ms一次中斷
- TL0=(65536-20000)%256;
- IntTimes++; //中斷次數計算器加一
- if(IntTimes>=50) //進中斷50次,即為1秒
- {
- IntTimes=0; //中斷次數計算器清0
- if(State == 0) //正常運行模式下倒計時減一
- flag_1S=1; //1秒標志位置一
- }
- }
- void InitTimer0() //定時器0初始化,提供時間基準
- {
- TMOD=0X01; //定時器0方式設置1
- TH0=(65536-20000)/256; //初值設置 20ms
- TL0=(65536-20000)%256; //初值設置
- ET0=1; //使能定時器0中斷
- TR0=1; //開定時器0
- EA=1; //開總中斷
- }
- void ProcTime() // 處理各個方向剩余時間和等待時間
- {
- /* 大于0代表剩余為通行時間,每秒減一;小于0代表為等待時間(負數),每秒加一 */
- if (RnTime_NS > 0)
- {
- RnTime_NS--;
- }
- else if(RnTime_NS < 0)
- {
- RnTime_NS++;
- }
-
- if (RnTime_EW > 0)
- {
- RnTime_EW--;
- }
- else if(RnTime_EW < 0)
- {
- RnTime_EW++;
- }
-
- if (RnLeftTime_NS > 0)
- {
- RnLeftTime_NS--;
- }
- else if(RnLeftTime_NS < 0)
- {
- RnLeftTime_NS++;
- }
-
- if (RnLeftTime_EW > 0)
- {
- RnLeftTime_EW--;
- }
- else if(RnLeftTime_EW < 0)
- {
- RnLeftTime_EW++;
- }
-
- if (RnPeopleTime_NS > 0)
- {
- RnPeopleTime_NS--;
- }
- else if(RnPeopleTime_NS < 0)
- {
- RnPeopleTime_NS++;
- }
-
- if (RnPeopleTime_EW > 0)
- {
- RnPeopleTime_EW--;
- }
- else if(RnPeopleTime_EW < 0)
- {
- RnPeopleTime_EW++;
- }
- }
- void Display() //lcd顯示顯示
- {
- /* 顯示南北方向信息 */
- if (DispState == 0)
- {
- Write1602_Str(0, 1, StrNS1, 16);// 屏幕第一行
- sprintf(StrNum," %4.2d%4.2d%4.2d",(int)RnTime_NS,(int)RnLeftTime_NS,(int)RnPeopleTime_NS);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if (DispState == 1)
- {
- Write1602_Str(0, 1, StrEW1, 16);//寫字符串
- sprintf(StrNum," %4.2d%4.2d%4.2d",(int)RnTime_EW,(int)RnLeftTime_EW,(int)RnPeopleTime_EW);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- }
- void FlashLED() //交通燈的變化
- {
- if(State == 0) //正常運行模式
- {
- if(Time_NS==0 || Time_WE==0) //南北或東西方向有時間為0
- {
- switch(index) //改變紅綠燈的狀態,狀態機
- {
- case 0: /* 南北方向直行綠燈、南北人行綠燈,南北左轉紅燈、東西直行紅燈、東西左轉紅燈 */
- {
- index=1; //下次進入時切換方向
- Time_NS = TimeGreen_NS; // 南北直行方向綠燈剩余時間
- Time_WE=TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2; //東西直行方向的等待時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnTime_NS = Time_NS;
- RnTime_EW = -(TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2);
- RnLeftTime_NS = -TimeYellow - RnTime_NS;
- RnLeftTime_EW = -(TimeGreen_EW + TimeYellow) + RnTime_EW;
- RnPeopleTime_NS = RnTime_NS; // 人行時間為對應方向的直行時間
- RnPeopleTime_EW = RnTime_EW;
-
- /* 南北方向直行綠燈、南北人行綠燈,南北左轉紅燈、東西直行紅燈、東西左轉紅燈 */
- /* 直行交通燈 */
- LedRedNS = 0; // 南北直行方向紅燈
- LedGreenNS = 1; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 0; // 南北人行紅燈
- LedPeopleGreenNS = 1; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 1: /* 南北方向直行黃燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西人行紅燈 */
- {
- index=2; //下次進入時切換方向
- Time_NS = TimeYellow; // 南北直行方向黃燈剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnTime_NS -= (TimeLeftGreen_NS + TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 4);
- RnPeopleTime_NS = RnTime_NS; // 人行時間為對應方向的直行時間
-
- /* 南北方向直行黃燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 0; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 1; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 2: /* 南北方向直行紅燈、南北人行紅燈,南北左轉綠燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
- {
- index=3; //下次進入時切換方向
- Time_NS = TimeLeftGreen_NS; // 南北左轉方向綠燈剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnLeftTime_NS += TimeLeftGreen_NS;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉綠燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 左轉交通燈 */
- LedLeftRedNS = 0; // 南北左轉方向紅燈
- LedLeftGreenNS = 1; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 3: /* 南北方向直行紅燈、南北人行紅燈,南北左轉黃燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
- {
- index=4; //下次進入時切換方向
- Time_NS = TimeYellow; // 南北左轉方向黃燈剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnLeftTime_NS -= (TimeGreen_EW + TimeLeftGreen_EW + TimeGreen_NS + TimeYellow * 4);
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉黃燈、東西直行紅燈、東西左轉紅燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 左轉交通燈 */
- LedLeftRedNS = 0; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 1;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 4: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西人行綠燈 */
- {
- index=5; //下次進入時切換方向
- Time_NS = TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 2; // 南北方向直行的等待時間
- Time_WE = TimeGreen_EW; //東西直行方向綠燈的剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnTime_EW += TimeGreen_EW;
- RnPeopleTime_EW = RnTime_EW;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西人行綠燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 0; // 東西直行方向紅燈
- LedGreenEW = 1; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 0; // 東西人行紅燈
- LedPeopleGreenEW = 1; // 東西人行綠燈
- }break;
- case 5: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行黃燈、東西左轉紅燈,東西人行紅燈 */
- {
- index=6; //下次進入時切換方向
- Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnTime_EW -= (TimeLeftGreen_EW + TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 4);
- RnPeopleTime_EW = RnTime_EW; // 人行時間為對應方向的直行時間
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行綠燈、東西左轉紅燈,東西左轉紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 0; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 1; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 1; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 6: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉綠燈,東西人行紅燈 */
- {
- index=7; //下次進入時切換方向
- Time_WE = TimeLeftGreen_EW; //東西直行方向黃燈的剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnLeftTime_EW += TimeLeftGreen_EW;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉綠燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 0; // 東西左轉方向紅燈
- LedLeftGreenEW = 1; // 東西左轉方向綠燈
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 7: /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉黃燈,東西人行紅燈 */
- {
- index=0; //下次進入時切換方向
- Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
-
- /* 計算各個方向的剩余時間和等待時間 */
- RnLeftTime_EW -= (TimeGreen_NS + TimeLeftGreen_NS + TimeGreen_EW + TimeYellow * 4);
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉紅燈、東西直行紅燈、東西左轉黃燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉方向紅燈
- LedLeftGreenNS = 0; // 南北左轉方向綠燈
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- LedLeftRedEW = 0; // 東西左轉方向紅燈
- LedLeftGreenEW = 0; // 東西左轉方向綠燈
- LedLeftYellowEW = 1;// 東西左轉方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
-
- default:break;
- }
- }
- Display(); //數碼管顯示剩余時間
-
- /* index==2或者index==4或者index==6或者index==0時處于黃燈狀態,黃燈閃爍 */
- if (index == 2)
- {
- /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
- if(IntTimes < 25)
- {
- LedYellowNS = 0; // 南北直行方向黃燈
- }
- else
- {
- LedYellowNS = 1; // 南北直行方向黃燈
- }
- }
- else if (index == 4)
- {
- /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
- if(IntTimes < 25)
- {
- LedLeftYellowNS = 0;// 南北左轉方向黃燈
- }
- else
- {
- LedLeftYellowNS = 1;// 南北左轉方向黃燈
- }
- }
- else if (index == 6)
- {
- /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
- if(IntTimes < 25)
- {
- LedYellowEW = 0; // 東西直行方向黃燈
- }
- else
- {
- LedYellowEW = 1; // 東西直行方向黃燈
- }
- }
- else if (index == 0)
- {
- /* IntTimes=50時為1秒,25為0.5秒,此處用于交通燈閃爍 */
- if(IntTimes < 25)
- {
- LedLeftYellowEW = 0;// 東西左轉方向黃燈
- }
- else
- {
- LedLeftYellowEW = 1;// 東西左轉方向黃燈
- }
- }
- }
- else if(State == 1) //設置南北直行時間
- {
- sprintf(StrNum,"%2.2d ",(int)TimeGreen_NS);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 2) //設置南北左轉時間
- {
- sprintf(StrNum," %2.2d ",(int)TimeGreen_EW);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 3) //設置東西直行時間
- {
- sprintf(StrNum," %2.2d ",(int)TimeLeftGreen_NS);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 4) //設置東西左轉時間
- {
- sprintf(StrNum," %2.2d",(int)TimeLeftGreen_EW);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- }
- void SetModel() //紅綠燈設置模式
- {
- if(State == 0) //當前為正常運行模式
- {
- State=1; //狀態切換為設置南北通行時間
- Write1602_Str(0, 1, Str, 16);// 屏幕第一行
- // CopyLightP1=P1; //備份指示燈狀態
- // CopyLightP3=P3; //備份指示燈狀態
- }
- else //當前為設置東西通行時間
- {
- State=0; //狀態切換為設置正常運行模式
- // P1=CopyLight; //還原交通燈狀態
- index=0; //交通燈重新啟動
- Time_NS=0;
- Time_WE=0;
-
- RnTime_NS = 0;
- RnTime_EW = 0;
- RnLeftTime_NS = 0;
- RnLeftTime_EW = 0;
- RnPeopleTime_NS = 0;
- RnPeopleTime_EW = 0;
- }
- }
- void ADDTime() //紅綠燈時間加
- {
- if(State==1) //當前為設置南北通行時間
- {
- if(TimeGreen_NS < 99)
- TimeGreen_NS++; //南北通行時間加一
- }
- else if(State==2) //當前為設置東西通行時間
- {
- if(TimeGreen_EW < 99)
- TimeGreen_EW++; //東西通行時間加一
- }
- else if(State==3) //當前為設置東西通行時間
- {
- if(TimeLeftGreen_NS < 99)
- TimeLeftGreen_NS++; //東西通行時間加一
- }
- else if(State==4) //當前為設置東西通行時間
- {
- if(TimeLeftGreen_EW < 99)
- TimeLeftGreen_EW++; //東西通行時間加一
- }
- }
- void SUBTime() //紅綠燈時間減
- {
- if(State==1) //當前為設置南北通行時間
- {
- if(TimeGreen_NS>1)
- TimeGreen_NS--; //南北通行時間加一
- }
- else if(State==2) //當前為設置東西通行時間
- {
- if(TimeGreen_EW>1)
- TimeGreen_EW--; //東西通行時間加一
- }
- else if(State==3) //當前為設置東西通行時間
- {
- if(TimeLeftGreen_NS>1)
- TimeLeftGreen_NS--; //東西通行時間加一
- }
- else if(State==4) //當前為設置東西通行時間
- {
- if(TimeLeftGreen_EW>1)
- TimeLeftGreen_EW--; //東西通行時間加一
- }
- }
- void MoveModel() // 移動
- {
- if (State > 0)
- {
- State++;
- if(State > 4)
- {
- State = 1;
- }
- }
- }
- void ChangeDisp() //切換顯示
- {
- if(State==0) //當前為正常運行模式
- {
- if (DispState == 0)
- {
- DispState = 1;
- }
- else if (DispState == 1)
- {
- DispState = 0;
- }
- }
- }
- void KeyScan() //按鍵掃描
- {
- if(KeyChangeDisp == 0) //設置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyChangeDisp == 0) //確認按鍵按下
- {
- ChangeDisp(); //切換顯示
- while(KeyChangeDisp == 0); //等待按鍵彈起
- }
- }
- if(KeySet == 0) //設置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeySet == 0) //確認按鍵按下
- {
- SetModel(); //切換顯示
- while(KeySet == 0); //等待按鍵彈起
- }
- }
- if(KeyMove == 0) //設置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyMove == 0) //確認按鍵按下
- {
- MoveModel(); //移動設置位置
- while(KeyMove == 0); //等待按鍵彈起
- }
- }
- if(KeyAdd == 0) //設置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyAdd == 0) //確認按鍵按下
- {
- ADDTime(); //紅綠燈時間加
- while(KeyAdd == 0); //等待按鍵彈起
- }
- }
- if(KeySub == 0) //設置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeySub == 0) //確認按鍵按下
- {
- SUBTime(); //紅綠燈時間減
- while(KeySub == 0); //等待按鍵彈起
- }
- }
- }
復制代碼
Keil5代碼與Proteus7與8.13仿真下載:
交通燈.rar
(93.07 KB, 下載次數: 35)
2023-6-8 10:06 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|