2401_83591674 2024-06-16 13:16 采纳率: 80.3%
浏览 0
已结题

51单片机串口怎么收发

51单片机串口通信怎么收发
单片机型号:STC89C51RC
代码部分:

#include <REGX52.H>
void UartInit()        //9600bps@11.0592MHz
{
    PCON &= 0x7F;        //波特率不倍速
    SCON = 0x50;        //8位数据,可变波特率
    TMOD &= 0x0F;        //清除定时器1模式位
    TMOD |= 0x20;        //设定定时器18位自动重装方式
    TL1 = 0xFD;            //设定定时初值
    TH1 = 0xFD;            //设定定时器重装值        
    TR1 = 1;            //启动定时器1
    ET1 = 0;            //禁止定时器1中断
    EA=1;                //开放总中断 
    ES=1;                //开放串口中断
}
void Uartsend(unsigned char byte)//发送
{
    SBUF=byte;//把数据写入发送缓冲区SBUF
    //数据发送完成的标志是TI=1;所以等待数据传送完
    while(TI==0);
    TI=0;//软件清零
}
void UART_ISR() interrupt 4//串口中断函数
{
    if(TI==1)//接收中断
    {
        Uartsend(SBUF);//把接收的数据发送到计算机
        TI=0;//软件清零
    }
}
int main()
{
    UartInit();
    while(1)
    {
        
    }
}
 
 

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-06-16 13:16
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    关于51单片机型号STC89C51RC的串口通信问题,你已经提供了一个基础的代码框架,下面我将针对你的问题进行一些解释和提供相应的代码修改建议。

    1. UartInit() 函数

    这个函数主要负责初始化串口的配置,包括波特率和串口模式。在你的代码中,波特率设置为9600bps,使用的是定时器1来生成波特率。你使用的是11.0592MHz的晶振,通过设置定时器1的初值和重装值来实现9600bps的波特率。这个函数还设置了串口为8位数据,可变波特率模式。

    2. Uartsend() 函数

    这个函数负责将数据发送到串口。数据通过写入SBUF寄存器来发送,并通过检查TI(发送中断标志位)来确认数据是否已经发送完成。一旦TI置位,表示数据已经发送出去,然后通过软件清零TI来准备下一次发送。

    3. UART_ISR() 函数

    这个函数是串口中断服务程序,用于处理接收到的数据。在你的代码中,存在一个逻辑错误:当接收到数据时,你错误地将接收到的数据再次发送出去,而不是进行其他处理。正确的做法是在接收中断服务程序中读取SBUF中的数据,并将其存储到一个变量或进行其他处理。

    修改建议

    以下是修改后的串口中断服务程序的示例代码:

    void UART_ISR() interrupt 4 //串口中断函数
    {
        if(RI==1) // 检查是否是接收中断
        {
            unsigned char receivedData = SBUF; // 读取接收到的数据
            RI=0; // 清除接收中断标志位
            // 这里可以添加代码来处理接收到的数据,例如打印或存储
        }
    }
    

    在这个修改中,我添加了一个检查RI(接收中断标志位)的条件,以确保我们只在接收到数据时进入中断服务程序。然后,我读取了SBUF中的数据到一个变量receivedData,并清除了RI标志位。你可以在这个位置添加代码来处理接收到的数据。

    参考资料

    请注意,具体的参考资料链接可能需要根据实际情况进行查找和验证。上述链接仅作为示例。如果你需要更详细的资料或有其他问题,请随时告诉我。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月19日
  • 已采纳回答 10月11日
  • 创建了问题 6月16日