标题: 单片机串口程序,这样执行收发为什么不行,按逻辑应该是可以的 [打印本页]

作者: 89C52RC单片机    时间: 2023-3-19 21:38
标题: 单片机串口程序,这样执行收发为什么不行,按逻辑应该是可以的
#include <REGX52.H>
void URET_TX(unsigned int key)

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

{         
  PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0x15;                //设置定时初值
        TH1 = 0x15;                //设置定时重载值
  ET1 = 0;                //
        TR1 = 1;                 //定时器1中断

         
}
void main(void)
{
        URET_Tu();
while(1)
{
        URET_TX(SBUF);
}
}
作者: a185980800    时间: 2023-3-19 23:23
AI机器人给的答案看对你有没有帮面向工资编程   ChatGPT 多人模式 个人模式  #include <REGX52.H> void URET_TX(unsigned int key) { SBUF=key;//写入数据进SBUF缓存器 while(TI==0)//检测标志位,是否置1,如果置1,表示数据传输完成 {TI=0;}//重置标志位位0 if(RI==1)//检测是否接收完成 {P2=SBUF;//读取发送过来的SBUF数据 RI=0;}//重置标志位 } void URET_Tu(void) { PCON |= 0x80; //使能波特率倍速位SMOD SCON = 0x50; //8位数据,可变波特率 TMOD &= 0x0F; //设置定时器模式 TMOD |= 0x20; //设置定时器模式 TL1 = 0x15; //设置定时初值 TH1 = 0x15; //设置定时重载值 ET1 = 0; // TR1 = 1; //定时器1中断 } void main(void) { URET_Tu(); while(1) { URET_TX(SBUF); } }帮我检查一下这段代码有没有什么逻辑问题  这段代码可能存在逻辑问题,具体如下:  URET_TX函数中while循环的标志位重置操作TI=0应该在if判断语句前,否则会导致无限循环等待TI标志位变为1,阻塞程序执行。  在主函数中URET_TX(SBUF)传入的参数SBUF并没有被定义或初始化,因此不能保证其值的正确性。  在主函数中,URET_Tu()只需要在程序开始时调用一次即可,无需在while循环中重复调用。助
作者: a185980800    时间: 2023-3-20 07:25
我复制错了下面才是在主函数中,URET_TX(SBUF)的参数是未初始化的变量SBUF,它没有定义任何值。因此,在发送数据之前,您需要在主函数中定义并赋值给SBUF变量。  另外,在URET_TX函数中,while循环应该检查RI标志位是否为1,表示接收到数据,而不是TI标志位是否为0,表示数据传输完成。要处理接收到的数据,请先读取SBUF缓冲器,然后重置RI标志位。  最后,您需要配置串口通信的波特率,否则默认波特率可能与您的设备不兼容,导致无法正常通信。
作者: 89C52RC单片机    时间: 2023-3-20 12:28
a185980800 发表于 2023-3-20 07:25
我复制错了下面才是在主函数中,URET_TX(SBUF)的参数是未初始化的变量SBUF,它没有定义任何值。因此,在 ...

怎么弄都不行,一打开串口 一直不停的00 00 00 00 00....#include <REGX52.H>
void URET_TX(unsigned int key)
{

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

{         
  PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0x15;                //设置定时初值
        TH1 = 0x15;                //设置定时重载值
  ET1 = 0;                //
        TR1 = 1;                 //定时器1中断
   ES=1;
         
}
void main(void)
{
        URET_Tu();


        URET_TX(SBUF);

}


555.png (18.75 KB, 下载次数: 46)

如图

如图

作者: wulin    时间: 2023-3-20 21:22
89C52RC单片机 发表于 2023-3-20 12:28
怎么弄都不行,一打开串口 一直不停的00 00 00 00 00....#include
void URET_TX(unsigned int key)
{
...

#include <REG51.H>

unsigned char num;

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

void URET_Tu(void)                //4800bps@11.0592MHz
{
        PCON |= 0x80;                //使能波特率倍速位SMOD
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //设置定时器模式
        TMOD |= 0x20;                //设置定时器模式
        TL1 = 0xF4;                //设置定时初始值
        TH1 = 0xF4;                //设置定时重载值
        ET1 = 0;                //禁止定时器%d中断
        TR1 = 1;                //定时器1开始计时
}

void main(void)
{
        URET_Tu();
        while(1)
        {
                URET_TX();
        }
}

作者: 89C52RC单片机    时间: 2023-3-21 12:01
wulin 发表于 2023-3-20 21:22
#include

unsigned char num;

为啥是先判断是否接收到数据(即RI=1)再发送数据,而不是先由电脑发送数据,再来判断单片机是否接收,如果接收了 ,后面再取出?

即下面这样
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