要求
基于AT89S52单片机设计交通灯控制系统,实现以下功能:
正常模式:南北方向通行:左转灯亮25S后黄灯亮5S,直转灯亮45S后黄灯亮5S,
东西方向红灯亮50S
正常模式:东西放向通行:左转灯亮25S后黄灯亮5S,直转灯亮45S后黄灯亮5S,南北方向红灯亮50S
紧急模式:按下S1,所有红灯闪烁;
夜间模式:按下S2,所有黄灯闪烁
恢复到正常模式:按下S3
参数:
1.模拟十字路口交通灯情况,设计左转绿灯、前进绿灯、黄红绿灯控制,具有倒计时显示。
2.数码管作为作为显示器;
3.具有紧急控制功能,紧急控制按键后,四个方向的红灯闪烁全部禁止通行,以便交警人工指挥。
4.具有夜间控制功能,夜间控制按键后,四个方向的黄灯闪烁,晚上车少人少,不需要用到交通灯
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机代码如下:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define SHU1 c=1;b=1;a=1
#define SHU2 c=1;b=1;a=0
#define SHU3 c=1;b=0;a=1
#define SHU4 c=1;b=0;a=0
#define SHU5 c=0;b=1;a=1
#define SHU6 c=0;b=1;a=0
#define SHU7 c=0;b=0;a=1
#define SHU8 c=0;b=0;a=0
void EW_ZUOTONG();
void EW_ZHITONG();
void EW_TING();
void SN_ZUOTONG();
void SN_ZHITONG();
void SN_TING();
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit EW_ZUO=P1^0; //东西左转灯
sbit EW_ZHI=P1^1; //东西直行灯
sbit EW_HONG=P1^2; //东西红灯
sbit EW_HUANG=P1^3; //东西黄灯
sbit SN_ZUO=P1^4; //南北左转灯
sbit SN_ZHI=P1^5; //南北直行灯
sbit SN_HONG=P1^6; //南北红灯
sbit SN_HUANG=P1^7; //南北黄灯
uint x=0,y=0,z=0,Time_EW=30,Time_SN=30; //定义初始值
uchar code seg[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
uchar code led[2]={0xbb, 0x77};
void delay(uint ms)
{
uint i;
while(ms--)
for(i=0;i<123;i++);
}
void display()
{
if((z==0)||(z==1)||(z==2)||(z==3))
{
SHU8;
P0 = seg[Time_EW/10]; //东西倒计时
delay(1);
SHU7;
P0 = seg[Time_EW%10]; //东西倒计时
delay(1);
SHU6;
P0 = 0x40;
delay(1);
SHU5;
P0 = 0x40;
delay(1);
SHU4;
P0 = 0x40;
delay(1);
SHU3;
P0 = 0x40;
delay(1);
SHU2;
P0 = seg[Time_SN/10]; //南北倒计时
delay(1);
SHU1;
P0 = seg[Time_SN%10]; //南北倒计时
delay(1);
}
}
void init()
{
TMOD = 0x01;
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void time0() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
x++;
if(x==20) //50ms*20=1s
{
x=0;
Time_EW--;
Time_SN--;
}
if((Time_EW==-1)&&(Time_SN==-1))
{
z++;
if(z==1)
{
Time_EW=50;
Time_SN=50;
}
if(z==2)
{
Time_EW=30;
Time_SN=30;
}
if(z==3)
{
Time_EW=50;
Time_SN=50;
}
if(z==4)
{
z=0;
Time_EW=30;
Time_SN=30;
}
}
}
uchar key_scan(void)
{
static bit kp=0;
if(P3!=0xff)
{
if((P3!=0xff)&&(kp==0))
{
kp=1;
if(P3==0xfe)return 1;
if(P3==0xfd)return 2;
if(P3==0xfb)return 3;
if(P3==0xf7)return 4;
}
}
else kp=0;
return 0;
}
void main()
{
uchar key_val;
init();
while(1)
{
display();
EW_ZUOTONG();
EW_ZHITONG();
EW_TING();
SN_ZUOTONG();
SN_ZHITONG();
SN_TING();
key_val=key_scan();
if(key_val==1)
{
z=-1;
EA=0;
ET0=0;
TR0=0;
P0=0X00;
}
if(z==-1)
{
P1=0xbb;
delay(80);
P1=0xff;
delay(80);
}
if(key_val==2)
{
z=-2;
EA=0;
ET0=0;
TR0=0;
P0=0X00;
}
if(z==-2)
{
P1=0x77;
delay(80);
P1=0xff;
delay(80);
}
if(key_val==3)
{
z=-3;
EA=1;
ET0=1;
TR0=1;
}
if(z==-3)
{
z=0;
Time_EW=30;
Time_SN=30;
}
}
}
void EW_ZUOTONG()
{
if(z==0)
{
if((6<=Time_EW)&&(Time_EW<=30))
{
EW_ZUO=0;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=1;
}
if((0<=Time_EW)&&(Time_EW<=5))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=0;
}
}
}
void EW_ZHITONG()
{
if(z==1)
{
if((6<=Time_EW)&&(Time_EW<=50))
{
EW_ZUO=1;
EW_ZHI=0;
EW_HONG=1;
EW_HUANG=1;
}
if((0<=Time_EW)&&(Time_EW<=5))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=1;
EW_HUANG=0;
}
}
}
void EW_TING()
{
if((z==2)||(z==3))
{
EW_ZUO=1;
EW_ZHI=1;
EW_HONG=0;
EW_HUANG=1;
}
}
void SN_TING()
{
if((z==0)||(z==1))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=0;
SN_HUANG=1;
}
}
void SN_ZUOTONG()
{
if(z==2)
{
if((6<=Time_SN)&&(Time_SN<=30))
{
SN_ZUO=0;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=1;
}
if((0<=Time_SN)&&(Time_SN<=5))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=0;
}
}
}
void SN_ZHITONG()
{
if(z==3)
{
if((6<=Time_SN)&&(Time_SN<=50))
{
SN_ZUO=1;
SN_ZHI=0;
SN_HONG=1;
SN_HUANG=1;
}
if((0<=Time_SN)&&(Time_SN<=5))
{
SN_ZUO=1;
SN_ZHI=1;
SN_HONG=1;
SN_HUANG=0;
}
}
}
Keil代码与Proteus仿真下载:
交通的仿真和代码.rar
(101.51 KB, 下载次数: 72)
|