找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 641|回复: 7
收起左侧

C51单片机串口通讯num不赋值为什么一直发送00 00 00,num换个值比如3,就一直不停的发3

[复制链接]
ID:1067311 发表于 2023-3-22 08:59 | 显示全部楼层 |阅读模式

单片机代码如下,发送不停,发送不受控制,发送函数只运行了一次

#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
回复

使用道具 举报

ID:844772 发表于 2023-3-22 10:21 | 显示全部楼层
你把 while(!);放到最后,就只发一次了。
回复

使用道具 举报

ID:1067760 发表于 2023-3-22 13:38 | 显示全部楼层
楼上说的对,URET_TX();后面加个while(1); 重复发数据是因为URET_TX();执行完,后面没有程序了,跑飞复位了
回复

使用道具 举报

ID:1034262 发表于 2023-3-22 14:16 | 显示全部楼层
连大循环都没有?那就是这样了,不断重复的运行main()。
回复

使用道具 举报

ID:807182 发表于 2023-3-22 14:37 | 显示全部楼层
程序一直在运行main函数,一直在发送数据,所以就一直接收数据了,如果想执只发一次,就把程序修改为void main(void)
{
       URET_Tu();
       while(1)
        {URET_TX();}                          
}
回复

使用道具 举报

ID:123289 发表于 2023-3-22 16:23 | 显示全部楼层
无论你赋值与否,它总有一个值,是什么?取决于上最的状态或初始化值。
所以发0,不必奇怪。
回复

使用道具 举报

ID:1067311 发表于 2023-3-22 16:54 | 显示全部楼层
放大循环里面也不行,for循环也不行,是不是看门狗的原因
回复

使用道具 举报

ID:883242 发表于 2023-3-22 17:58 | 显示全部楼层
main最后一行后面没有死循环,死机了,自动复位,又重新执行了main。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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