标题: C51单片机串口通讯num不赋值为什么一直发送00 00 00,num换个值比如3,就一直不停的发3 [打印本页]

作者: 89C52RC单片机    时间: 2023-3-22 08:59
标题: C51单片机串口通讯num不赋值为什么一直发送00 00 00,num换个值比如3,就一直不停的发3
[attach]311085[/attach]
单片机代码如下,发送不停,发送不受控制,发送函数只运行了一次

#include <REGX51.H>

unsigned char num;

void URET_TX()
{               SBUF=num;         //发送数据
                      while(!TI);//等待发送中断请求标志位为1(已发送)
                                        TI=0;                //发送中断请求标志位清0


        }

void URET_Tu(void)                //4800bps@11.0592MHz
{
  PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位数据,可变波特率
        TMOD &= 0x0F;                //清除定时器1模式位
        TMOD |= 0x20;                //设定定时器1为8位自动重装方式
        TL1 = 0xFA;                //设定定时初值
        TH1 = 0xFA;                //设定定时器重装值
        ET1 = 0;                //禁止定时器1中断
        TR1 = 1;//启动定时器
}

void main(void)
{
        URET_Tu();

                          URET_TX();
                              
}

1.png (20.91 KB, 下载次数: 91)

1.png

作者: glinfei    时间: 2023-3-22 10:21
你把 while(!);放到最后,就只发一次了。
作者: hche1993    时间: 2023-3-22 13:38
楼上说的对,URET_TX();后面加个while(1); 重复发数据是因为URET_TX();执行完,后面没有程序了,跑飞复位了
作者: coody_sz    时间: 2023-3-22 14:16
连大循环都没有?那就是这样了,不断重复的运行main()。
作者: 暖西夏    时间: 2023-3-22 14:37
程序一直在运行main函数,一直在发送数据,所以就一直接收数据了,如果想执只发一次,就把程序修改为void main(void)
{
       URET_Tu();
       while(1)
        {URET_TX();}                          
}
作者: yzwzfyz    时间: 2023-3-22 16:23
无论你赋值与否,它总有一个值,是什么?取决于上最的状态或初始化值。
所以发0,不必奇怪。
作者: 89C52RC单片机    时间: 2023-3-22 16:54
放大循环里面也不行,for循环也不行,是不是看门狗的原因
作者: Hephaestus    时间: 2023-3-22 17:58
main最后一行后面没有死循环,死机了,自动复位,又重新执行了main。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1