利用51单片机控制各个路口红绿灯及时间显示
1 系统设计
1.1 设计要求
1.1.1 设计任务
利用51单片机控制各个路口红绿灯及时间显示。
1.1.2 性能指标要求
1、各方向的红、绿色信号灯能按照设定规则运行;
2、绿灯亮之前,黄灯闪烁5次;
3、红灯和绿灯倒计时间能够正确显示;
4、两干道的车辆不会会车冲突。
5、可以扩展其他功能(如按键设置时间,按键模拟警车)
1.2 设计思路及设计框图
1.2.1设计思路
1、各个路口红绿灯亮灭的规则,暂不考虑左转方向;
2、倒计时的实现,利用单片机的定时器进行计数得到秒信号;
3、时间显示:东西南北四个方向的时间一致,当东西方向为60秒绿灯通行时间,同时南北方向为60秒红灯禁止时间,因此硬件连接时可考虑东西南北方向可采用同一接法;最后相当于2个数码管动态显示,具体见参考电路框图。
4、按键设置(扩展要求):设置键按一次,设置主干道通信时间(即次干道禁止时间),按第二次,设置主干道禁止时间(即次干道通信时间),按第三次,可作为紧急通信键。设置时间需要确定,可通过确定键实现,也可通过延时确定,如10秒。当然也可根据需要增加相应的按键。
1.2.2总体设计框图
2 各个模块程序的设计
芯片模块:
按键模块:
12M晶振电路模块:
复位端模块:
交通灯功能模块:
数码管显示模块:
3 调试过程
(1)将下载线连接下载口,即供电的时候,板子在没有任何程序进入的情况下,装上芯片后各个方向的红黄绿灯都是亮的,但数码管没有任何显示。
(2)然后将程序下载到单片机内,各个方向的灯开始按照程序所设置的进行亮灭,数码管进入倒计时状态。证明硬件没问题。
(3)通过硬件验证软件,基本的交通灯功能实现。
4 功能测试
4.1 测试仪器与设备
万用表一个、计算机一台、USB下载线一根
4.2 性能指标测试
1、各方向的红、绿色信号灯能按照设定规则运行;
2、绿灯亮之前,黄灯闪烁5次;
3、红灯和绿灯倒计时间能够正确显示;
4、两干道的车辆不会会车冲突。
5 实训心得体会
单片机实训功能要求真是说的容易做的难,以为一步一步画出原理图操作后面就很快能完成。等到实训真正开始的时候发现自己突然之间不知道该干嘛,原理图感觉是没问题了,程序自己不会编,单片机的知识自己又相当薄弱。关于实训器件芯片,数码管,下载口等等的管脚分布,都需要学会自行查找资料。然后这次实训焊板的过程相比之前简单,首次用到了万能板,要点对点的连接,看着原理图里线的走向来接跳线,即使电路短接,拆线也方便。其次就是程序编写阶段了,在翻阅单片机书,老师指导和同学的帮助下,渐渐有了思路,但是一次次的调试失败,关于中断,关于延时等的知识运用相当薄弱,验收的时候就很难受,还有数码管的段暄位选,实现的原理,没有做好提前准备,回答的时候不会。将自己写好的程序烧录到板子时,看着自己的实验板实现基本功能真心感到开心,即使按键功能做不出来,结束后我也会从新看看,争取搞懂。这次实训让我认识自己的单片机知识有多缺乏,暴露出一些在学习上的问题,要好好的记住他的原理。希望自己能够更多的学习专业知识,能够把课本的知识运用到实际生活中。
6 参考文献
1.、谢自美.电子线路设计·实验·测试(第二版).武汉:华中科技大学出版社,2000
2、《单片机原理与应用技术》 喻宗泉、李建民、喻晗 西安电子科技大学出版社
3、《单片机原理与应用》 韩桂明 浙江大学出版社
7 附录
附录1:电路原理图
附录2:程序清单
#include <reg52.h>
#include<stdio.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
char code dx516[3] _at_ 0x003b;
uchar data timelist=60;
uchar count=0;
uchar yelltime=0;
uchar intswitch;
uchar data time[4]={60,5,60,5};
uchar data disbuf[4]={0};
uchar n=0;
uchar yellow=0xff;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
uchar code table[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void timer0(void)interrupt 1
{
TH0=-50000/256;
TL0=-50000%256;
count++;
yelltime++;
if(yelltime==10)
{
yelltime=0;
yellow=yellow^0x12;
}
if(count==20)
{
count=0;
timelist--;
if(timelist==0)
{
n++;
if(n==4)
n=0;
timelist=time[n];
}
}
}
void dlms(uint x)
{
uint i=x,j;
while(i--)
{
j=100;
while(j--);
}
}
void int0(void)interrupt 0
{
dlms(5);
if(!P3_2)
{
while(!P3_2)
{
dlms(1);
}
dlms(5);
if(P3_2)
{
TR0=!TR0;
if(TR0==1)
{ count=0;
n=0;
timelist=time[n];
}
}
}
}
void int1(void)interrupt 2
{
dlms(5);
if(!P3_3)
{
while(!P3_3)
{
dlms(1);
}
dlms(5);
if(P3_3)
{
if(TR0==1)
{
count=0;
n=0;
timelist=time[n];
}
if(TR0==0)
{
time[0]=time[0]+1;
}
if(time[0]>90)
{
time[0]=10;
}
}
}
}
void time1(void)interrupt 3
{
TH1=0xff;
TL1=0xff;
dlms(5);
if(!P3_4)
{
while(!P3_4)
{ dlms(1);
}
dlms(5);
if(P3_4)
{
if(TR0==1)
{
count=0;
n=2;
timelist=time[n];
}
if(TR0==0)
{
time[2]=time[2]+1;
}
if(time[2]>90)
{
time[2]=10;
}
}
}
}
void disp(void)
{
uchar i,j;
uchar sel;
if(TR0==0)
{
disbuf[0]=time[2]%10;
disbuf[1]=time[2]/10;
disbuf[2]=time[0]%10;
disbuf[3]=time[0]/10;
P2=~0xff;
sel=0x01;
for(i=0;i<4;i++)
{
j=disbuf[i];
P2=(sel^0xff);
P0=table[j];
dlms(2);
P2=~0xff;
sel=sel<<1;
P1=0x36;
}
}
if(TR0==1)
{
disbuf[0]=timelist%10;
disbuf[1]=timelist/10;
disbuf[2]=timelist%10;
disbuf[3]=timelist/10;
P2=~0xff;
sel=0x01;
for(i=0;i<4;i++)
{
j=disbuf[i];
P2=(sel^0xff);
P0=table[j];
dlms(2);
P2=~0xff;
sel=sel<<1;
if(n==0)
{
P1=0x33;
}
if(n==1||n==3)
{
P1=yellow;
}
if(n==2)
{
P1=0x1e;
}
}
}
}
main()
{
TCON=0x05;
TMOD=0x51;
TH0=-50000/256;
TL0=-50000%256;
TH1=0xff;
TL1=0xff;
EA=1;
ET0=1;
EX0=1;
ET1=1;
EX1=1;
TR1=1;
TR0=1;
while(1)
{
disp();
}
}