利用51单片机,结合下面两段代码,编译代码实现数码管显示信号灯时间: 第一段: #include <reg51.h> unsigned char code table[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E}; unsigned char i, j, flag; char Count; void putch(unsigned char n) { SBUF=n; while(TI==0); TI=0; } void main() { TMOD=0X01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; flag=0; Count=59; while(1) { i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); } } void Timer0() interrupt 1 { flag++; TH0=(65536-50000)/256; TL0=(65536-50000)%256; if(flag==20){ flag=0; Count=Count-1; } if(Count<0){ Count=59; } i=table[Count/10]; j=table[Count%10]; putch(i); putch(j); } 第二段: #include<reg52.h> #define uchar unsigned char uchar count,ge,shi,tt,time,color,flag; uchar table[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0, 0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E}; void yellow() { time=3; P1=0x08; if(flag==1) color=3; if(flag==0) color=2; } void red() { time=20; P1=0x10; flag=1; color=1; } void green() { time=20; P1=0x04; flag=0; color=1; } void light() { switch(color){ case 1: yellow();break; case 2: red();break; case 3: green();break; } } void main(){ color=2; flag=0; count=3; time=10; tt=0; TMOD=0x01; TL0=0xB7; TH0=0x3C; EA=1; ET0=1; TR0=1; while(1){ if(tt==20){ if(count<=0){ light(); count=time; } tt=0; TR0=0; count--; TR0=1; } } } void time_0() interrupt 1{ TL0=0xB7; TH0=0x3C; tt++; }
时间: 2023-10-22 09:07:57 浏览: 84
首先,需要将两段代码结合起来,因为它们都有关于定时器的操作。可以将第二段代码中的计时器操作放到第一段代码的计时器中断函数中。在每次计时器中断时,先判断当前信号灯状态,并根据状态设置显示的时间和颜色。然后进行倒计时,将剩余时间转换为两位数,分别显示在数码管上。具体操作如下:
#include <reg51.h>
#define uchar unsigned char
uchar code table[] = {0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E};
uchar count, time, color, flag;
uchar i, j;
void putch(uchar n) {
SBUF = n;
while (TI == 0);
TI = 0;
}
void main() {
TMOD = 0X01;
EA = 1;
ET0 = 1;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
TR0 = 1;
flag = 0;
count = 59;
color = 2; // 初始状态为红灯
time = 20;
while (1) {
i = table[count / 10];
j = table[count % 10];
putch(i);
putch(j);
}
}
void Timer0() interrupt 1 {
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
count--;
if (count < 0) {
count = time;
if (color == 1) { // 当前为红灯状态
time = 3;
color = 3;
} else if (color == 2) { // 当前为黄灯状态
time = 20;
color = 1;
flag = 1;
} else { // 当前为绿灯状态
time = 20;
color = 2;
flag = 0;
}
}
i = table[count / 10];
j = table[count % 10];
putch(i);
putch(j);
}
其中,count表示倒计时的剩余时间,time表示当前信号灯需要显示的时间,color表示当前信号灯的颜色状态,flag表示黄灯状态下是否需要变成红灯状态。在每次计时器中断时,首先进行倒计时,然后根据当前信号灯状态确定显示的时间和颜色,并将其设置为倒计时的时间和颜色。最后将倒计时的剩余时间转换为两位数,并显示在数码管上。
阅读全文