qq_45379364 2023-03-17 20:04 采纳率: 82.9%
浏览 19
已结题

关于单片机读写寄存器的问题

请教,下面代码 不用中断处理,按逻辑一步步推进是可行的,但实际情况是,复位后灯亮,再发任何数据LED灯灭,重新写入数据根本不起作用,请问是什么原因。

#include <REGX52.H>
void URET_TX(unsigned int key)
{      
    
    
           while(TI==0)//判断信号是否接收完成
                      
                 {P2_3=SBUF;//读取寄存器中所写入的0,LED灯亮
                  
            }
                  TI=0;//重置信号完成标志位,重新进入上一个while循环
                
                
                
}


void URET_Tu(void)
 
{     
  PCON |= 0x80;        //使能波特率倍速位SMOD
    SCON = 0x50;        //8位数据,可变波特率
    TMOD &= 0x0F;        //设置定时器模式
    TMOD |= 0x20;        //设置定时器模式
    TL1 = 0x15;        //设置定时初值
    TH1 = 0x15;        //设置定时重载值
    TF1 = 0;        //清除TF1标志
    ET1 = 0;        //禁止定时器1中断
    TR1 = 1;         //允许止定时器1中断
  ES=1;      //串口中断
     
}
unsigned char word;
void main(void)
{ int n;
    URET_Tu();//初始化串口


    while(1)
    
 { URET_TX(SBUF);//写入数值0
      P2_3=1;//LED灯重新置地脚为高电位,完成后重新进入第一步,写入值
 }

        
    }

  • 写回答

3条回答 默认 最新

  • 追cium 2023-03-17 20:11
    关注

    参考GPT和自己的思路:

    根据你提供的代码,问题可能出现在URET_TX函数的while循环中。如果TI=0,则表明串口尚未完成数据传输,此时读取SBUF中的数据可能会导致未定义的行为。建议将while循环改为等待TI=1时再读取SBUF中的数据,同时在函数最后将TI重新置为0,以确保下一次数据传输时TI为0。另外,与该函数配套使用的URAT_Tu函数中也需要将TI初始值置为0。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月14日
  • 已采纳回答 3月6日
  • 创建了问题 3月17日

悬赏问题

  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了