51开发板代码完成以下功能1 开发板上选三个LED,分别设置为 红灯、绿灯、黄灯(板子上都是红色,可以标记一下)其中,红灯10秒,绿灯15秒,黄闪5秒,往返循环 2 数码管显示当前信号灯的倒计时 3 USB转串口,接串口调试助手,可以实时输出:当前灯色+剩余时间
时间: 2024-03-10 11:48:56 浏览: 25
以下是51单片机的代码实现,需要连接三个LED灯,一个数码管和一个USB转串口模块。其中,红灯连接P1.0口,绿灯连接P1.1口,黄灯连接P1.2口,数码管连接P2口,USB转串口模块连接P3口。
```
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
// 数码管位选和段选控制
sbit dula = P2^6;
sbit wela = P2^7;
// LED灯控制
sbit red_led = P1^0;
sbit green_led = P1^1;
sbit yellow_led = P1^2;
// 定义计时器的初值
uint red_time = 10000; // 10秒
uint green_time = 15000; // 15秒
uint yellow_time = 5000; // 5秒
// 定义倒计时标志位
uchar red_flag = 0;
uchar green_flag = 0;
uchar yellow_flag = 0;
// 定义串口发送函数
void send_char(uchar c) {
SBUF = c;
while(TI == 0);
TI = 0;
}
// 定义数码管显示函数
void display(uint time) {
uint i;
uchar code num[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f
};
for(i = 0; i < 100; i++) {
dula = 1;
P0 = num[time % 10];
dula = 0;
wela = 1;
P0 = 0xf7;
wela = 0;
time /= 10;
_nop_();
}
}
// 定义主函数
void main() {
TMOD = 0x01; // 定时器0工作模式1
TH0 = 0xfc; // 定时器0初值
TL0 = 0x18;
TR0 = 1; // 启动定时器0
ET0 = 1; // 开启定时器0中断
EA = 1; // 开启总中断
red_led = 1; // 初始为红灯亮
while(1) {
if(red_flag) { // 红灯倒计时
display(red_time);
send_char('R');
send_char(':');
send_char((red_time / 10000) % 10 + '0');
send_char((red_time / 1000) % 10 + '0');
send_char((red_time / 100) % 10 + '0');
send_char((red_time / 10) % 10 + '0');
send_char('\r');
send_char('\n');
} else if(green_flag) { // 绿灯倒计时
display(green_time);
send_char('G');
send_char(':');
send_char((green_time / 10000) % 10 + '0');
send_char((green_time / 1000) % 10 + '0');
send_char((green_time / 100) % 10 + '0');
send_char((green_time / 10) % 10 + '0');
send_char('\r');
send_char('\n');
} else if(yellow_flag) { // 黄灯倒计时
display(yellow_time);
send_char('Y');
send_char(':');
send_char((yellow_time / 10000) % 10 + '0');
send_char((yellow_time / 1000) % 10 + '0');
send_char((yellow_time / 100) % 10 + '0');
send_char((yellow_time / 10) % 10 + '0');
send_char('\r');
send_char('\n');
}
}
}
// 定时器0中断处理函数
void timer0() interrupt 1 {
static uint count = 0;
TH0 = 0xfc;
TL0 = 0x18;
count++;
if(count == 1000) { // 1秒钟计数一次
count = 0;
if(red_flag) { // 红灯倒计时
if(red_time > 0) {
red_time--;
} else {
red_time = 10000;
red_led = 0;
yellow_led = 1;
yellow_flag = 1;
red_flag = 0;
}
} else if(green_flag) { // 绿灯倒计时
if(green_time > 0) {
green_time--;
} else {
green_time = 15000;
green_led = 0;
yellow_led = 1;
yellow_flag = 1;
green_flag = 0;
}
} else if(yellow_flag) { // 黄灯倒计时
if(yellow_time > 0) {
yellow_time--;
} else {
yellow_time = 5000;
yellow_led = 0;
green_led = 1;
green_flag = 1;
yellow_flag = 0;
}
}
}
}
```
在串口调试助手中设置波特率为9600,连接上USB转串口模块后,即可实时输出当前灯色和剩余时间。