|
要求
基于AT89S52單片機(jī)設(shè)計(jì)交通燈控制系統(tǒng),實(shí)現(xiàn)以下功能:
正常模式:南北方向通行:左轉(zhuǎn)燈亮25S后黃燈亮5S,直轉(zhuǎn)燈亮45S后黃燈亮5S,
東西方向紅燈亮50S
正常模式:東西放向通行:左轉(zhuǎn)燈亮25S后黃燈亮5S,直轉(zhuǎn)燈亮45S后黃燈亮5S,南北方向紅燈亮50S
緊急模式:按下S1,所有紅燈閃爍;
夜間模式:按下S2,所有黃燈閃爍
恢復(fù)到正常模式:按下S3
參數(shù):
1.模擬十字路口交通燈情況,設(shè)計(jì)左轉(zhuǎn)綠燈、前進(jìn)綠燈、黃紅綠燈控制,具有倒計(jì)時(shí)顯示。
2.數(shù)碼管作為作為顯示器;
3.具有緊急控制功能,緊急控制按鍵后,四個(gè)方向的紅燈閃爍全部禁止通行,以便交警人工指揮。
4.具有夜間控制功能,夜間控制按鍵后,四個(gè)方向的黃燈閃爍,晚上車少人少,不需要用到交通燈
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
666.JPG (159.47 KB, 下載次數(shù): 34)
下載附件
2022-11-29 16:15 上傳
單片機(jī)代碼如下:
#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; //東西左轉(zhuǎn)燈
sbit EW_ZHI=P1^1; //東西直行燈
sbit EW_HONG=P1^2; //東西紅燈
sbit EW_HUANG=P1^3; //東西黃燈
sbit SN_ZUO=P1^4; //南北左轉(zhuǎn)燈
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]; //東西倒計(jì)時(shí)
delay(1);
SHU7;
P0 = seg[Time_EW%10]; //東西倒計(jì)時(shí)
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]; //南北倒計(jì)時(shí)
delay(1);
SHU1;
P0 = seg[Time_SN%10]; //南北倒計(jì)時(shí)
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, 下載次數(shù): 72)
2022-11-29 16:15 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|