wulin 发表于 2023-3-20 21:22 为啥是先判断是否接收到数据(即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 大师你那上面的程序可以收发 |
89C52RC单片机 发表于 2023-3-20 12:28 #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(); } } |
我复制错了下面才是在主函数中,URET_TX(SBUF)的参数是未初始化的变量SBUF,它没有定义任何值。因此,在发送数据之前,您需要在主函数中定义并赋值给SBUF变量。 另外,在URET_TX函数中,while循环应该检查RI标志位是否为1,表示接收到数据,而不是TI标志位是否为0,表示数据传输完成。要处理接收到的数据,请先读取SBUF缓冲器,然后重置RI标志位。 最后,您需要配置串口通信的波特率,否则默认波特率可能与您的设备不兼容,导致无法正常通信。 |
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循环中重复调用。助 |