After winter is spring 2021-04-09 22:37 采纳率: 0%
浏览 62

C51单片机定时器0和串口同时使用 串口接收发送00 00

#include <REGX52.H>

unsigned int p,j,flag=0,ad=0,flag1=0,h;

void Init()
{
    SM0=0;
    SM1=1;
    REN=1;
    TMOD=0x21;
    TH0=(65536-45872)/256;
    TL0=(65536-45872)%256;
    TH1=0xfd;
    TL1=0xfd;

    TR1=1;
    ET0=1;
    EA=1;
    ES=1;
    PS=1;
    PT0=0;
   
}

void main()
{

    Init();
    while(1)
    {

        if(flag1==1)
        {
            flag1=0;        

        if(p==1)
        {
   
        TR0=1;
        }

        }
    }
}

void SS() interrupt 4
{


        RI=0;
        p=SBUF;
        ES=0;
        SBUF=p;
        while(TI==0);
        TI=0;
        ES=1;

        flag1=1;


}
void sss()interrupt 1
{
    TH0=(65536-45872)/256;
    TH1=(65536-45872)%256;
}

第 1次发送接收01后就变成00 00了

  • 写回答

1条回答 默认 最新

  • 码农阿豪@新空间 新星创作者: 前端开发技术领域 2024-07-18 17:22
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    这段代码是一个基于单片机的串口通信程序,主要功能是接收数据并发送相同数据。在这段代码中,使用了中断来实现串口通信。具体来说,串口接收中断(SS)用于接收数据并发送相同数据,定时器0中断(sss)用于定时重置定时器1。 根据您的描述,数据接收过程中出现数据异常。可能原因包括数据接收错误、数据发送错误或者串口配置错误。建议检查以下几点:
    1. 检查数据接收是否正确:确认串口接收中断(SS)中数据接收和发送的逻辑正确性,确保接收到的数据正确存储到p中,并确保发送的数据正确。
    2. 检查串口配置是否正确:确认串口工作模式、波特率等配置参数是否正确设置。确保主程序中的串口初始化函数Init()中的配置与串口通信设备一致。
    3. 检查数据发送是否正确:确认数据发送后,等待发送完成(TI=1)再重新使能串口接收(ES=1)。避免数据发送过程中发生错误。 如果以上检查没有解决问题,可以尝试添加调试信息,例如打印调试信息到串口或LED等,帮助进一步定位问题。 以下是串口接收中断(SS)和定时器中断(sss)的简单示例代码:
    void SS() interrupt 4{
        RI = 0;
        p = SBUF;
        ES = 0;
        SBUF = p;
        while(TI == 0);
        TI = 0;
        ES = 1;
        flag1 = 1;
    }
    void sss() interrupt 1{
        TH0 = (65536-45872)/256;
        TL0 = (65536-45872)%256;
    }
    

    希望以上信息对您有所帮助,如果有更多细节或者需要进一步帮助,请随时告诉我。

    评论

报告相同问题?