89c52单片机交通信号灯数码管数字倒计时显示代码
时间: 2023-07-03 16:27:50 浏览: 149
以下是89c52单片机交通信号灯数码管数字倒计时显示代码:
```c
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit jia=P3^4;
sbit jian=P3^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar light[4]={0xfd,0xfb,0xf7,0xef};
uint time=60; //初始时间为60秒
void delay(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar num)
{
P0=table[num];
}
void main()
{
uchar i=0;
dula=1;
wela=1;
P0=0;
while(1)
{
if(i==0) //第一路红灯亮
{
P1=light[i];
for(time=60;time>=0;time--)
{
display(time/10);
wela=0;
wela=1;
dula=0;
dula=1;
display(time%10);
wela=0;
wela=1;
dula=0;
dula=1;
delay(1000);
}
i=1;
}
else if(i==1) //第二路绿灯亮
{
P1=light[i];
for(time=20;time>=0;time--)
{
display(time/10);
wela=0;
wela=1;
dula=0;
dula=1;
display(time%10);
wela=0;
wela=1;
dula=0;
dula=1;
delay(1000);
}
i=2;
}
else if(i==2) //第二路黄灯亮
{
P1=light[i];
for(time=5;time>=0;time--)
{
display(time/10);
wela=0;
wela=1;
dula=0;
dula=1;
display(time%10);
wela=0;
wela=1;
dula=0;
dula=1;
delay(1000);
}
i=3;
}
else if(i==3) //第一路绿灯亮
{
P1=light[i];
for(time=20;time>=0;time--)
{
display(time/10);
wela=0;
wela=1;
dula=0;
dula=1;
display(time%10);
wela=0;
wela=1;
dula=0;
dula=1;
delay(1000);
}
i=0;
}
if(jia==0) //加时间
{
time+=10;
delay(10);
}
if(jian==0) //减时间
{
time-=10;
delay(10);
}
}
}
```
代码注释如下:
- `sbit dula=P2^6;`: 数码管段选锁存器控制引脚
- `sbit wela=P2^7;`: 数码管位选锁存器控制引脚
- `sbit jia=P3^4;`: 加时间按键
- `sbit jian=P3^5;`: 减时间按键
- `uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};`: 共阴数码管显示0~9对应的编码
- `uchar light[4]={0xfd,0xfb,0xf7,0xef};`: 交通信号灯的4种状态
代码主要实现了以下功能:
- 交通信号灯状态按照规定顺序循环切换
- 数码管倒计时显示剩余时间
- 按下加/减时间按键可增加/减少倒计时时长
注意事项:
- 89c52单片机的P0口接数码管显示部分,P1口接交通信号灯控制部分
- 时钟频率为12MHz,延时函数的参数需要根据实际情况进行调整
阅读全文