交通灯控制系统
一、实验目的
掌握单片机的综合应用设计。
二、实验仪器、材料
PC机、keil软件、proteus软件
三、实验内容及要求
完成以下任务:十字路口的交通灯控制系统,四组灯(红黄绿)对应十字路口的四个方
向,用两位的数码管显示剩余的时间。其它功能自行完善,根据设计方案的完善程度给
定成绩。
四、实验原理
上下28秒红灯亮禁止通行的时候,左右亮绿灯23秒通行加3秒黄灯等待;反过来,左右
28秒红灯亮禁止通行的时候,上下亮绿灯23秒通行加3秒黄灯等待。数码管右下角1是高
电平显示左边数字,也就是十位,2是高电平,显示右边数字也就是个位,所以要交替
显示,显示时间足够短就会同时亮。利用定时器,判断每一种情况,按照红绿黄依次改
变。
五、原理图和程序代码
原理图
四个数码管的段选端口是连接在一起的(AG,DP端口是小数点的显示);1、2、
3、4是位选信号。如果我们将段选信号输入到端口,那么所有的数码管显示的数字是
一样的,这不是我们想要的效果,所以就需要用到位选信号1~4,每次只让一个位选信
号使能,其他三个就禁止。可是这样你会觉得,每次只有一个数码管显示啊,对的,
每个时刻确实只有一个数码管显示,但是下一时刻我们就切换要显示的数字,然后换
一个数码管显示,这样的效果就是看到四个数码管轮流显示,每次显示的数字不一
样,还不是我们想要的效果。那如果我们将每个数码管切换的时间间隔缩小呢,比
如,10ms,这个间隔肉眼是无法分辨出来的,这就是数码管动态显示的原理!
关于7SEG-MPX2CA数码管知识可以看看这个链接: https://blog.csdn.net/weixin_39665379/article/details/112140960
.
代码
这段分别代表绿色黄色红色显示倒计时时长的十位和个位
红灯时长+1(红色00)=绿色时长+1(绿色00)+黄色时长+1(黄色00)
//绿黄红各个十位和个位的数字,因为有00差一秒所以红灯得公式计算
#define G_S 2
#define G_G 9
#define Y_S 0
#define Y_G 9
#define R_S (G_S*10+G_G+Y_S*10+Y_G+1)/10
#define R_G (G_S*10+G_G+Y_S*10+Y_G+1)%10
完整代码
#include<reg52.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit ledr1=P1^0;
sbit ledy1=P1^1;
sbit ledg1=P1^2;
sbit ledr2=P1^3;
sbit ledy2=P1^4;
sbit ledg2=P1^5;
sbit lcd1s=P1^6;
sbit lcd1g=P1^7;
char distab[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极
//绿黄红各个十位和个位的数字,因为有00差一秒所以红灯得公式计算
#define G_S 2
#define G_G 9
#define Y_S 0
#define Y_G 9
#define R_S (G_S*10+G_G+Y_S*10+Y_G+1)/10
#define R_G (G_S*10+G_G+Y_S*10+Y_G+1)%10
int sxs=G_S,sxg=G_G;
int zys=R_S,zyg=R_G;
void Time0Init()
{
TMOD|=0x01; //TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能
TH0=0xFC;
TL0=0x18; //定时一毫秒 初值=65535-1000+1(因为实际上计数器计数到65536才溢出)=64536=FC18H
//设置定时中断0
ET0=1;
EA=1;
TR0=1;
}
void Time0() interrupt 1
{
static u16 i;
TH0=0xFC;
TL0=0x18;
i++;
if(i==1000)
{ i=0;
sxg--;
zyg--;
if(sxg==-1)
{ sxs--;
if(sxs==-1&&sxg==-1)
{ if(ledy2==0)
{ ledr2=0;ledy2=1;ledg2=1;
sxs=R_S;sxg=R_G;
}
else if(ledr2==0)
{ ledr2=1;ledy2=1;ledg2=0;
sxs=G_S;sxg=G_G;
}
else if(ledg2==0)
{ ledr2=1;ledy2=0;ledg2=1;
sxs=Y_S;sxg=Y_G;
}
}
else sxg=9;
}
if(zyg==-1)
{ zys--;
if(zys==-1&&zyg==-1)
{ if(ledy1==0)
{ ledr1=0;ledy1=1;ledg1=1;
zys=R_S;zyg=R_G;
}
else if(ledr1==0)
{ ledr1=1;ledy1=1;ledg1=0;
zys=G_S;zyg=G_G;
}
else if(ledg1==0)
{ ledr1=1;ledy1=0;ledg1=1;
zys=Y_S;zyg=Y_G;
}
}
else zyg=9;
}
}
}
void delayms(unsigned int n)
{
unsigned int m,j;
for(m=0;m<n;m++)
for(j=0;j<113;j++ );
}
void main()
{
lcd1s=1;
lcd1g=0;
ledr1=0;ledy1=1;ledg1=1;
ledr2=1;ledy2=1;ledg2=0;
Time0Init();
while(1)
{
if(lcd1s)
{ lcd1s=~lcd1s;
lcd1g=~lcd1g;
P0=~distab[sxg];
P2=~distab[zyg];
}
else
{ lcd1g=~lcd1g;
lcd1s=~lcd1s;
P0=~distab[sxs];
P2=~distab[zys];
}
delayms(10);
}
}
六、程序运行结果
(个人能力有限希望能帮到大家)