8051单片机串口通信哪里错了如何修改

发送端的代码

img

img


接收端代码

img

img

img


哪里出错误了应该如何修个
还请详细的说明

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/939441
  • 你也可以参考下这篇文章:微机原理及应用->STC25F2K60S2单片机增强型8051内核
  • 除此之外, 这篇博客: 8086中断系统简答中的 的初始化命令字和操作命令字有什么区别?他们对应于编程结构哪些内部寄存器? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    1. 8259A的工作方式通过微处理器向其写入初始化命令字来确定。初始化命令字分别装入ICW1~ICW4内部寄存器。
    2. 8259A在工作过程中,微处理器通过向其写入操作命令字来控制它的工作过程。操作命令字分别装入OCW1~OCW3内部寄存器中。
    3. 8259A占用两个端口号,不同的命令字对应不同的端口,再加上命令字本身的特征位及加载的顺序就可以正确地把各种命令字写入对应的寄存器中。
  • 您还可以看一下 张先凤老师的《嵌入式技术基础课程》之8051汇编(基础部分)课程中的 计算机体系结构和指令系统小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    可能出错的地方是串口通信的波特率设置以及中断处理的问题。

    首先,波特率设置需要确保发送端和接收端的波特率一致才能正常通信。在发送端和接收端的代码中,将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开始循环