标题: 请教各位,现在一直搞不清楚单片机串口代码是哪里的问题? [打印本页]

作者: 89C52RC单片机    时间: 2023-3-20 21:03
标题: 请教各位,现在一直搞不清楚单片机串口代码是哪里的问题?
代码如下所示,只要定时器一打开(TR1=1),串口助手里面就不停的显示00 00 00.。。,发送和接收都没反应,实在找不出哪里的问题,请各位大神帮看一下

#include <REGX52.H>
void URET_TX(unsigned char key)
{

                   SBUF=key;                   //写入数据进SBUF缓存器
                   if(TI==1)                  //检测标志位,是否是1,,表示数据传出完成
                   {
                         if(RI==1)            //检测是否接收完成,如果是1,标示数据被完整接收
                         P2=SBUF;      //读取发送过来的SBUF数据
                         RI=0;           //重置数据传输完成标志位
                         TI=0;      }        //重置数据接收完成标志位
}
void URET_Tu(void)

{         
        PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xF4;                //设定定时初值
        TH1 = 0xF4;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;          //启动定时器用于产生波特率

         ES=1;  //开启串口通信
         
}
void main(void)
{
        URET_Tu();


        URET_TX(SBUF);

}


上面代码 只要TR1=1,     URET_TX()函数中就算只有SBUF=key一个语句,也全是00 00 00...不停的出

作者: xuyaqi    时间: 2023-3-21 07:37
在 main 最后应加 while(1);
作者: yzwzfyz    时间: 2023-3-21 13:27
老师有没有讲过,当MAIN函数执行到最后一句之后,CPU将如何运行呢?
作者: 89C52RC单片机    时间: 2023-3-21 20:11
用过while(1)也是不行的 我另一个帖子  有朋友帮解决了 但是那个逻辑问题我还是很理解

作者: 89C52RC单片机    时间: 2023-3-21 20:14
yzwzfyz 发表于 2023-3-21 13:27
老师有没有讲过,当MAIN函数执行到最后一句之后,CPU将如何运行呢?

void URET_TX()
{   
        if(RI==1)                //查询接收中断请求标志位为1(已收到)
        {
                RI=0;                //接收中断请求标志位清0
                num=SBUF;        //获取接收寄存器数据
                SBUF=num;        //发送数据
                while(!TI);        //等待发送中断请求标志位为1(已发送)
                TI=0;                //发送中断请求标志位清0
        }
...................................................................................................分隔线
函数上面这样写就可以收发 ,但是换个顺序就不行,比如下面

void URET_TX()
{   
                SBUF=num;        //发送数据
                while(!TI);        //等待发送中断请求标志位为1(已发送)
                TI=0;                //发送中断请求标志位清0
        if(RI==1)                //查询接收中断请求标志位为1(已收到)
        {
                RI=0;                //接收中断请求标志位清0
                num=SBUF;        //获取接收寄存器数据
               
        }
}

我把它改成这样就又全部是00 000 00  





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1