编写C51源程序,要求实现如下功能:U1机循环向U2机发送整数00~99,再根据从U2机发来的返回值决定是继续发送新数(若返回值与发送值相同时)还是重复发送当前数(若返回值与发送值不同时);U2机则是将从U1机上接收
时间: 2024-02-15 09:01:33 浏览: 157
的整数加1后返回给U1机。
以下是实现该功能的C51源程序:
```c
#include <reg52.h>
sbit TX = P3^1; // U1机发送引脚
sbit RX = P3^0; // U1机接收引脚
sbit TX2 = P3^3; // U2机发送引脚
sbit RX2 = P3^2; // U2机接收引脚
void delay(unsigned int t) // 延时函数
{
unsigned int i, j;
for (i = 0; i < t; i++)
for (j = 0; j < 125; j++);
}
void initUART() // 初始化串口
{
TMOD = 0x20; // 计时器1工作在模式2,8位自动重载
TH1 = 0xfd; // 波特率9600,定时器初值
TL1 = TH1; // 定时器初值
TR1 = 1; // 启动计时器1
SCON = 0x50; // 串口工作在模式1,允许接收
ES = 1; // 开启串口中断
EA = 1; // 开启总中断
}
void sendChar(unsigned char c) // 发送一个字符
{
SBUF = c;
while (TI == 0);
TI = 0;
}
void sendInt(unsigned int n) // 发送一个整数
{
unsigned char buf[3];
buf[2] = n % 10 + '0';
buf[1] = n / 10 % 10 + '0';
buf[0] = n / 100 % 10 + '0';
sendChar(buf[0]);
sendChar(buf[1]);
sendChar(buf[2]);
}
unsigned char receiveChar() // 接收一个字符
{
while (RI == 0);
RI = 0;
return SBUF;
}
unsigned int receiveInt() // 接收一个整数
{
unsigned char buf[3];
buf[0] = receiveChar();
buf[1] = receiveChar();
buf[2] = receiveChar();
return (buf[0] - '0') * 100 + (buf[1] - '0') * 10 + buf[2] - '0';
}
void main()
{
unsigned int num = 0; // 发送的整数
unsigned int result; // 接收的返回值
initUART(); // 初始化串口
while (1)
{
sendInt(num); // 发送整数
delay(10); // 延时等待接收
result = receiveInt(); // 接收返回值
if (result == num) // 判断是否继续发送新数
num++;
}
}
void UART() interrupt 4 // 串口中断处理函数
{
if (RI == 1) // 串口接收中断
{
RI = 0;
sendChar(SBUF + 1); // 接收到的整数加1后返回
}
}
```
该程序中使用了两个串口,分别连接U1机和U2机。U1机循环向U2机发送整数00~99,并等待接收返回值。如果返回值与发送值相同,则发送下一个数;否则重复发送当前数。U2机接收U1机发送的整数,并将其加1后返回给U1机。程序中使用了串口中断,可以在接收到字符时立即做出响应,提高了程序的实时性。
阅读全文