使用一個數碼管顯示兩個路口的時間,只亮綠燈和黃燈的時間
主路綠燈60秒,黃燈3秒
支路綠燈20秒,黃燈3秒
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ge =P1^1;
sbit shi =P1^0;
sbit sn_red=P0^0;
sbit sn__yellow=P0^1;
sbit sn__green=P0^2;
sbit ew_red=P0^3;
sbit ew__yellow=P0^4;
sbit ew_green=P0^5;
sbit key_sn_allow=P3^2;
sbit key_ew_allow=P3^3;
sbit all_allow=P3^4;
sbit all_not=P3^5;
sbit time_add=P3^0; //
sbit time_sub=P3^1; //
sbit time_reset=P3^6;
uchar code s7_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //仿真使用的共陰極數碼管,實物燒錄時要取反
uint time=0;
uchar i,j;
void delay_ms(uchar z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display_time(uchar num)
{
shi=0;
P2=s7_table[num/10];
delay_ms(2);
P2=0;
shi=1;
ge=0;
P2=s7_table[num%10];
delay_ms(2);
P2=0;
ge=1;
}
void keyscan()
{
if(key_sn_allow==0)
{
delay_ms(2);
if(key_sn_allow==0)
{
ew_red=0;
ew_green=1;
ew__yellow=1;
sn_red=1;
sn__green=0;
sn__yellow=1;
while(!key_sn_allow)
display_time(0);
TR0=0;
}
}
if(key_ew_allow==0)
{
delay_ms(2);
if(key_ew_allow==0)
{
ew_red=1;
ew_green=0;
ew__yellow=1;
sn_red=0;
sn__green=1;
sn__yellow=1;
while(!key_ew_allow)
display_time(0);
TR0=0;
}
}
if(all_allow==0)
{
delay_ms(2);
if(all_allow==0)
{
TR0=0;
ew_red=1;
ew_green=0;
ew__yellow=1;
sn_red=1;
sn__green=0;
sn__yellow=1;
while(!all_allow);
}
}
if(all_not==0)
{
delay_ms(2);
if(all_not==0)
{
TR0=0;
ew_red=0;
ew_green=1;
ew__yellow=1;
sn_red=0;
sn__green=1;
sn__yellow=1;
while(!all_not);
}
}
}
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(time<63)
{
if(time<60)
{
if(time_add==0)
{
delay_ms(2);
if(time_add==0)
{
time--;
while(!time_add);
}
}
if(time_sub==0)
{
delay_ms(2);
if(time_sub==0)
{
time++;
while(!time_sub);
}
}
display_time(60-time);
ew_red=0;
ew_green=1;
ew__yellow=1;
sn_red=1;
sn__green=0;
sn__yellow=1;
}
else
{
display_time(63-time);
sn_red=1;
sn__yellow=0;
sn__green=1;
ew_red=0;
ew__yellow=1;
ew_green=1;
}
}
else if(time<83)
{
if(time_add==0)
{
delay_ms(2);
if(time_add==0)
{
time--;
while(!time_add);
}
}
if(time_sub==0)
{
delay_ms(2);
if(time_sub==0)
{
time++;
while(!time_sub);
}
}
display_time(83-time);
ew_red=1;
ew_green=0;
sn_red=0;
sn__green=1;
ew__yellow=1;
sn__yellow=1;
}
else
{
display_time(86-time);
sn_red=0;
sn__yellow=1;
sn__green=1;
ew_red=1;
ew__yellow=0;
ew_green=1;
}
keyscan();
}
}
void_int0_isr() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==20)
{
i=0;
++time;
if(time ==86)
{
time = 0;
}
}
}
|