📄 traffic.c
字号:
#include <reg51.h>
//P1_0表示南北红灯
sbit P1_0=P1^0;
//P1_1表示南北绿灯
sbit P1_1=P1^1;
//P1_2表示南北黄灯
sbit P1_2=P1^2;
//P1_3表示东西红灯
sbit P1_3=P1^3;
//P1_4表示东西绿灯
sbit P1_4=P1^4;
//P1_5表示东西黄灯
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
/*时序:
启动时先南北红灯亮 东西绿灯亮
25秒后东西绿灯转为黄灯每秒闪一次
则亮0.5秒再灭0.5秒 闪5次之后
转为南北绿灯亮东西红灯亮
25秒后南北绿灯转为黄灯每秒闪一次
则亮0.5秒再灭0.5秒 闪5次
然后循环 则60秒一个循环*/
unsigned char Count;
unsigned char HalfSecond;
void Timer0_Init(void)
{
TMOD=0x01;//T0为16位定时器计数器
TH0=-50000/256;
TL0=-50000%256;//用12兆晶振时为50毫秒溢出一次
}
void IO_Init(void)
{
P0=0x00;
P1=0x00;
P1=0x11; //南北红灯亮 东西绿灯亮
P3=0xff;
}
void System_Init(void)
{
IO_Init();
Timer0_Init();
TR0=1;
ET0=1;
EA=1;
}
//用两位LED的动态显示以显示南北或东西方向的时间
code unsigned char Table[10]={0x3f,};
xdata unsigned char Dis_Buf[2]={0};
void NmDelay(unsigned char n)
{
unsigned char i=0;
while(n--)
{
for(i=0;i<125;)
i++;
}
}
void PreDisplay(void)
{
unsigned char Temp=0;
Temp=HalfSecond/2;
if(Temp>25&&Temp<30)
Temp-=25;
if(Temp>30&&Temp<55)
Temp-=30;
if(Temp>55)
Temp-=55;
Dis_Buf[0]=Temp/10;
Dis_Buf[1]=Temp%10;
}
void Display(void)
{
PreDisplay();
P0=Table[Dis_Buf[1]];
P3_5=0;
NmDelay(10);
P0=Table[Dis_Buf[0]];
P3_5=1;
P3_4=0;
NmDelay(10);
}
main()
{
SP=0x60;
System_Init();
while(1)
{
Display();
}
}
void Timer0(void) interrupt 1 using 1
{
//TR0=1;
ET0=0;
if(Count++==10)
{
Count=0;
HalfSecond++;
if(HalfSecond==50)
{
P1_4=0;
P1_5=1;
}
if(HalfSecond>50&&HalfSecond<60)
{
if(((HalfSecond-50)%2)!=0)
P1_5=0;
else P1_5=1;
}
if(HalfSecond==60)
{
P1_5=0;
P1_0=0;
P1_1=1;
P1_3=1;
}
if(HalfSecond==110)
{
P1_1=0;
P1_2=1;
}
if(HalfSecond>110&&HalfSecond<120)
{
if(((HalfSecond-110)%2)!=0)
P1_2=0;
else P1_2=1;
}
if(HalfSecond>=120)
{
HalfSecond=0;
P1_0=1;
P1_4=1;
P1_3=0;
}
}
ET0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -