|
本帖最后由 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; //南北通行时间
uchar dongxi_time; //东西通行时间
uchar time_flag; //时间标志位
uchar t_flag; //t_flag=0时南北通行,=1时东西通行
uchar time_m; //定义计时变量
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) //延时程序
{
uchar i,j; //一个毫秒的延时
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display_time( ) //显示倒计时
{
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];//东西个位显示
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];//南北个位显示
delay(2);
P2=0;P1_3 =1;
}
void init0_timer0() //定时器0初始化
{
TMOD=0X01; //定时器0设置为模式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(); //调用南北通行子程序
while(!nanbei) display_time();
TR0=0;
}
}
if(dongxi==0) //判断东西通行按键
{
delay(2);
if(dongxi==0) //防抖动
{
dongxitong(); //调用东西通行子程序
while(!dongxi) display_time();
TR0=0;
}
}
if(all_not==0) //判断全部禁行按键
{
delay(2); //延时2毫秒
if(all_not==0) //再次全部禁行按键
{
TR0=0; //进入全部禁行子程序,关闭定时器T0
ew_red=0; ew_green=1; ew_yellow=1; //东西红灯亮
sn_red=0; sn_green=1; sn_yellow=1; //南北红灯亮
}
}
if(dxjia==0) //判断东西加按键
{
delay(200); //延时
if(dxjia==1) //再次全部禁行按键
{
dongxi_time=dongxi_time+1;
time_flag=time_flag+1;
}
}
if(dxjian==0) //判断东西减按键
{
delay(200); //延时
if(dxjian==1) //再次全部禁行按键
{
dongxi_time=dongxi_time-1;
time_flag=time_flag-1;
}
}
if(nbjia==0) //判断南北加按键
{
delay(200); //延时
if(nbjia==1) //再次全部禁行按键
{
nanbei_time=nanbei_time+1;
time_flag=time_flag+1;
}
}
if(nbjian==0) //判断南北减按键
{
delay(200); //延时
if(nbjian==1) //再次全部禁行按键
{
nanbei_time=nanbei_time-1;
time_flag=time_flag-1;
}
}
}
void main() //主程序
{
nanbei_time=24; //初始化南北通行时间
dongxi_time=12; //初始化东西通行时间
t_flag=0;
time_flag=nanbei_time;
time_m =0; //计时变量初始化
init0_timer0(); //调用定时器T0初始化子程序
nanbeitong(); //调用南北通行子程序
while(1)
{
keyscan(); //调用键盘扫描
display_time(); //调用显示倒计时
}
}
void int0_isr() interrupt 1 //定时器T0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time_m++; //计时变量加1
if(time_m>=20) //判断计时变量是否大于20
{
time_m=0; //计时变量大于20,则把计时变量清零
time_flag--;
if(t_flag==0) //若t_flag为0,则进入南北通行模式
{
if(time_flag>2)
{
nanbeitong(); //南北通行红绿灯
a=time_flag;
b=time_flag;
c=time_flag-3;
d=time_flag-3;
}
else if(time_flag>0) //若倒计时时间小于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; //东西通行时间变量
}
}
if(t_flag==1) //此时为东西通行模式
{
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; //南北通行时间变量
}
}
}
else if(time_m>=10) //判断计时变量是否大于10
{
if(t_flag==0) //若t_flag为0,则进入南北通行模式
{
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; //此时南北通行计时结束,改为东西通行模式
time_flag= dongxi_time; //东西通行时间变量
}
}
if(t_flag==1) //此时为东西通行模式
{
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; //东西通行计时结束,改为东西通行模式
time_flag= nanbei_time; //南北通行时间变量
}
}
}
}
|
|