//AT89S51交通灯 keil C51+Proteus仿真
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RED_A=P0^0; //东西方向
sbit YELLOW_A=P0^1;
sbit GREEN_A=P0^2;
sbit RED_B=P0^3; //南北方向
sbit YELLOW_B=P0^4;
sbit GREEN_B=P0^5;
uchar Time_Count=0,Flash_Count=0,Operation_Type=1;
void Timer0_INT() interrupt 1 //T0中断
{
TH0=-50000/256;
TL0=-50000%256;
switch (Operation_Type)
{
case 1: //东西方向绿灯南北方向红灯5s
RED_A=0;YELLOW_A=0;GREEN_A=1;
RED_B=1;YELLOW_B=0;GREEN_B=0;
if(++Time_Count!=100) return;
Time_Count=0;
Operation_Type=2;
break;
case 2: //东西方向黄灯闪烁,绿灯关闭
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_A=!YELLOW_A; GREEN_A=0;
if (++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=3;
break;
case 3: //东西方向红灯南北方向绿灯5s
RED_A=1;YELLOW_A=0;GREEN_A=0;
RED_B=0;YELLOW_B=0;GREEN_B=1;
if(++Time_Count!=100) return;
Time_Count=0;
Operation_Type=4;
break;
case 4: //南北方向黄灯开始闪烁,绿灯关闭
if(++Time_Count!=8) return;
Time_Count=0;
YELLOW_B=!YELLOW_B; GREEN_B=0;
if (++Flash_Count!=10) return;
Flash_Count=0;
Operation_Type=1;
break;
default :break;
}
}
void main()
{
TMOD=0x01; //TO方式1,频率11.0592MHz
IE=0x82;
TR0=1;
while(1);
}
|