1.设计要求
交通灯系统整体设计构想:系统南北绿灯通行时间都为10秒,包含南北黄灯闪烁5秒,东西绿灯通行10秒,东西黄灯闪烁5秒。这样一直循环。另外还有一个紧急按钮,按下四个方向红灯亮起。
2.模块组成
①本设计单片机最小系统:晶振电路、复位电路、单片机组成。
②红绿灯电路
③数码管电路
3.仿真全图
4.程序主要代码
char time1=10; //初值南北10秒
char time2=15; //初值东西15秒
char huang=5; //黄灯时间
char time11=15,time22=10;
uchar time1_2,temp=0,p=0,tab;
uchar shi1,ge1,shi2,ge2,q;
uchar status,key,flag;
uchar zhuangtai_flag=0;
//共阴极数字显示编码
uchar code table[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uchar code wei[]={0xfd,0xfe,0xf7,0xfb,
0xdf,0xef,0x7f,0xbf}; //位选
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--) //定时x毫秒
for(j=110;j>0;j--);
}
void display(uint ge1,uint shi1,uint ge2,uint shi2) //数码管显示
{
//显示北
wela=1; //打开位选锁存器
P0=wei[0]; //送入位选码(北个位)
wela=0; //关闭位选锁存器
P0=0; //消影
dula=1; //打开段选锁存器
P0=table[ge1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[1]; //送入位选码(北十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi1]; //送入段选
dula=0; //关闭段选锁存器
delay(1);
//显示东西
wela=1; //打开位选锁存器
P0=wei[2]; //送入位选码(东个位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[ge2];
dula=0; //关闭段选锁存器
delay(1);
wela=1; //打开位选锁存器
P0=wei[3]; //送入位选码(东十位)
wela=0; //关闭位选锁存器
P0=0;
dula=1; //打开段选锁存器
P0=table[shi2];
dula=0; //关闭段选锁存器
delay(1);
}
void key1_6()
{
if(key==7) //红灯全亮
{
time1=0;
time2=0;
temp=0; //计数值清零
p=0;
TR0=0;
P1=0x09;
}
}
void dis()
{
wela=1;
P0=0xff;
wela=0;
}
void zhuangtai1()
{
P1=0x0c; //刚开始南北通,东西禁行
if(time1<0)
{
time1=huang;
time2=huang;
zhuangtai_flag=1;
}
}
void zhuangtai2()
{
P1=0x0a;
q=!q;
if(q!=0)
SN=1; //全黄
else
SN=0;
if(time1<0)
{
time1=time11;
time2=time22;
zhuangtai_flag=2;
}
}
void zhuangtai3()
{
P1=0x21;
if(time1<0)
{
time1=huang;
time2=huang;
zhuangtai_flag=3;
}
}
void zhuangtai4()
{
P1=0x11;
q=!q;
if(q!=0)
EW=1; //全黄
else
EW=0;
if(time1<0)
{
time1=time11;
time2=time22;
zhuangtai_flag=0;
}
}
void main()
{
P1=0x0c; //刚开始南北通,东西禁行
TMOD=0x01;
TH0=(65535-10000)/256;
TL0=(65535-10000)%256; //初值
while(1)
{
if(flag)
{
switch(status) //判断按键
{
case 0xf8:key=7;break;
}
key1_6(); //按键程序
flag=0;
}
if(!p)
{
shi1=time1/10; //南北十位
ge1=time1%10; //南北个位
shi2=time2/10; //东西十位
ge2=time2%10; //东西个位
display(ge1,shi1,ge2,shi2); //显示函数
}
}
}