找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 897|回复: 5
打印 上一主题 下一主题
收起左侧

单片机串口程序,这样执行收发为什么不行,按逻辑应该是可以的

[复制链接]
跳转到指定楼层
楼主
ID:1067311 发表于 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);
}
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:857072 发表于 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循环中重复调用。助
回复

使用道具 举报

板凳
ID:857072 发表于 2023-3-20 07:25 来自手机 | 只看该作者
我复制错了下面才是在主函数中,URET_TX(SBUF)的参数是未初始化的变量SBUF,它没有定义任何值。因此,在发送数据之前,您需要在主函数中定义并赋值给SBUF变量。  另外,在URET_TX函数中,while循环应该检查RI标志位是否为1,表示接收到数据,而不是TI标志位是否为0,表示数据传输完成。要处理接收到的数据,请先读取SBUF缓冲器,然后重置RI标志位。  最后,您需要配置串口通信的波特率,否则默认波特率可能与您的设备不兼容,导致无法正常通信。
回复

使用道具 举报

地板
ID:1067311 发表于 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, 下载次数: 45)

如图

如图
回复

使用道具 举报

5#
ID:213173 发表于 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();
        }
}
回复

使用道具 举报

6#
ID:1067311 发表于 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  大师你那上面的程序可以收发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表