📄 traffic.txt
字号:
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define PA8155 XBYTE[0x7101] //8155的PA口地址
#define PB8155 XBYTE[0x7102] //8155的PB口地址
#define COM8155 XBYTE[0x7100] //8155的P控制口地址
uchar t1,t11,t12,t2,t21,t22,t3,t4,x,m,k;
uint p,n,i,j,q;
uchar flag1=0; //标志位初始化0
uchar code tab[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6}; //0~9的段码
void display(uchar t);
void disp();
//延时函数,送数码管各位数之间的延时
void delay(uint t)
{
uint m;
for(m=0;m<t;m++);
}
//外部中断0子程序,每发生一次中断,东西路口灯亮时间加1或1
void as1() interrupt 0 using 1
{
uint z;
z=100;
if(flag1==0) //标志位为0时间加1
t3++;
else
t3--; //否则时间减1
t1=t3;
t2=t4;
while(z--) //显示当前时间值
{
disp();
}
}
//外部中断1子程序,每发生一次中断,南北路口灯亮时间加1或1
void as2() interrupt 2 using 1
{
uint z;
z=80;
if(flag1==0)
t4++;
else
t4--;
t1=t3;t2=t4;
while(z--)
{
disp();
}
}
//主函数
//功能: 模拟交通灯中东西绿灯亮南北红灯亮,延时一段时间后,
//东西变为黄灯闪烁,南北红灯亮,再延时;之后转换为东西红灯亮,
//南北绿灯亮,延时一定时间后,东西红灯亮,南北黄灯闪烁,延时之后,重复执行。
//灯亮时间可控,初始化为绿灯亮时间为25S,红灯时间为30S,黄灯时间为5S。
//中断发生后,灯亮时间改变,黄灯时间等于红灯时间减去绿灯时间,
//灯亮时间在数码管上显示出来。
void main()
{
uchar x;
COM8155=0x03; //启动8155控制口
t3=25;t4=30; //给绿灯红灯赋初值
TMOD=0x51; //设置定时器0工作于方式1定时,定时器1工作于方式计数
TH1=0;TL1=0; //赋计数初值
TR1=1; //启动定时器1
EA=1; //开总中断
EX0=1;IT0=1; //开外部中断0,设置外部中断为脉冲触发方式
EX1=1;IT1=1; //开外部中断1,设置外部中断为脉冲触发方式
while(1)
{
if(TR0==1) //定时器0启动则模拟交通灯显示
{
if(t3>t4) //若t3>t4则交换红绿灯的时间
{x=t3;t3=t4;t4=x;}
t1=t3;t2=t4; //给两个路口灯的时间赋初值
P1=0xDE;
display(t3); //在数码管上显示两路口灯的时间
P1=0xBE;
t1=t2=t4-t3;
display(t1);
P1=0x0ED;
t1=t4;t2=t3;
display(t3);
P1=0x0BE;
t2=t1=t4-t3;
display(t2);
if(TR0==0) //如果停止计时路口灯灭
P1=0x0FF;
}
else //否则停止计时显示当前时间
{
t1=t3;t2=t4;
disp();
if(TH1==0&&TL1>0)
{
TH1=1;TL1=0;
flag1=1; //标志位置1
}
else if(TH1==1&&TL1>0)
{
TR0=1;TH1=2;TL1=0; //启动计时
}
}
}
}
void display(uchar t)
{
flag1=0;
for(i=0;TR0&&i<t;i++) //显示时间
{
for(j=0;j<20;j++) //50us的循环次数
{
TH0=(65536-50000)/256; //50us计数初值
TL0=(65536-50000)%256;
while(!TF0){disp();}
TF0=0;
}
if(TH1==2&&TL1>0)
{
TR0=0;TH1=0;TL1=0; //停止计时
P1=0x0FF;
break;
}
t1-=1; //灯亮时间减1
t2-=1;
}
}
void disp()
{
PA8155=0X80; //数码管位码
t11=t1/10; //求四个数码管上的数字
t12=t1%10;
t21=t2/10;
t22=t2%10;
PB8155=tab[t11]; //段码送显示数码管
delay(350); //各数码管之间的延时
PA8155/=2;
PB8155=tab[t12];
delay(350);
PA8155/=2;
PB8155=tab[t21];
delay(350);
PA8155/=2;
PB8155=tab[t22];
delay(350);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -