基本要求
(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仿真工程文件可到本帖附件中下载)
单片机源程序如下(注释非常详细):
- #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)
|