用AT89C52單片機(jī)控制一個交通信號燈系統(tǒng),晶振采用12MHz。設(shè)A車道與B車道交叉組成十字路口,A是主道,B是支道。設(shè)計要求如下所示:
(1)用發(fā)光二極管模擬交通信號燈,用按鍵開關(guān)模擬車輛檢測信號。
(2)正常情況下,A、B兩車道輪流放行,A車道放行50s,其中5s用于警告,B車道放行30s,其中5s用于警告。
(3)在交替繁忙時,交通信號燈控制系統(tǒng)應(yīng)有手控開關(guān),可人為地改變信號燈的狀態(tài),以緩解交通擁擠狀況。在B車道放行期間,若A車道有車而B車道無車,按下開關(guān)K1使A車道放行15s;在A車道放行期間,若B車道有車而A車道無車,按下開關(guān)使B車道放行15s。
(4)有緊急車輛通行時,按下開關(guān)A3,使A、B車道均為紅燈,禁行20s。
it k1=P3^2;//設(shè)置按鈕
sbit k2=P3^3;
sbit k3=P3^4;
sbit k4=P3^5;//通行控制
sbit k5=P3^6;
sbit k6=P3^7;
sbit red1 =P1^0; //南北方向
sbit yellow1=P1^1;
sbit green1 =P1^2;
sbit red2 =P1^3; //東西方向
sbit yellow2=P1^4;
sbit green2 =P1^5;
sbit smg1=P2^0;//數(shù)碼管引腳
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
uchar code tabel[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar sec=0,miao=0; //定時
uchar nan=0,dong=0;//東西南北時間
uchar mode=0; //路燈工作順序
uchar nan_lim=50,dong_lim=30;//自由調(diào)整時主次干道綠燈時間
uchar moshi=0;
void delay(uint i)//延時
{
while(i--);
}
void control()//控制路燈
{
switch(mode)
{
case 0:red1=0;yellow1=1;green1=1;red2=1;yellow2=1;green2=0;//南北紅燈亮
nan=dong_lim+7;dong=dong_lim+1;//設(shè)置初始時間
break;
case 1:red1=0;yellow1=1;green1=1;red2=1;yellow2=0;green2=1;//東西黃燈亮
dong=6;nan=6;
break;
case 2:red1=1;yellow1=1;green1=0;red2=0;yellow2=1;green2=1;//東西紅燈亮
nan=nan_lim+1;dong=nan_lim+7;//設(shè)置初始時間
break;
case 3:red1=1;yellow1=0;green1=1;red2=0;yellow2=1;green2=1;//南北黃燈亮
nan=6;dong=6;
}
}
void display() //顯示各路口時間
{
P0=tabel[nan/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan%10];
smg2=1;
delay(100);
smg2=0;
P0=tabel[dong/10];//東西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong%10];
smg4=1;
delay(100);
smg4=0;
}
void main()//主函數(shù)
{
uchar k=0;
TMOD=0x01;//定時器設(shè)置
TH0=0x3c; //50ms
TL0=0xb0;
ET0=1; //開中斷
EA=1;
TR0=1; //啟動定時器
control();
nan=dong_lim+6;dong=dong_lim;//設(shè)置初始時間
while(1)
{
if(moshi==0)
display();//顯示
if(!k1 &&(k!=1))
{ //模式切換
if(moshi<2)
moshi++;
else
moshi=0;
k=1;
}
if(moshi==1)//調(diào)節(jié)南北時間
{
if(!k2 &&(k!=2))
{
if(nan_lim<99)
nan_lim++;
k=2;
}
if(!k3 &&(k!=3))
{
if(nan_lim>1)
nan_lim--;
k=3;
}
P0=tabel[nan_lim/10];//南北
smg1=1;
delay(100);
smg1=0;
P0=tabel[nan_lim%10];
smg2=1;
delay(100);
smg2=0;
}
if(moshi==2)//調(diào)節(jié)東西時間
{
if(!k2 &&(k!=2))
{
if(dong_lim<99)
dong_lim++;
k=2;
}
if(!k3 &&(k!=3))
{
if(dong_lim>1)
dong_lim--;
k=3;
}
P0=tabel[dong_lim/10];//東西
smg3=1;
delay(100);
smg3=0;
P0=tabel[dong_lim%10];
smg4=1;
delay(100);
smg4=0;
}
//繁忙
if(!k4 &&(k!=4))//A放行15s
{
k=4;
if(mode==0)
{
mode=2;