一.设计要求
1.能设定红绿灯的时间
2.能显示倒计时时间
3.紧急情况下,如救护车通过时,让两个方向的交通灯全红
二、设计思路
可以通过单片机的中断来实现时间的减少和实现闪烁的功能,根据推论可以发现两条路的红绿灯的状态可以分为4种,每一次运行时输出特定的倒计时时间和状态,就可以实现红绿灯的运行。特殊情况有救护车通过时,全部显示红灯并不显示倒计时。
三、仿真的电路
红绿灯电路:使用P2来控制,当P2口的引脚输出低电平时,二极管道通点亮二极管
倒计时显示电路:使用单片机的P0口来驱动两个4511芯片来分别显示各位和十位,数码管使用共阴极的7段数码管
总图:其中按键1接定时器0的外部中断,按键2接定时器1的外部中断
四、程序代码
代码的思路
使用单片机的定时器1的内部中断作为程序的主体部分(为什么,因为中断的等级为3低于按键1,按键2,可以被这两个按键中断),救护车的状态使用一个变量进行标记进行特殊处理。
代码解析
变量的定义
红绿灯的状态只有四个:根据每个灯的亮灭情况和引脚的分配
定时器的初始化,中断时间为1ms,死循环是反正代码运行完重头在来运行,乘16表示在二进制的后面加4个零
500次中断表示时间过了0.5s(为什么不是1s,因为0.5s的闪烁看起来比较正常,但是后面得在加一个计数表示1s的中断),如果他处于设定时间的状态,每0.5s加一次全灭,形成闪烁的效果。
处于救护车的状态,特殊处理不进入正常的显示。
红灯的时间等于绿灯的时间加10,导致了一个红灯之间有绿灯加黄灯,所以就要加多一个条件表示绿灯已经结束,进入黄灯的状态,p_time数组存的是每个时间段的开始的时间,包括两个红灯的情况。
为什么状态数组p_lamp输出要取反,因为P2引脚输出低电平时,灯点亮,但是状态定义时是按照高电平点亮的,所以输出要取反
外部中断2:在时间设定 的状态下加时间(绿灯的时间)
外部中断0:(为什么在中断0中,进行救护车情况的切换,因为中断等级最高,可以在任意时间执行当前的中断),救护车通过后要变为绿灯,同时状态下标也要同步更新
百度网盘链接
链接:https://pan.baidu.com/s/1OKlr6tg8thvF9seuqb5plQ?pwd=u08l
提取码:u08l