📄 traffic.c
字号:
/*程序功能:89S52单片机交通灯模拟程序*************/
/*设计者:吴海林**********************/
/*硬件说明:P0口作为数码管段控,P1口作为数码管位近代
P2口作为交通灯信号模拟P2.0为绿,P2.1为黄
P2.3为红,P2.4为绿,P2.5为黄,P2.6为红*****************/
#include "reg52.h"
#include "absacc.h"
typedef unsigned char uchar;
sbit green1=P2^0;
sbit red1=P2^1;
sbit yellow1=P2^2;
sbit green2=P2^3;
sbit red2=P2^4;
sbit yellow2=P2^5;
void Init_Timer0(void);
void contr(void);
void time(void);
void State0(void);
void State1(void);
void State2(void);
void State3(void);
void display(uchar data *p); //显示子程序
void deltime(uchar s);
uchar code tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //在ROM中定义数字转换码;
uchar data b[4];
uchar data flag,state,second,n=0;
void main(void)
{ Init_Timer0();
TR0=1;
EA=1;
ET0=1;
contr();
}
/*定时器0初始化*/
void Init_Timer0(void)
{
TMOD=0x01;
TH0=0x3c;
TL0=0xb0;
}
/*交通灯控制程序*/
void contr(void)
{loop:state=0;
second=40;
while(1)
{switch(state)
{case 0: if(second==0){state=1;second=5;display(b);}
else State0();break;
case 1: if(second==0){state=2;second=20;display(b);}
else State1();break;
case 2: if(second==0){state=3;second=5;display(b);}
else State2();break;
case 3: if(second==0){state=0;second=40;display(b);}
else State3();break;
default: goto loop;
}
}
}
/*不同状态时,调用相应的处理程序*/
void State0(void)
{ green1=1;red1=0;yellow1=0;
green2=0;red2=1;yellow2=0;
b[0]=second%10;b[1]=second/10;
b[2]=(second+5)%10;b[3]=(second+5)/10;
display(b);
}
void State1(void)
{ green1=0;red1=0;yellow1=1;
green2=0;red2=1;yellow2=0;
b[0]=second%10;b[1]=second/10;
b[2]=second%10;b[3]=second/10;
display(b);
}
void State2(void)
{ green1=0;red1=1;yellow1=0;
green2=1;red2=0;yellow2=0;
b[0]=(second+5)%10;b[1]=(second+5)/10;
b[2]=second%10;b[3]=second/10;
display(b);
}
void State3(void)
{ green1=0;red1=1;yellow1=0;
green2=0;red2=0;yellow2=1;
b[0]=second%10;b[1]=second/10;
b[2]=second%10;b[3]=second/10;
display(b);
}
/*显示程序*/
void display( uchar data *p)
{ uchar data i,sel;
sel=0x01;
for(i=0;i<=3;i++)
{P0=tab[*p];
P1=~sel;
deltime(1);
P1=0xff;
p++;
sel=sel<<1;
}
}
/*延时程序,使数码管每次点亮的时间足够长*/
void deltime(uchar s)
{ uchar data j;
while(s--)
{for(j=0;j<=125;j++);}
}
/*中断程序*/
void time(void) interrupt 1 using 1
{TR0=0;
TH0=0x3c;
TL0=0xb0;
n++;
if(n==20)
{n=0;second--;}
TR0=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -