单片机控制的交通灯设计研究

目录

一、初步设计

二、实现过程

三、实现效果


一、初步设计

在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,使之不停循环该过程。

三、实现效果

单片机交通灯效果视频

物联沃分享整理
物联沃-IOTWORD物联网 » 单片机控制的交通灯设计研究

发表评论