单片机控制的交通灯设计研究
目录
一、初步设计
在Profession中设计一个交通灯的仿真图,结合Keil编写c语言代码实现十字路口的交通灯变化。设计的交通灯主要变化有如下五种情况:(可根据自身的交通灯变化情况进行相应的代码修改)
第一种情况:东西红灯,南北绿灯,南北转向灯绿亮,等待10秒(即数码管显示10秒倒计时);
第二种情况:东西红灯,南北闪黄灯,南北转向灯绿亮,等待5秒 ;
第三种情况:东西绿灯,南北红灯,东西转向灯绿亮,等待10秒;
第四种情况:东西黄灯,南北红灯,东西转向灯绿亮,等待5秒 。
第五种情况:即紧急情况,利用开关(按钮)控制倒计时显示屏(数码管)停止使之为0数字,交通灯(LED)东西南北皆显示为红灯。
交通灯仿真图如下图所示:
二、实现过程
1、设计仿真图
配置的主要元件如下:
7SEG-MPX2-CC(两个):两位数共阴极的红色数码管,亮红灯。仿真图中代表东西方向的倒计时。
7SEG-MPX2-CC-BLUE(两个):两位数共阴极的蓝色数码管,亮蓝灯。仿真图中代表南北方向的倒计时。
AT89C51(一个):最常用的51芯片。
BUTTON(一个):按键开关。本实验用来控制中断紧急事件。
LED-RED(四个):红色发光二极管。仿真图中东西南北各一。
LED-GREEN(八个):绿色发光二极管。仿真图中东西南北各二。
LED-YELLOW(四个):黄色发光二极管。仿真图中东西南北各一。
2、代码实现主要过程
(1) 延时函数
该函数用来定义延时,防止抖动。
(2)定时器函数
该函数用来定时数码管数字变化时间,TMOD表示的含义是使用定时器0,工作方式1,即计数器是16位。16位的二进制可以表示2^16(65535),计数器是向上计数的,一个一个数的加。如果要求每数40000次溢出一次产生中断,那么初值就是2^16-40000+1=25536,将初值25536放在TH0和TL0中,但由于T0是由两个8位的专用寄存器组成的,所以需要将25536分给高8位的TH0和低8位的TL0,25536/256就是将高八位取出,25536%256就是将低八位取出。
其中,EA为总中断开关,ET0打开T0定时器中断,TR0启用T0计数器/定时器。对于51单片机来说,设置了EA=1和ET0=1,这是定时器T0打开中断,即允许T0中断。而设定TR0=1,是启动定时器开始计时/计数(若TR0=0,则表明定时器停止计时/计数)。
(3)交通灯函数
该函数主要是用来定义交通灯变化情况,并将其与计时器结合在一起。首先定时40ms,每次40ms次数加1,直次数达到25(达到1s需要25次的40ms)。当计时到1秒时,开始使倒计时数值减1,直至当倒计时为0时,根据不同的交通灯情况设定倒计时时间(即出现黄灯的情况应该设定为5秒,其它为10秒),倒计时结束后切换下一种交通灯变化。
(4)紧急按钮函数
该函数是应用于发生紧急情况时。通过点击按钮实现数码管计时器的停止(即当按钮接收到低电平的时候,将TR0取反停止计时,TR0表示的是T0的计数),且将东西南北四个方向的路口交通灯皆设置为红灯。函数中如果不添加延迟函数,运行时会出现按钮不灵的现象,利用延迟函数能够防止按钮点击时的抖动。
(5)主函数
运行定时器函数,并在循环中不断运行已经设定好的按钮以及数码管事件。设定的Area1和Area2是为了实现双位数码管中的不同数字显示(即对应数码管中的两个针脚),如果不设置便会出现两边出现相同数字的情况,利用初始化的倒计数数字,将倒计时数字的个位和十位分别用式子表示出来,并显示先后在数码管上(该处设置的是先显示十位后显示个位,数码管时共阴极,所以赋值为1时接收的是高电位会亮)。由于我们只需要运行两个case事件,所以在cnt的值大于1时,重新归0,使之不停循环该过程。
三、实现效果
单片机交通灯效果视频