📄 trifficlight.txt
字号:
#include<reg51.h> /*包含reg51.h头文件,该文件定义了8051内部所有的寄存器和I/O口*/
#include<absacc.h>
#define PORTA XBYTE[0X2000] /* 定义外部口地址 */
#define PORTB XBYTE[0X2001]
#define PORTC XBYTE[0X2002]
#define PORTG XBYTE[0X2003]
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71}; /* 字型表 */
uchar data light;
uchar data count;
uchar data sum;
bit flag;
void disply();
void delay (uchar x) // pA0--2 东西红黄绿 PA3--5 南北红黄绿
{ //PB0--7 数码管LED段选
uchar i; //PC0--2 对应数码管位选 与138 ABC相连
while((x--)!=0)
{
for(i=0;i<125;i++)
{;}
}
}void T0_srv (void) interrupt 1 using 1 /* T0中断服务函数完成1s定时*/
{
TH0=-(50000/256);
TL0=-(50000%256);
count++;
if(count==20)
{
count=0;
flag=1;
}
}
void int0_srv(void) interrupt 0 using 2 /* 外中断0完成当有救护车和消防车通过
时,两个方向均亮红灯,救护车和消防车通过后恢复原来状态。
用一个手动控制开关,接在INT0的输入端,当开关接通时,保存
P1口状态,使两个方向红灯亮,等开关断开后,恢复P1口状态。*/
{
uchar a;
delay(20);
if(!INT0)
{
a=light; /*保留P1鬃态*/
PORTA=0xff;
PORTA=0xf6;
while(!INT0); /*等待开关断开*/
PORTA=a; /*恢复P1状态*/
}
}
void main()
{
PORTG=0x80;
PORTA=0xff;
PORTB=0x00;
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
EA=1;
ET0=1;
PX0=1;
EX0=1;
TR0=1;
PORTA=0xff;
while(1)
{
light=0xde; /*(东西:红;南北:绿) 亮5秒*/
PORTA=0xde;
sum=5;
while(sum>0)
{
disply();
while(!flag);
flag=0;
sum--;
disply();
}
sum=3;
light=0xee;
PORTA=0xee; /* 南北方向(绿灯灭,黄灯亮)3秒 */
while(sum>0)
{
disply();
while(!flag);
flag=0;
sum--;
disply();
}
sum=8;
light=0xf3;
PORTA=0xf3; /* 南北方向(黄灯灭,红灯亮) 8秒 */ /* 东西方向(红灯灭,绿灯亮)8秒 */
while(sum>0)
{
disply();
while(!flag);
flag=0;
sum--;
disply();
}
sum=3;
light=0xf5;
PORTA=0xf5;/* 东西方向(绿灯灭,黄灯亮)3秒 */
while(sum>0)
{
disply();
while(!flag);
flag=0;
sum--;
disply();
}
PORTA=0xff; /* 东西方向黄灯灭 */ /* 南北方向红灯灭 */
}
}
void disply(void)
{
uchar ds1,ds2;
ds1=sum/10;
ds2=sum%10;
PORTB=table[ds1];
PORTC=0x00;
delay(20);
PORTB=table[ds2];
PORTC=0x01;
delay(20);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -