找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 534|回复: 4
收起左侧

请教各位,现在一直搞不清楚单片机串口代码是哪里的问题?

[复制链接]
ID:1067311 发表于 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...不停的出
回复

使用道具 举报

ID:94031 发表于 2023-3-21 07:37 | 显示全部楼层
在 main 最后应加 while(1);
回复

使用道具 举报

ID:123289 发表于 2023-3-21 13:27 | 显示全部楼层
老师有没有讲过,当MAIN函数执行到最后一句之后,CPU将如何运行呢?
回复

使用道具 举报

ID:1067311 发表于 2023-3-21 20:11 | 显示全部楼层
用过while(1)也是不行的 我另一个帖子  有朋友帮解决了 但是那个逻辑问题我还是很理解
回复

使用道具 举报

ID:1067311 发表于 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  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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