编写C51源程序,要求实现如下功能:U1机循环向U2机发送整数00~99,再根据从U2机发来的返回值决定是继续发送新数(若返回值与发送值相同时)还是重复发送当前数(若返回值与发送值不同时);U2机则是将从U1机上接收到的值作为返回值再发送给U1机。两机都将当前值以十进制数形式显示在各机的2位共阴极数码管上。
时间: 2024-02-15 15:01:22 浏览: 220
51单片机实现数码管循环显示00~99字样,到99后返回00重新显示,时间间隔为100ms。
5星 · 资源好评率100%
下面是一个简单的C51程序,实现了你的要求,它包含两个文件:main.c 和 uart.c。其中,main.c 实现了主程序,包含了循环向U2机发送整数00~99的代码,以及根据返回值决定是继续发送新数还是重复发送当前数的逻辑。uart.c 实现了串口通信相关的代码,包括初始化串口、发送数据和接收数据等函数。
main.c:
```c
#include <reg51.h>
#include "uart.h"
sbit LED = P1^0; // 用LED指示当前发送的数字
void main() {
unsigned char num = 0;
unsigned char last_num = 0;
unsigned char recv_num = 0;
uart_init(); // 初始化串口
while (1) {
// 发送当前数字
uart_send_byte(num);
LED = 1; // 点亮LED表示正在发送数字
// 等待接收返回值
while (!uart_receive_byte(&recv_num));
LED = 0; // 熄灭LED表示接收到返回值
// 判断返回值是否与发送值相同
if (recv_num == num) {
// 发送下一个数字
last_num = num;
num++;
if (num > 99) num = 0; // 循环计数
} else {
// 重复发送当前数字
num = last_num;
}
// 显示当前数字
P2 = num / 10; // 十位
P3 = num % 10; // 个位
}
}
```
uart.c:
```c
#include <reg51.h>
#define FOSC 11059200L // 系统时钟频率
#define BAUD 9600 // 串口波特率
#define TIMER_TH1 (0x100 - (FOSC / 12 / BAUD))
void uart_init() {
TMOD &= 0x0F;
TMOD |= 0x20; // 设置定时器1为模式2(8位自动重装载计数器)
TH1 = TIMER_TH1;
TL1 = TIMER_TH1;
TR1 = 1; // 启动定时器1
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
void uart_send_byte(unsigned char byte) {
SBUF = byte;
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
}
unsigned char uart_receive_byte(unsigned char *byte) {
if (RI) {
*byte = SBUF;
RI = 0; // 清除接收中断标志
return 1;
} else {
return 0;
}
}
void uart_isr() interrupt 4 {
if (TI) {
TI = 0; // 清除发送完成标志
}
if (RI) {
RI = 0; // 清除接收中断标志
}
}
```
阅读全文