|
本帖最后由 xiepp333 于 2019-10-14 08:47 編輯
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0 =P1^0; sbit P1_1 =P1^1; sbit P1_2 =P1^2; sbit P1_3 =P1^3;
sbit ew_red=P0^4; //P0.0 東西紅燈
sbit ew_yellow=P0^5; //P0.1 東西黃燈
sbit ew_green=P0^6; //P0.2 東西綠燈
sbit sn_red=P0^0; //P0.3 南北紅燈
sbit sn_yellow=P0^1; //P0.4 南北黃燈
sbit sn_green=P0^2; //P0.5 南北綠燈
sbit dongxi=P3^2; //東西 通行
sbit nanbei= P3^3; //南北 通行
sbit all_not=P3^4; //P3.4為全部禁行
sbit dxjia=P3^0; sbit dxjian=P3^1; sbit nbjia=P3^5;sbit nbjian=P3^6;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//七段碼顯示表
uchar a,b,c,d;
uchar nanbei_time; //南北通行時(shí)間
uchar dongxi_time; //東西通行時(shí)間
uchar time_flag; //時(shí)間標(biāo)志位
uchar t_flag; //t_flag=0時(shí)南北通行,=1時(shí)東西通行
uchar time_m; //定義計(jì)時(shí)變量
void nanbeitong() //南北通行
{
ew_red=0; ew_green=1; ew_yellow=1; //東西紅燈
sn_red=1; sn_green=0; sn_yellow=1; //南北綠燈
}
void dongxitong() //東西通行
{
ew_red=1; ew_green=0; ew_yellow=1; //東西綠燈
sn_red=0; sn_green=1; sn_yellow=1; //南北綠燈
}
void delay(uchar z) //延時(shí)程序
{
uchar i,j; //一個(gè)毫秒的延時(shí)
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display_time( ) //顯示倒計(jì)時(shí)
{
P1_0 =0;P1_1 =1;P1_2 =1;P1_3 =1;
P2=table[a/10]; //東西十位顯示
delay(2);
P2=0;P1_0 =1;
P1_1 =0;
P2=table[b%10];//東西個(gè)位顯示
delay(2);
P2=0;P1_1 =1;
P1_2 =0;
P2=table[(c)/10];//南北十位顯示
delay(2);
P2=0;P1_2 =1;
P1_3 =0;
P2=table[(d)%10];//南北個(gè)位顯示
delay(2);
P2=0;P1_3 =1;
}
void init0_timer0() //定時(shí)器0初始化
{
TMOD=0X01; //定時(shí)器0設(shè)置為模式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
ET0=1;EA=1;TR0=1;
}
void keyscan() //鍵盤掃描
{
if(nanbei==0) //判斷南北通行按鍵
{
delay(2);
if(nanbei==0) //防抖動
{
nanbeitong(); //調(diào)用南北通行子程序
while(!nanbei) display_time();
TR0=0;
}
}
if(dongxi==0) //判斷東西通行按鍵
{
delay(2);
if(dongxi==0) //防抖動
{
dongxitong(); //調(diào)用東西通行子程序
while(!dongxi) display_time();
TR0=0;
}
}
if(all_not==0) //判斷全部禁行按鍵
{
delay(2); //延時(shí)2毫秒
if(all_not==0) //再次全部禁行按鍵
{
TR0=0; //進(jìn)入全部禁行子程序,關(guān)閉定時(shí)器T0
ew_red=0; ew_green=1; ew_yellow=1; //東西紅燈亮
sn_red=0; sn_green=1; sn_yellow=1; //南北紅燈亮
}
}
if(dxjia==0) //判斷東西加按鍵
{
delay(200); //延時(shí)
if(dxjia==1) //再次全部禁行按鍵
{
dongxi_time=dongxi_time+1;
time_flag=time_flag+1;
}
}
if(dxjian==0) //判斷東西減按鍵
{
delay(200); //延時(shí)
if(dxjian==1) //再次全部禁行按鍵
{
dongxi_time=dongxi_time-1;
time_flag=time_flag-1;
}
}
if(nbjia==0) //判斷南北加按鍵
{
delay(200); //延時(shí)
if(nbjia==1) //再次全部禁行按鍵
{
nanbei_time=nanbei_time+1;
time_flag=time_flag+1;
}
}
if(nbjian==0) //判斷南北減按鍵
{
delay(200); //延時(shí)
if(nbjian==1) //再次全部禁行按鍵
{
nanbei_time=nanbei_time-1;
time_flag=time_flag-1;
}
}
}
void main() //主程序
{
nanbei_time=24; //初始化南北通行時(shí)間
dongxi_time=12; //初始化東西通行時(shí)間
t_flag=0;
time_flag=nanbei_time;
time_m =0; //計(jì)時(shí)變量初始化
init0_timer0(); //調(diào)用定時(shí)器T0初始化子程序
nanbeitong(); //調(diào)用南北通行子程序
while(1)
{
keyscan(); //調(diào)用鍵盤掃描
display_time(); //調(diào)用顯示倒計(jì)時(shí)
}
}
void int0_isr() interrupt 1 //定時(shí)器T0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time_m++; //計(jì)時(shí)變量加1
if(time_m>=20) //判斷計(jì)時(shí)變量是否大于20
{
time_m=0; //計(jì)時(shí)變量大于20,則把計(jì)時(shí)變量清零
time_flag--;
if(t_flag==0) //若t_flag為0,則進(jìn)入南北通行模式
{
if(time_flag>2)
{
nanbeitong(); //南北通行紅綠燈
a=time_flag;
b=time_flag;
c=time_flag-3;
d=time_flag-3;
}
else if(time_flag>0) //若倒計(jì)時(shí)時(shí)間小于2秒
{
sn_red=1; sn_green=1; sn_yellow=0; //南北黃燈
ew_red=0; ew_green=1; ew_yellow=1; //東西紅燈
a=time_flag;
b=time_flag;
c=0;
d=0;
}
else
{
t_flag=1; //改為東西通行模式
time_flag= dongxi_time; //東西通行時(shí)間變量
}
}
if(t_flag==1) //此時(shí)為東西通行模式
{
if(time_flag>2)
{
dongxitong();
c=time_flag; d=time_flag;
a=time_flag-3; b=time_flag-3;
}
else if(time_flag>0)
{
ew_red=1; ew_green=1; ew_yellow=0; //東西黃燈
sn_red=0; sn_green=1; sn_yellow=1; //南北紅燈
c=time_flag;d=time_flag;
a=0;b=0;
}
else
{
t_flag=0; //改為東西通行模式
time_flag= nanbei_time; //南北通行時(shí)間變量
}
}
}
else if(time_m>=10) //判斷計(jì)時(shí)變量是否大于10
{
if(t_flag==0) //若t_flag為0,則進(jìn)入南北通行模式
{
if(time_flag>2)
{
nanbeitong();
}
else if(time_flag>0)
{
sn_red=1; sn_green=1; sn_yellow=1;
ew_red=0; ew_green=1; ew_yellow=1; //東西紅燈
}
else
{
t_flag=1; //此時(shí)南北通行計(jì)時(shí)結(jié)束,改為東西通行模式
time_flag= dongxi_time; //東西通行時(shí)間變量
}
}
if(t_flag==1) //此時(shí)為東西通行模式
{
if(time_flag>2)
{
dongxitong();
}
else if(time_flag>0)
{
ew_red=1; ew_green=1; ew_yellow=1;
sn_red=0; sn_green=1; sn_yellow=1; //南北紅燈
}
else
{
t_flag=0; //東西通行計(jì)時(shí)結(jié)束,改為東西通行模式
time_flag= nanbei_time; //南北通行時(shí)間變量
}
}
}
}
|
|