源码获取
主要内容:
在本项目中,微控制器AT89C51用作中心器件来设计交通灯控制器。 该系统实用性强、操作简单、可扩展性强。 本设计系统由最小单片机系统、交通灯状态显示系统、LED数码显示系统、复位电路和按键操作电路组成。 除了基本的红绿灯功能外,系统还具有倒计时和紧急处理功能,可以更好地模拟路口可能出现的情况。 软件采用C语言编写,主要编写主程序、LED数码管显示程序、中断程序、延时程序等。整机调试后,实现了路口红绿灯的模拟。
基本要求:
1、熟悉单片交通灯设计; 进行需求分析并设计路口交通灯;
2、初步掌握单片机设计路口交通灯的基本方法;
3、进行交通灯设计、分析、模型搭建、功能体现、详细设计
4、交通信号灯必须基本满足实际需要,符合实际。
主要参考资料:
[1] 李建中. 单片机原理及应用[M]. 西安电子科技大学出版社,2010。
[2] 周航慈. 单片机应用设计技术[M]. 北京:北京航空航天大学出版社,2005。
[3] 何利民. 单片机高级教程[M]. 北京:北京航空航天大学出版社,2001。
[4] 夏继强. 单片机实验与实用教程[M]. 北京:北京航空航天大学出版社,2001。
[5] 赵小安. MCS-51单片机原理及应用[M]. 天津:天津大学出版社,2001。
截止日期:
导师签名:
课程负责人签名:
年月日
概括
红绿灯安装在各个路口,已成为疏导交通的有效手段。 单片机是微型计算机的一个重要分支,特别适用于控制领域。 因此,它也被称为微控制器。 完成了基于单片机的交通灯控制系统。 设计。 在本课程的硬件设计中,我们使用单片机89C51。 使用P1口设置红、黄、绿灯的控制。 用PO口控制数码管的十位,用P2口控制数码管的个位。 P3口作为特殊功能键使用。 单片机系统采用直流5V供电。 系统功能为:以89C51系列单片机为控制核心,设计制作了交通控制系统。 东、西、南、北四个方向均有直达交通指标。
基于对系统的分析,我们采用了性能相对优异的LED动态循环方案进行设计。 设计包括硬件和软件两部分。 硬件部分包括单片机时钟电路、时间显示、交通灯显示。 时间显示采用两位数共阴极数码管。 软件采用模块化设计方法,主要分为四个部分:主程序、定时中断、中断服务子程序、倒计时显示子程序、红绿灯模拟显示子程序。
关键词:单片机; 红绿灯; 控制
目录
总结1
1. 概述 3
项目设计原则:3
项目开发目的:3
项目开发意义:3
2、可行性分析及需求分析4
可行性研究4
经济可行性4
技术可行性4
运营可行性4
3 系统方案设计 5
3.1 设计思路5
3.2 总体设计框图5
4 硬件设计 6
4.1 硬件选型 6
4.2 系统硬件电路原理详图7
4.3 实际连接 7
4.3.1 交通灯模拟电路7
4.3.2 使用工具:8个
5 软件设计 9
5.1 软件功能设计 9
5.2 软件流程设计 9
5.2.1 主流程图 9
5.2.2 按钮判断 10
5.2.3 数码管显示时间10
6 软件调试 11
6.1 单元测试 11
6.1.1 显示模块测试 11
6.1.2 按键模块测试 11
6.2 总体测试 11
总结13
参考文献14
1 概述
项目设计原则:
实际红绿灯分为东南、西北、左右转弯四个方向。 本次课程的设计涉及简单的红绿灯,不包括左转和右转,只包括东西向和南北向直行。 原理比较简单。 包括绿灯、红灯的初始化、两个全黄灯的间隔以及东西绿灯、南北红灯、南北红灯、东西绿灯四种状态条件。 首先,初始状态是全红灯; 然后南北绿灯亮,黄灯全部亮,东西绿灯亮,黄灯全部亮,如此循环。
项目开发目的:
通过单片机课程设计,我们熟练掌握C语言编程方法,理论联系实际,提高我们的大脑和动手能力。 它培养我们综合运用课程中所学的单片机基础知识,独立开展单片机应用的技术开发工作,掌握单片机程序设计、调试和应用电路设计、分析和调试测试。 通过交通灯控制系统的设计,我们将掌握定时器/计数器和中断的使用,并编写简单的程序,最终提高我们的逻辑抽象能力。
项目开发意义:
交通控制研究的发展主要是为了解决由于车辆的增加而导致的人类交通日益拥堵的问题。 受限于道路建设的暂时短缺和交通运输工具的快速增长,这就需要安全高效地使用更多有限的车辆。 避免因乱、抢等管制原因造成道路资源不必要的拥堵甚至瘫痪。 此外,还需要根据整条交通线路的车辆数量,实时调整、分流多条线路的分流。
交通网络是城市的动脉,象征着一个城市的产业发展水平。 交通运输关系到人们的财产、安全、时间等利益。 只有保证交通线路畅通安全,才能保证出行舒适、物流准时,乃至生活通道的延伸。
可行性分析和需求分析
可行性研究
本阶段通过对系统目标的初步研究和分析,提出并论证可行性解决方案。 要求从整体系统出发,对技术、经济、条件、商业、国家政策、法律等方面进行分析论证,判断建设项目是否可行,为相关经营活动的正确开展提供科学依据。 目的是确定这个设计方案是否能够最方便人们、更容易接受、更容易使用。 主要从技术可行性、经济可行性和操作可行性三个方面进行分析。
经济可行性
开发该系统所需的相关数据可以通过现有的路口交通信号灯进行调查和采集,其他所需的应用软硬件系统也很容易获得。 因此,开发成本较低。 使用该系统后,与传统方法相比,具有高效率、低成本、高质量的特点,可以节省大量的人力、物力、财力。 因此,从经济角度来看,该系统是可行的。
技术可行性
开发工具:Keil
变形杆菌
系统环境:window 10
系统实现依赖于比较熟悉的C语言,暂时不存在技术问题。
操作可行性
系统由工作人员操作,界面干净整洁,操作简单。 工作人员只需询问控制开关及其功能,无需掌握单片机、C语言等相关知识。
随着计算机技术的飞速发展以及计算机在企业管理中的应用和普及,利用计算机实施道路交通管理已成为一种趋势。 以路口红绿灯为对象,交通管理必须面对大量的车辆,道路上的交通安全需要进行路线设计,以提高管理效率。 通过该系统,可以实现交通的规范化管理、科学的统计以及安全高效地处理交通拥堵等情况,从而减少事故工作的工作量。
各个路口车辆、行人较多,发生交通事故的可能性较大。 规范合理地处理交通非常有必要。 按照传统方法,工作量比较大。
每天发生的事情变幻莫测、数量众多,用传统方式处理起来很麻烦。
节假日、春节等节假日,人流量大,流量处理压力大。 如果有这样的交通灯设计,信息处理就能高效地满足人们的出行和需求。
对于工作人员来说,遇到紧急情况可以及时进行紧急按钮控制,安全性比较高。
系统功能分析:
红灯时长和绿灯时长可以通过按钮设置,即按钮栏最上面的4个按钮。 当按下这 4 个按钮之一时,将进入持续时间设置功能。 设置完成后,按底部两个按钮(紧急控制按钮)任意一个即可退出此功能。
有紧急控制功能。 按紧急控制按钮后,进入该功能,红灯或绿灯常亮,数码管关闭。 当您按下持续时间控制按钮(即顶部 4 个按钮)时,您可以退出此功能。
3 系统方案设计
3.1 设计思路
为了模拟路口的交通信号灯,我们首先在网上收集相关信息,然后到实际的交通路口观察交通信号灯的工作情况,然后用仿真软件进行模拟,最后进行模拟测试实际的微控制器。
本设计的时间控制是使用AT89C51定时器进行的。 定时器初始值设置为46080(由于晶振为11.0592,所以记录次数应为46080。定时器每50000微秒发起一次中断),记录20次。 中断标志为1s。 同时通过IO口的电平转换来检测按钮来确定相应的功能。 用数码管显示相应的时间。
3.2 总体设计框图
开始执行
检查按键
处理按键程序
计时器
是否启动
是的
数码管显示程序启动
图3-1 总体设计图
4 硬件设计
4.1 硬件选型
微控制器特点:
(1)集成度高、体积小、可靠性高——单片机将各种功能部件集成在一块晶振芯片上。 它具有集成度高、体积最小的特点。 芯片本身是根据工业测控环境的要求而设计的。 内部布线很短,其抗工业噪声性能比通用CPU更好。 单片机的程序指令、常量和表格都固化在ROM中,不易损坏。 多路信号通道集中在一颗芯片上,可靠性高。
(2)控制功能强 为了满足对对象的控制要求,单片机的指令系统具有极其丰富的条件:分支转移能力、逻辑运算和I/0口的位处理能力,非常适合专门的应用。控制功能。
(3)低电压、低功耗,易于生产便携式产品。 为了满足在便携式系统中的广泛使用,许多微控制器中的工作电压只有1.8V~3.6V,工作电流也只有几百微安。
(4)易于扩展的芯片包含计算机正常运行所必需的元件。 芯片外部有许多用于扩展的三总线和并行、串行输入输出引脚,可以方便地组成各种规模的计算机应用系统。
(5)优异的性价比——单片机的性能极高。 为了提高速度和运行效率,微控制器已经开始使用RISC流水线和DSP等技术。 微控制器的寻址能力也突破了64KB的限制,有的可以达到1MB、16MB。 片上ROM容量可达62MB,RAM容量可达2MB。 由于单片机的广泛使用,销量巨大。 各大公司的商业竞争使得价格非常低,其性价比极高。
4.2 系统硬件电路原理详图
图 4-1 硬件电路图
4.3 实际连接
4.3.1 交通灯模拟电路
图4-2 模拟仿真电路图
4.3.2 使用的工具:
图4-3 工具图
5 软件设计
5.1 软件功能设计
利用单片机的定时器产生精确的时钟信号来控制时间并控制路口红、黄、绿灯交替亮灭。 并且采用共阴极两位LED数码管,始终显示当前路口红灯或绿灯的持续时间。 可以通过按钮设置两个方向的通行时间,并可以控制路口红绿灯的持续时间,从而模拟现实中不同时间段不同的交通流量并智能控制时间,从而控制路口的交通路口更加合理,改善道路交通。 效率、系统启动、停止和复位也由按钮控制。
5.2 软件流程设计
5.2.1 主流程图
图5-1 主流程图
5.2.2 按键判断
图5-2 按钮判断图
5.2.3 数码管显示时间
一个中断程序
N值自动调整 时间变量N--
是的
否 判断N是否在
合理值范围
执行数码管显示程序 秒时间=N
+秒时间=N/10
图5-3 数码管显示时序图
6 软件调试
6.1 单元测试
6.1.1 显示模块测试
首先将数码管按要求连接到硬件电路上,然后用单片机控制,看能否控制数码管显示任意组合。 如果测试通过,则将调试交通灯程序代码。 如果失败,就会检查问题,是硬件问题还是软件问题。
然后连接6个LED灯来模拟交通灯。 由于南北方向和东西方向的情况相同,所以我们只使用一组LED。 连接好硬件电路后,用万用表的测试通断设置来检查各个LED的好坏。 如果出现问题,请更换 LED。 如果没有问题的话,就去软件里调试一下。
最后,中断后,扫描一次数码管,看数码管显示是否良好,消隐是否完成。 测试完成后,如果确认正确,则进行下一步测试。
6.1.2 按键模块测试
将按钮连接到电路后,用万用表的测试通断设置来检查按下每个按钮时按钮是否已连接。 如果已连接,则说明按钮电路的硬件正确。 在软件程序中进行测试。 每个按钮检测程序都有延迟。 短时间检测按键状态。 若按键状态不变,则判断执行按键程序。 若延时后按键状态消失,则判断系统供电抖动,不予处理。
6.2 总体测试
程序构建完成后,基于硬件进行最终测试。 使用按钮控制时间加减。 然后观察程序中的Bug,并进行各种尝试,尽可能地消除程序中的Bug。 比如如果时间减少到0,或者如果时间加到数码管显示的最大值如何处理,这是我们程序中需要考虑的问题。 然后我们检测程序控制中断时的时间与实际时间的差异,并尝试调整时间,使之没有差距。 这也是程序控制与现实结合,达到误差标准后,程序运行,需要较长的持续时间。 如果出现问题,必须分析问题的原因,是硬件问题还是软件BUG。 问题解决后,十字路口红绿灯设计成功。
实验结果如下:
图6-1 操作实现图
总结
在这次课程设计中,我学到了很多东西,更好地掌握了单片机设计方面的一些知识。 不可否认,这个课程设计让我深受感动。 通过这次课程设计,我掌握了单片机和C语言的结合,学会了在Keil和Proteus中运行程序和观察仿真效果,遇到错误并查询和解决。 最终,该计划成功了。 运行它并得到正确的结果。
在这次难得的课程设计过程中,锻炼了我的思维和动手能力。 通过选题和电路设计的过程,加强了我思维的完整性和现实生活联系的可行性。 在方案设计选型和芯片选型方面,培养了我们对单片机的综合应用能力,对单片机各个引脚的功能有了更深入的了解。 也锻炼了我们个人查阅技术资料的能力、动手能力、发现问题、解决问题的能力。 并且我们精通相关设备的性能和测试方法。
这也激发了我以后学习的兴趣,对我以后的学习有很大的帮助。 当我在设计过程中遇到一些问题时,同学们也细心地给我解释。 非常感谢。 我也明白了学习的重要性,理论知识与实践知识相结合的好处,学会了坚持、耐心和努力。 更重要的是如何将所学到的知识运用到实践中。 我认为课程设计过程非常重要。 我学到了很多,也收获了很多。 这也是一个从理论到实际应用的过程。 所以我觉得这个课程设计有很多好处。
确实,人需要不断的训练。 在这次课程设计的培训中,我也体会到了今后的辛苦,所以我应该更加努力,为美好的明天而奋斗。
参考
[1] 李建中. 单片机原理及应用[M]. 西安电子科技大学出版社,2010。
[2] 周航慈. 单片机应用设计技术[M]. 北京:北京航空航天大学出版社,2005。
[3] 何利民. 单片机高级教程[M]. 北京:北京航空航天大学出版社,2001。
[4] 夏继强. 单片机实验与实用教程[M]. 北京:北京航空航天大学出版社,2001。
[5] 赵小安. MCS-51单片机原理及应用[M]. 天津:天津大学出版社,2001。
[6]杨庆梅,孙建民。 传感器与测试技术[M]. 哈尔滨:哈尔滨工程大学出版社,2005。
[7] 范敬言. 传感器应用与检测技术[M]. 北京:机械工业出版社,2005。
[8] 李光地. 单片机基础知识[M]. 北京:北京航空航天大学出版社,1999。
附录:
#include
//数码管选择位
sbit EW_1=P1^0;
sbit EW_2=P1^1;
sbit NS_1=P1^2;
sbit NS_2=P1^3;
sbit add_red_time=P1^4; //加红灯时间按钮
sbit add_green_time=P1^5; //加绿灯时间按钮
sbit reduce_red_time=P1^6; //减红灯时间按钮
sbit reduce_green_time=P1^7; //减绿灯时间按钮
sbit NS_led=P2^6; //南北向灯紧急控制按钮
sbit EW_led=P2^7; //东西向灯紧急控制按钮
sbit EW_red=P2^0; //东西向红灯
sbit EW_green=P2^1; //东西向绿灯
sbit EW_yellow=P2^2; //东西向黄灯
sbit NS_red=P2^3; //南北向红灯
sbit NS_green=P2^4; //南北向绿灯
sbit NS_yellow=P2^5; //南北向黄灯
char count=0; //计数,count=20表示1s
char red_time=30; //红灯停留时间
char green_time=25; //绿灯停留时间
char yellow_time=0; //黄灯停留时间
char NS_second=0; //南北红绿灯秒计时
char EW_second=0; //东西红绿灯秒计时
char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管段码表,仿真中用的是共阴数码管,所以使用时需对段码取反
char display_data[4]={0}; //show_data[0]显示南北计时十位,show_data[1]显示南北计时个位,show_data[2]显示东西计时十位,show_data[3]显示东西计时个位
char temp_data[4]={0};
char NS_R_G_mode=0; //南北红绿灯亮模式 0 红灯 1 绿灯 2 黄灯
char EW_R_G_mode=1; //东西红绿灯亮模式 0 红灯 1 绿灯 2 黄灯
bit NS_R_G_flag=0; //南北红绿灯标识位 0 红灯 1 绿灯
bit EW_R_G_flag=0; //东西红绿灯标识位 0 红灯 1 绿灯
void delay(unsigned int i) //简单延时
{
while(i--);
}
void Timer_init() //定时器初始化
{
//定时50ms
TMOD = 0x01; //定时器方式1
TH0 = 0x3C; //定时器赋初值
TL0 = 0xB0;
EA = 1; //开启总中断
ET0 = 1; //开启定时器中断
TR0 = 1; //开启定时器
}
void Init() //系统初始化
{
P0=0x00;
P2=0x00;
EW_1=1;
EW_2=1;
NS_1=1;
NS_2=1;
NS_led=1;
EW_led=1;
NS_second=red_time; //默认初始时南北向灯亮红灯,并赋红灯时长
EW_second=green_time; //默认初始时东西向灯亮绿灯,并赋绿灯时长
yellow_time=red_time-green_time;//黄灯时间为红灯时间与绿灯时间差
Timer_init();
}
void NS_SMG_drive(char *buff) //南北向数码管驱动
{
//显示十位
NS_1=0;
NS_2=1;
P0=~smgduan[buff[0]]; //段码取反
delay(5); //间隔一段时间扫描
P0=0x00; //消隐
//显示个位
NS_1=1;
NS_2=0;
P0=~smgduan[buff[1]];
delay(5);
P0=0x00;
//关闭南北向数码管
NS_1=1;
NS_2=1;
}
void EW_SMG_drive(char *buff) //东西向数码管驱动
{
//显示十位
EW_1=0;
EW_2=1;
P0=~smgduan[buff[2]]; //段码取反
delay(5); //间隔一段时间扫描
P0=0x00; //消隐
//显示个位
EW_1=1;
EW_2=0;
P0=~smgduan[buff[3]];
delay(5);
P0=0x00;
//关闭东西向数码管
EW_1=1;
EW_2=1;
}
void data_del(char *buff,char data1,char data2) //数据处理
{
buff[0]=data1/10; //取data1的十位
buff[1]=data1%10; //取data1的个位
buff[2]=data2/10; //取data2的十位
buff[3]=data2%10; //取data2的个位
}
void Time_del() //计时处理
{
if(count>=20) //判断是否满1s
{
NS_second--; //南北向灯计时自减
EW_second--; //东北向灯计时自减
switch(NS_R_G_mode) //南北向灯
{
case 0: //红灯
{
if(NS_second<0)
{
NS_second=green_time; //开始绿灯倒计时
NS_R_G_mode=1; //红灯亮完绿灯亮
}
}break;
case 1: //绿灯
{
if(NS_second<0)
{
NS_second=yellow_time; //开始黄灯倒计时
NS_R_G_mode=2; //绿灯亮完黄灯亮
}
}break;
case 2: //黄灯
{
if(NS_second<0)
{
NS_second=red_time; //开始红灯到计时
NS_R_G_mode=0; //黄灯亮完红灯亮
}
}break;
default:break;
}
switch(EW_R_G_mode) //东西向灯
{
case 0: //红灯
{
if(EW_second<0)
{
EW_second=green_time; //开始绿灯倒计时
EW_R_G_mode=1; //红灯亮完绿灯亮
}
}break;
case 1: //绿灯
{
if(EW_second<0)
{
EW_second=yellow_time; //开始黄灯倒计时
EW_R_G_mode=2; //绿灯亮完黄灯亮
}
}break;
case 2: //黄灯
{
if(EW_second<0)
{
EW_second=red_time; //开始红灯倒计时
EW_R_G_mode=0; //黄灯亮完红灯亮
}
}break;
default:break;
}
count=0; //计数值清零
}
}
void R_G_Y_led() //红绿灯驱动
{
switch(NS_R_G_mode) //南北向
{
case 0: //红灯
{
NS_yellow=0; //黄灯灭
NS_red=1; //红灯亮
}break;
case 1: //绿灯
{
NS_red=0; //红灯灭
NS_green=1; //绿灯亮
}break;
case 2: //黄灯
{
NS_green=0; //绿灯灭
if(count<10) //黄灯以1hz频率闪烁
NS_yellow=1;
else
NS_yellow=0;
}break;
default:break;
}
switch(EW_R_G_mode) //东西向
{
case 0: //红灯
{
EW_yellow=0; //黄灯灭
EW_red=1; //红灯亮
}break;
case 1: //绿灯
{
EW_red=0; //红灯灭
EW_green=1; //绿灯亮
}break;
case 2: //黄灯
{
EW_green=0; //绿灯灭
if(count<10) //黄灯以1hz频率闪烁
EW_yellow=1;
else
EW_yellow=0;
}break;
default:break;
}
}
void Set_time() //设置红绿灯亮的时长
{
if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//设置红绿灯时长时任一设置按钮都可触发
{
TR0 = 0; //关闭定时器
P2=0x00; //清零P2寄存器
EW_led=1; //EW_led、NS_led引脚也在P2寄存器内,但是后面需要这两个按钮结束设置红绿灯时长任务,故而这两个引脚要拉高
NS_led=1;
while(1)
{
data_del(temp_data,red_time,green_time);//显示当前红绿灯时长
NS_SMG_drive(temp_data);
EW_SMG_drive(temp_data);
if(add_red_time==0) //判断加红灯时间按钮是否按下
{
delay(5); //消抖
if(add_red_time==0)
{
red_time++; //红灯时间自加
if(red_time>99) //限制红灯时间最大值为99
red_time=99;
data_del(temp_data,red_time,red_time);//南北向数码管显示红灯时长
NS_SMG_drive(temp_data);
}while(!add_red_time); //等待加红灯时间按钮弹起
}
if(add_green_time==0) //判断加绿灯时间按钮是否按下
{
delay(5);
if(add_green_time==0)
{
green_time++; //绿灯时间自加
if(green_time>95) //限制绿灯时间最大值95
green_time=95;
data_del(temp_data,green_time,green_time);//东西向数码管显示绿灯时长
EW_SMG_drive(temp_data);
}while(!add_green_time); //等待加绿灯时间按钮弹起
}
if(reduce_red_time==0) //判断减红灯时间按钮是否按下
{
delay(5);
if(reduce_red_time==0)
{
red_time--; //红灯时间自减
if(red_time<10) //限制红灯时间最小值10
red_time=10;
data_del(temp_data,red_time,red_time);
NS_SMG_drive(temp_data);
}while(!reduce_red_time); //等待减红灯时间按钮弹起
}
if(reduce_green_time==0) //判断减绿灯时间按钮是否按下
{
delay(5);
if(reduce_green_time==0)
{
green_time--; //绿灯时间自减
if(green_time<5) //限制绿灯时间最小值5
green_time=5;
data_del(temp_data,green_time,green_time);
EW_SMG_drive(temp_data);
}while(!reduce_green_time); //等待减绿灯时间按钮弹起
}
if((NS_led==0)||(EW_led==0)) //任一紧急控制按钮按下则结束设置红路灯时长任务
{
break;
}
}while((!NS_led)||(!EW_led)); //等待紧急控制按钮弹起
TR0 = 1; //开启定时器
yellow_time=red_time-green_time; //更新黄灯时间
}
}
void Urgent() //红绿灯紧急控制
{
if((NS_led==0)||(EW_led==0)) //任一紧急控制按钮按下触发
{
TR0 = 0; //关闭定时器
P2=0x00;
EW_led=1;
NS_led=1;
EW_1=1; //关闭所有数码管
EW_2=1;
NS_1=1;
NS_2=1;
while((!NS_led)||(!EW_led)); //判断紧急控制按钮按是否弹起
while(1)
{
if(NS_R_G_flag) //根据NS_R_G_flag状态交替亮红灯或者绿灯
{
NS_green=1;
NS_red=0;
}
else
{
NS_red=1;
NS_green=0;
}
if(EW_R_G_flag) //根据EW_R_G_flag状态交替亮红灯或者绿灯
{
EW_green=1;
EW_red=0;
}
else
{
EW_red=1;
EW_green=0;
}
if(NS_led==0) //判断南北向紧急控制按钮是否按下
{
delay(5);
if(NS_led==0)
{
NS_R_G_flag=!NS_R_G_flag; //NS_R_G_flag状态取反
}while(!NS_led); //等待南北向紧急控制按钮弹起
}
if(EW_led==0) //判断东西向紧急控制按钮是否按下
{
delay(5);
if(EW_led==0)
{
EW_R_G_flag=!EW_R_G_flag; //EW_R_G_flag状态取反
}while(!EW_led); //等待东西向紧急控制按钮弹起
}
if((add_red_time==0)||(add_green_time==0)||(reduce_red_time==0)||(reduce_green_time==0))//任一红绿灯设置时长按钮按下结束紧急控制人物
{
TR0 = 1; //开启定时器
break;
}
}while((!add_red_time)||(!add_green_time)||(!reduce_red_time)||(!reduce_green_time));//等待红绿灯时间设置按钮弹起
P2=0x00;
EW_led=1;
NS_led=1;
}
}
void main()
{
Init();
while(1)
{
Time_del(); //时间处理
data_del(display_data,NS_second,EW_second);//数据处理
NS_SMG_drive(display_data); //南北向数码管驱动
EW_SMG_drive(display_data); //东西向数码管驱动
R_G_Y_led(); //红绿灯驱动
Set_time(); //红绿灯时长设置
Urgent(); //紧急控制
}
}
void Timer0(void) interrupt 1 //定时器中断
{
TH0 = 0x3C;
TL0 = 0xB0;
count++; //触发中断后计数值自加,定时器中断每50ms触发一次
}