发送端的代码
8259A
的工作方式通过微处理器向其写入初始化命令字来确定。初始化命令字分别装入ICW1~ICW4
内部寄存器。8259A
在工作过程中,微处理器通过向其写入操作命令字来控制它的工作过程。操作命令字分别装入OCW1~OCW3
内部寄存器中。8259A
占用两个端口号,不同的命令字对应不同的端口,再加上命令字本身的特征位及加载的顺序就可以正确地把各种命令字写入对应的寄存器中。可能出错的地方是串口通信的波特率设置以及中断处理的问题。
首先,波特率设置需要确保发送端和接收端的波特率一致才能正常通信。在发送端和接收端的代码中,将TH1的值设置为0xFD,这相当于将定时器1的预置值设置为253,这并不符合常见的波特率设置。常见的波特率设置包括 4800、9600、14400、19200 等等。你可以使用在线的波特率计算器,根据晶振频率和目标波特率来计算正确的 TH1 值。
其次,现在的代码中没有使用中断处理接收事件。你需要在接收端的代码中通过中断处理来接收数据。8051单片机有两个串口中断:TI (发送中断) 和 RI (接收中断)。在你的代码中,只有发送完成标志位 TI 被清除,并没有处理接收中断。为了接收数据并响应,你可以使用中断处理函数来处理接收事件。
修正的代码如下所示:
发送端代码:
#include <reg51.h>
void UART_send(char data) {
SBUF = data;
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void main() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xFD; // 设置波特率为9600(根据实际需要修改)
SCON = 0x50; // 设置串口为模式1,允许接收
while (1) {
UART_send('A');
}
}
接收端代码:
#include <reg51.h>
void UART_receive() interrupt 4 {
if (RI) { // 判断是否为接收中断
RI = 0; // 清除接收完成标志位
P0 = SBUF; // 将接收到的数据发送到P0
}
}
void main() {
TMOD = 0x20; // 设置定时器1为模式2
TH1 = 0xFD; // 设置波特率为9600(根据实际需要修改)
SCON = 0x50; // 设置串口为模式1,允许接收
TI = 0; // 清除发送完成标志位
RI = 0; // 清除接收完成标志位
EA = 1; // 开启全局中断
ES = 1; // 开启串口中断
while (1) {
// 主循环中不需要处理串口事件
}
}
这样修改后的代码,会在接收到数据时,将数据发送到P0端口。同时,由于添加了中断处理函数,当接收到数据时会触发中断,从而处理接收事件。
请根据实际需求修改代码中的波特率设置和数据处理逻辑。
功能错误还是语法错误?这个都不说清楚让人怎么给你分析
大概看了一下 UART_SendChar函数有明显问题,发送的数据是 B,而不是函数的参数 c。
delay函数也有明显问题,明明是char,怎么会从450开始循环