qq_59029490 2024-02-22 17:39 采纳率: 0%
浏览 11

关于#单片机#的问题:使用at89c52单片机无法接收数据(相关搜索:串口通信)

protues仿真串口通信,使用at89c52单片机无法接收数据,但是使用stc15w4k32s4却可以。

UART.c
#include <STC89C5xRC.H>
#include "uart.h"

void UartInit(void)        //9600bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    AUXR &= 0xBF;        //定时器1时钟为Fosc/12,即12T
    AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
    TMOD &= 0x0F;        //清除定时器1模式位
    TMOD |= 0x20;        //设定定时器18位自动重装方式
    TL1 = 0xFD;        //设定定时初值
    TH1 = 0xFD;        //设定定时器重装值
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;        //启动定时器1
    //开启中断
    EA=1;    //总中断控制
    ES=1;    //串口中断
}

void UART_SendByte(unsigned char Byte)
{
    SBUF = Byte;
    while(TI==0);
    TI = 0;
}
UART.h
#ifndef __UART__H_
#define __UART__H_

void UartInit(void);
void UART_SendByte(unsigned char Byte);
#endif
main.c
#include <STC89C5xRC.H>
#include "uart.h"

void main()
{
    UartInit();
    while(1)
    {
    }
}

//串口中断
void UART_Routine() interrupt 4
{
    unsigned char c;
    if(RI==1)
    {
        RI=0;//复位
        c=SBUF;
        UART_SendByte(c);//将数据发回
    }
}

使用at89c52单片机无法接收数据图,单片机晶振已改到11.0592MHz,虚拟终端也改成了9600

img


使用stc15w4k32s4单片机正常接收图

img

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-02-22 17:51
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    根据您提供的代码和描述,可能导致 AT89C52 单片机无法接收数据的原因有以下几个方面:

    1. 中断设置问题:在 AT89C52 中,串口接收数据时需要通过中断来处理,但是您提供的代码中并未开启串口中断。在 UartInit() 函数中,需要设置 ES=1 来使能串口中断,确保可以正确接收数据。

    2. 波特率设置问题:在您提供的代码中,波特率被设置为 9600bps,但是在程序中并未设置波特率相关的参数,如实际的波特率控制位。在 AT89C52 中,波特率的设置需要精确匹配,应确保波特率控制位设置正确。

    3. 硬件连接问题:AT89C52 的串口通信需要连接到正确的引脚,以确保数据能够正确传输。请确保串口通信的引脚连接正确,包括串口的接收端 RX、发送端 TX,以及地线和电源线等。

    解决方案:

    1. UartInit() 函数中添加 ES=1,使能串口中断。

      void UartInit(void)        //9600bps@11.0592MHz
      {
          PCON &= 0x7F;        //波特率不倍速
          SCON = 0x50;        //8位数据,可变波特率
          AUXR &= 0xBF;        //定时器1时钟为Fosc/12,即12T
          AUXR &= 0xFE;        //串口1选择定时器1为波特率发生器
          TMOD &= 0x0F;        //清除定时器1模式位
          TMOD |= 0x20;        //设定定时器18位自动重装方式
          TL1 = 0xFD;        //设定定时初值
          TH1 = 0xFD;        //设定定时器重装值
          ET1 = 0;        //禁止定时器1中断
          TR1 = 1;        //启动定时器1
          //开启中断
          EA=1;    //总中断控制
          ES=1;    //串口中断
      }
      
    2. UartInit() 函数中根据实际情况设置波特率控制位,确保波特率设置正确。

    3. 确保硬件连接正确,包括串口的引脚连接和电源接地等。

    以上是针对 AT89C52 单片机无法接收数据的可能解决方案。如果问题仍然存在,请进一步检查硬件连接是否正确,以及串口通信的其他设置是否符合要求。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    评论

报告相同问题?

问题事件

  • 创建了问题 2月22日

悬赏问题

  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参
  • ¥15 福州市的全人群死因监测点死亡原因报表
  • ¥15 Altair EDEM中生成一个颗粒,并且各个方向没有初始速度
  • ¥15 系统2008r2 装机配置推荐一下
  • ¥15 悬赏Python-playwright部署在centos7上