一.硬件方案
本设计能模拟基本的交通控制系统,用红绿黄灯表示禁行,通行和等待的信号发生,还能进行倒计时显示。按键可以控制禁行、深夜模式、复位、东西通行、南北通行、时间加、时间减、切换等功能。共四个二位阴极数码管,东南西北各一个显示时间,四个数码管的阴极都接到STC89C51的P1口,阳极接到74HC245芯片上,通过P0口控制74HC245芯片,起到驱动放大作用。
主要电路:51单片机+最小系统+数码管显示模块+LED指示灯模块+按键模块;
二.设计功能
(1)本设计采用四方向数码管显示时间的设计,更加符合真实的交通信号灯设计;
(2)7个按键:复位、夜间模式、紧急模式、设定时间、时间加、时间减、调试确定键;
(3)夜间模式:按下“夜间模式”按键后,四个方向的黄灯闪烁;
(4)紧急模式:当救护车、救火车等通过时,按下“紧急模式”按键,四个方向的红灯全部亮起;
(5)东西方向和南北方向的通行时间可以分开设置。就是模拟实际交通中的主干道和支干道。
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
(2)Protues仿真图如下:
四.软件设计
主程序源码:
//主程序
void main()
{
TMOD=0X11; //定时器设置
TH1=0X3C;
TL1=0XB0;
TH0=0X3C; //定时器0置初值 0.05S
TL0=0XB0;
EA=1; //开总中断
ET0=1; //定时器0中断开启
ET1=1; //定时器1中断开启
TR0=1; //启动定时0
TR1=0; //关闭定时1
logo(); //开机初始化
P2=0Xc3; // 开始默认状态,东西绿灯,南北黄灯
sec_nb=sec_dx+5; //默认南北通行时间比东西多5秒
while(1) //主循环
{
key(); //调用按键扫描程序
display(); //调用显示程序
}
}
//函数的定义部分
void key(void) //按键扫描子程序
{
if(k1!=1) //当K1(时间加)按下时
{
display(); //调用显示,用于延时消抖
if(k1!=1) //如果确定按下
{
TR0=0; //关定时器
shanruo=0; //闪烁标志位关
P2=0x00; //灭显示
TR1=0; //启动定时1
if(set==0) //设置键按下
set_timedx++; //南北加1S
else
set_timenb++; //东西加1S
if(set_timenb==100)
set_timenb=1;
if( set_timedx==100)
set_timedx=1; //加到100置1
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
do
{
display(); //调用显示,用于延时
}
while(k1!=1); //等待按键释放
}
}
if(k2!=1) //当K2(时间减)按键按下时
{
display(); //调用显示,用于延时消抖
if(k2!=1) //如果确定按下
{
TR0=0; //关定时器0
shanruo=0; //闪烁标志位关
P2=0x00; //灭显示
TR1=0; //关定时器1
if(set==0)
set_timedx--; //南北减1S
else
set_timenb--; //东西减1S
if(set_timenb==0)
set_timenb=99;
if( set_timedx==0 )
set_timedx=99; //减到1重置99
sec_nb=set_timenb ; //设置的数值赋给东西南北
sec_dx=set_timedx;
do
{
display(); //调用显示,用于延时
}
while(k2!=1); //等待按键释放
}
}
if(k3!=1) //当K3(确认)键按下时
{
display(); //调用显示,用于延时消抖
if(k3!=1) //如果确定按下
{
TR0=1; //启动定时器0
sec_nb=set_timenb; //从中断回复,仍显示设置过的数值
sec_dx=set_timedx; //显示设置过的时间
TR1=0; //关定时器1
if(set==0) //时间倒时到0时
{
P2=0X00; //灭显示
Green_dx=1; //东西绿灯亮
Red_nb=1; //南北红灯亮
sec_nb=sec_dx+5; //回到初值
}
else
{
P2=0x00; //南北绿灯,东西红灯
Green_nb=1;
Red_dx=1;
sec_dx=sec_nb+5;
}
}
}
if(k4!=1) //当K4(切换)键按下
{
display(); //调用显示,用于延时消抖
if(k4!=1) //如果确定按下
{
TR0=0; //关定时器0
set=!set; //取反set标志位,以切换调节方向
TR1=0; //关定时器1
dx_nb=set;
do
{
display(); //调用显示,用于延时
}
while(k4!=1); //等待按键释放
}
}
if(k5!=1) //当K5(禁止)键按下时
{
display(); //调用显示,用于延时消抖
if(k5!=1) //如果确定按下
{
TR0=0; //关定时器
P2=0x00; //灭显示
Red_dx=1;
Red_nb=1; //全部置红灯
TR1=0;
sec_dx=00; //四个方向的时间都为00
sec_nb=00;
do
{
display(); //调用显示,用于延时
}
while(k5!=1); //等待按键释放
}
}
if(k6!=1) //当K6(夜间模式)按下
{
display(); //调用显示,用于延时消抖
if(k6!=1) //如果确定按下
{
TR0=0; //关定时器
P2=0x00;
TR1=1;
sec_dx=00; //四个方向的时间都为00
sec_nb=00;
do
{
display(); //调用显示,用于延时
}
while(k6!=1); //等待按键释放
}
}
}
资料链接:https://pan.baidu.com/s/1RTF58-hWut5EEv6ZgvnFiw?pwd=gkv0