|
基本要求
(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仿真工程文件可到本帖附件中下載)
51hei.gif (150.86 KB, 下載次數(shù): 30)
下載附件
2023-6-8 17:17 上傳
單片機(jī)源程序如下(注釋非常詳細(xì)):
- #include "Common.h"
- #include "lcd1602.h"
- #include "stdio.h"
- //引腳定義
- sbit KeyChangeDisp = P2^3; //切換顯示按鍵
- sbit KeySet = P2^4; //設(shè)置模式按鍵
- 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;// 東西直行方向黃燈
- /* 左轉(zhuǎn)交通燈定義 */
- sbit LedLeftRedNS = P3^2; // 南北左轉(zhuǎn)方向紅燈
- sbit LedLeftGreenNS = P3^0; // 南北左轉(zhuǎn)方向綠燈
- sbit LedLeftYellowNS = P3^1;// 南北左轉(zhuǎn)方向黃燈
- sbit LedLeftRedEW = P3^5; // 東西左轉(zhuǎn)方向紅燈
- sbit LedLeftGreenEW = P3^3; // 東西左轉(zhuǎn)方向綠燈
- sbit LedLeftYellowEW = P3^4;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈定義 */
- sbit LedPeopleRedNS = P1^6; // 南北人行紅燈
- sbit LedPeopleGreenNS = P1^7; // 南北人行綠燈
- sbit LedPeopleRedEW = P3^6; // 東西人行紅燈
- sbit LedPeopleGreenEW = P3^7; // 東西人行綠燈
- /* 定義變量保存各方向的剩余時間,正數(shù)為剩余通行時間,負(fù)數(shù)為剩余等待時間 */
- char RnTime_NS = 0; //南北方向直行剩余時間
- char RnTime_EW = 0; //東西方向直行剩余時間
- char RnLeftTime_NS = 0; //南北方向左轉(zhuǎn)剩余時間
- char RnLeftTime_EW = 0; //東西方向左轉(zhuǎn)剩余時間
- char RnPeopleTime_NS = 0; //南北方向人行剩余時間
- char RnPeopleTime_EW = 0; //東西方向人行剩余時間
- //相關(guān)變量定義
- Uint8 TimeGreen_NS=5; //南北方向運(yùn)行時間
- Uint8 TimeGreen_EW=5; //東西方向運(yùn)行時間
- Uint8 TimeLeftGreen_NS=5; //南北左轉(zhuǎn)方向運(yùn)行時間
- Uint8 TimeLeftGreen_EW=5; //東西左轉(zhuǎn)方向運(yùn)行時間
- Uint8 TimeYellow = 3; //黃燈時間
- Uint8 index=0;
- Uint8 flag_1S; //1s時間基準(zhǔn)標(biāo)志
- Uint8 IntTimes=0; //記錄定時器中斷次數(shù)
- 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; // 顯示的狀態(tài),0為顯示南北方向信息,1為顯示東西方向信息
- Uint8 CopyLightP1; //備份交通燈狀態(tài)
- Uint8 CopyLightP3; //備份交通燈狀態(tài)
- Uint8 State = 0; //系統(tǒng)運(yùn)行狀態(tài)標(biāo)志位,0:正常運(yùn)行;1:設(shè)置南北直行方向通行時間;2設(shè)置南北左轉(zhuǎn)通行時間
- //3:設(shè)置東西直行通行時間;4設(shè)置東西左轉(zhuǎn)通行時間
-
- //函數(shù)聲明
- void KeyScan(); //按鍵掃描
- void Display(); //數(shù)碼管動態(tài)顯示
- void InitTimer0(); //定時器0初始化,提供時間基準(zhǔn)
- void FlashLED(); //控制交通燈的變化
- void ProcTime(); // 處理各個方向剩余時間和等待時間
- //主函數(shù)
- void main()
- {
- InitTimer0(); //定時器0初始化
- Init1602(); //初始化LCD1602
- while (1)
- {
- KeyScan(); //按鍵掃描
- FlashLED(); //led指示燈掃描
- if(flag_1S==1) //定時器計(jì)時達(dá)到1秒
- {
- flag_1S=0; //滿1秒標(biāo)志清零
- Time_NS--; //南北東西通行時間各減1
- Time_WE--;
- ProcTime(); // 處理各個方向剩余時間和等待時間
- }
- }
- }
- void Timer0() interrupt 1 //定時器0中斷
- {
- TH0=(65536-20000)/256; //50ms一次中斷
- TL0=(65536-20000)%256;
- IntTimes++; //中斷次數(shù)計(jì)算器加一
- if(IntTimes>=50) //進(jìn)中斷50次,即為1秒
- {
- IntTimes=0; //中斷次數(shù)計(jì)算器清0
- if(State == 0) //正常運(yùn)行模式下倒計(jì)時減一
- flag_1S=1; //1秒標(biāo)志位置一
- }
- }
- void InitTimer0() //定時器0初始化,提供時間基準(zhǔn)
- {
- TMOD=0X01; //定時器0方式設(shè)置1
- TH0=(65536-20000)/256; //初值設(shè)置 20ms
- TL0=(65536-20000)%256; //初值設(shè)置
- ET0=1; //使能定時器0中斷
- TR0=1; //開定時器0
- EA=1; //開總中斷
- }
- void ProcTime() // 處理各個方向剩余時間和等待時間
- {
- /* 大于0代表剩余為通行時間,每秒減一;小于0代表為等待時間(負(fù)數(shù)),每秒加一 */
- 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) //正常運(yùn)行模式
- {
- if(Time_NS==0 || Time_WE==0) //南北或東西方向有時間為0
- {
- switch(index) //改變紅綠燈的狀態(tài),狀態(tài)機(jī)
- {
- case 0: /* 南北方向直行綠燈、南北人行綠燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)紅燈 */
- {
- index=1; //下次進(jìn)入時切換方向
- Time_NS = TimeGreen_NS; // 南北直行方向綠燈剩余時間
- Time_WE=TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 2; //東西直行方向的等待時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- 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; // 人行時間為對應(yīng)方向的直行時間
- RnPeopleTime_EW = RnTime_EW;
-
- /* 南北方向直行綠燈、南北人行綠燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)紅燈 */
- /* 直行交通燈 */
- LedRedNS = 0; // 南北直行方向紅燈
- LedGreenNS = 1; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 0; // 南北人行紅燈
- LedPeopleGreenNS = 1; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 1: /* 南北方向直行黃燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西人行紅燈 */
- {
- index=2; //下次進(jìn)入時切換方向
- Time_NS = TimeYellow; // 南北直行方向黃燈剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnTime_NS -= (TimeLeftGreen_NS + TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 4);
- RnPeopleTime_NS = RnTime_NS; // 人行時間為對應(yīng)方向的直行時間
-
- /* 南北方向直行黃燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 0; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 1; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 2: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)綠燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
- {
- index=3; //下次進(jìn)入時切換方向
- Time_NS = TimeLeftGreen_NS; // 南北左轉(zhuǎn)方向綠燈剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnLeftTime_NS += TimeLeftGreen_NS;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)綠燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 左轉(zhuǎn)交通燈 */
- LedLeftRedNS = 0; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 1; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 3: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)黃燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
- {
- index=4; //下次進(jìn)入時切換方向
- Time_NS = TimeYellow; // 南北左轉(zhuǎn)方向黃燈剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnLeftTime_NS -= (TimeGreen_EW + TimeLeftGreen_EW + TimeGreen_NS + TimeYellow * 4);
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)黃燈、東西直行紅燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 左轉(zhuǎn)交通燈 */
- LedLeftRedNS = 0; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 1;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 4: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西人行綠燈 */
- {
- index=5; //下次進(jìn)入時切換方向
- Time_NS = TimeGreen_EW + TimeLeftGreen_EW + TimeYellow * 2; // 南北方向直行的等待時間
- Time_WE = TimeGreen_EW; //東西直行方向綠燈的剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnTime_EW += TimeGreen_EW;
- RnPeopleTime_EW = RnTime_EW;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西人行綠燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 0; // 東西直行方向紅燈
- LedGreenEW = 1; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 0; // 東西人行紅燈
- LedPeopleGreenEW = 1; // 東西人行綠燈
- }break;
- case 5: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行黃燈、東西左轉(zhuǎn)紅燈,東西人行紅燈 */
- {
- index=6; //下次進(jìn)入時切換方向
- Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnTime_EW -= (TimeLeftGreen_EW + TimeGreen_NS + TimeLeftGreen_NS + TimeYellow * 4);
- RnPeopleTime_EW = RnTime_EW; // 人行時間為對應(yīng)方向的直行時間
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行綠燈、東西左轉(zhuǎn)紅燈,東西左轉(zhuǎn)紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 0; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 1; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 1; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 6: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)綠燈,東西人行紅燈 */
- {
- index=7; //下次進(jìn)入時切換方向
- Time_WE = TimeLeftGreen_EW; //東西直行方向黃燈的剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnLeftTime_EW += TimeLeftGreen_EW;
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)綠燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 0; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 1; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 0;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
- case 7: /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)黃燈,東西人行紅燈 */
- {
- index=0; //下次進(jìn)入時切換方向
- Time_WE = TimeYellow; //東西直行方向黃燈的剩余時間
-
- /* 計(jì)算各個方向的剩余時間和等待時間 */
- RnLeftTime_EW -= (TimeGreen_NS + TimeLeftGreen_NS + TimeGreen_EW + TimeYellow * 4);
-
- /* 南北方向直行紅燈、南北人行紅燈,南北左轉(zhuǎn)紅燈、東西直行紅燈、東西左轉(zhuǎn)黃燈,東西人行紅燈 */
- /* 直行交通燈 */
- LedRedNS = 1; // 南北直行方向紅燈
- LedGreenNS = 0; // 南北直行方向綠燈
- LedYellowNS = 0; // 南北直行方向黃燈
- LedRedEW = 1; // 東西直行方向紅燈
- LedGreenEW = 0; // 東西直行方向綠燈
- LedYellowEW = 0; // 東西直行方向黃燈
- /* 直行交通燈 */
- LedLeftRedNS = 1; // 南北左轉(zhuǎn)方向紅燈
- LedLeftGreenNS = 0; // 南北左轉(zhuǎn)方向綠燈
- LedLeftYellowNS = 0;// 南北左轉(zhuǎn)方向黃燈
- LedLeftRedEW = 0; // 東西左轉(zhuǎn)方向紅燈
- LedLeftGreenEW = 0; // 東西左轉(zhuǎn)方向綠燈
- LedLeftYellowEW = 1;// 東西左轉(zhuǎn)方向黃燈
- /* 人行道交通燈 */
- LedPeopleRedNS = 1; // 南北人行紅燈
- LedPeopleGreenNS = 0; // 南北人行綠燈
- LedPeopleRedEW = 1; // 東西人行紅燈
- LedPeopleGreenEW = 0; // 東西人行綠燈
- }break;
-
- default:break;
- }
- }
- Display(); //數(shù)碼管顯示剩余時間
-
- /* index==2或者index==4或者index==6或者index==0時處于黃燈狀態(tài),黃燈閃爍 */
- 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;// 南北左轉(zhuǎn)方向黃燈
- }
- else
- {
- LedLeftYellowNS = 1;// 南北左轉(zhuǎn)方向黃燈
- }
- }
- 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;// 東西左轉(zhuǎn)方向黃燈
- }
- else
- {
- LedLeftYellowEW = 1;// 東西左轉(zhuǎn)方向黃燈
- }
- }
- }
- else if(State == 1) //設(shè)置南北直行時間
- {
- sprintf(StrNum,"%2.2d ",(int)TimeGreen_NS);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 2) //設(shè)置南北左轉(zhuǎn)時間
- {
- sprintf(StrNum," %2.2d ",(int)TimeGreen_EW);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 3) //設(shè)置東西直行時間
- {
- sprintf(StrNum," %2.2d ",(int)TimeLeftGreen_NS);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- else if(State == 4) //設(shè)置東西左轉(zhuǎn)時間
- {
- sprintf(StrNum," %2.2d",(int)TimeLeftGreen_EW);
- Write1602_Str(0, 0, StrNum, 16);// 屏幕第二行
- }
- }
- void SetModel() //紅綠燈設(shè)置模式
- {
- if(State == 0) //當(dāng)前為正常運(yùn)行模式
- {
- State=1; //狀態(tài)切換為設(shè)置南北通行時間
- Write1602_Str(0, 1, Str, 16);// 屏幕第一行
- // CopyLightP1=P1; //備份指示燈狀態(tài)
- // CopyLightP3=P3; //備份指示燈狀態(tài)
- }
- else //當(dāng)前為設(shè)置東西通行時間
- {
- State=0; //狀態(tài)切換為設(shè)置正常運(yùn)行模式
- // P1=CopyLight; //還原交通燈狀態(tài)
- 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) //當(dāng)前為設(shè)置南北通行時間
- {
- if(TimeGreen_NS < 99)
- TimeGreen_NS++; //南北通行時間加一
- }
- else if(State==2) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeGreen_EW < 99)
- TimeGreen_EW++; //東西通行時間加一
- }
- else if(State==3) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeLeftGreen_NS < 99)
- TimeLeftGreen_NS++; //東西通行時間加一
- }
- else if(State==4) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeLeftGreen_EW < 99)
- TimeLeftGreen_EW++; //東西通行時間加一
- }
- }
- void SUBTime() //紅綠燈時間減
- {
- if(State==1) //當(dāng)前為設(shè)置南北通行時間
- {
- if(TimeGreen_NS>1)
- TimeGreen_NS--; //南北通行時間加一
- }
- else if(State==2) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeGreen_EW>1)
- TimeGreen_EW--; //東西通行時間加一
- }
- else if(State==3) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeLeftGreen_NS>1)
- TimeLeftGreen_NS--; //東西通行時間加一
- }
- else if(State==4) //當(dāng)前為設(shè)置東西通行時間
- {
- if(TimeLeftGreen_EW>1)
- TimeLeftGreen_EW--; //東西通行時間加一
- }
- }
- void MoveModel() // 移動
- {
- if (State > 0)
- {
- State++;
- if(State > 4)
- {
- State = 1;
- }
- }
- }
- void ChangeDisp() //切換顯示
- {
- if(State==0) //當(dāng)前為正常運(yùn)行模式
- {
- if (DispState == 0)
- {
- DispState = 1;
- }
- else if (DispState == 1)
- {
- DispState = 0;
- }
- }
- }
- void KeyScan() //按鍵掃描
- {
- if(KeyChangeDisp == 0) //設(shè)置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyChangeDisp == 0) //確認(rèn)按鍵按下
- {
- ChangeDisp(); //切換顯示
- while(KeyChangeDisp == 0); //等待按鍵彈起
- }
- }
- if(KeySet == 0) //設(shè)置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeySet == 0) //確認(rèn)按鍵按下
- {
- SetModel(); //切換顯示
- while(KeySet == 0); //等待按鍵彈起
- }
- }
- if(KeyMove == 0) //設(shè)置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyMove == 0) //確認(rèn)按鍵按下
- {
- MoveModel(); //移動設(shè)置位置
- while(KeyMove == 0); //等待按鍵彈起
- }
- }
- if(KeyAdd == 0) //設(shè)置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeyAdd == 0) //確認(rèn)按鍵按下
- {
- ADDTime(); //紅綠燈時間加
- while(KeyAdd == 0); //等待按鍵彈起
- }
- }
- if(KeySub == 0) //設(shè)置按鍵按下
- {
- DelayMs(10); //延時消抖
- if(KeySub == 0) //確認(rèn)按鍵按下
- {
- SUBTime(); //紅綠燈時間減
- while(KeySub == 0); //等待按鍵彈起
- }
- }
- }
復(fù)制代碼
Keil5代碼與Proteus7與8.13仿真下載:
交通燈.rar
(93.07 KB, 下載次數(shù): 35)
2023-6-8 10:06 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|