串口发数据的一个问题,发数据用了break怎么还是跳不出来?

2019-03-24 19:51发布

/*******************************************************************************
*  标题: 串口通信             *
*  作者:麒麟刀
*  功能:发送两个数,发完结束。                                              
********************************************************************************/
#include<reg52.h>
unsigned int i=1000,j,a,n;
void main()
{  TMOD=0x20;//设置定时器1为工作方式2
 TH1=0xf4;     //设置波特率为2400
 TL1=0xf4;
 TR1=1;//启动定时器1  SM0=0;//串口工作方式为方式1
 SM1=1;
 while(1)   
  {
         while(i--);     //延时
         SBUF=0x55;
         while(!TI);
               TI=0;     //清除发送中断标志
         for(j=1000;j>0;j--);  //延时
         SBUF=0x56;
         while(!TI);
               TI=0;      //清除发送中断标志
         for(j=1000;j>0;j--);   //延时
         break;  //跳出循环语句,但是没起到作用,为什么??????? 
  }
}
出现的问题:我本意是让它发两个数,发完结束,就在最后用了一个break语句,但是实际上它是不停的在发我设定的两个数0x55和0x56,为什么用了break语句程序还没跳出循环呢?
[ 本帖最后由 麒麟刀 于 2011-5-20 23:52 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
辛昕
1楼-- · 2019-03-26 19:51
哥们,我来给你说说吧
是这样的。
单片机的程序空间是有限的。比如51,最大去到64K。
单片机跑程序的时候,它实质上是在程序空间里一条一条地跑。
这里简单解释一下,程序空间是按照1B1B,8个位地分条,就像很多很多的盒子,里面装了一个一个的数值,单片机跑程序就是CPU一个一个读这些数,然后根据一定的原则解释和执行。。这个你暂时别想太多。

你只要知道,这最大64K的程序空间,总有一刻会跑完,而且实质上是一瞬间的事情——以12M晶振为例,一个字节算你一跳指令时间吧,那就是1us,假设全速跑完,最多64Kus,这个,也就几十毫秒的时间,一秒钟就有十几个几十毫秒啊。

LS的各位老大说的在程序的最后加个while(1);。就是要让它执行完你写的程序,老老实实呆在原地,如果你不写这个,它就顺着往下跑,最多几十毫秒,跑完了,它不会老老实实自己停下来,于是它又从头开始执行了。

所以,,,嗯嗯,我已经够罗嗦了。
abclixu123
2楼-- · 2019-03-27 00:29

原帖由 麒麟刀 于 2011-5-23 00:20 发表 谢谢,是的,你说的方法我运行过,是对的,只发一次。单片机里的程序是不是本身就是死循环?我不加循环直接发那两个数它也是不停的循环发那两个数据?

 

这个理解有问题,确切说,死循环是为了防止单片机执行到错误的地方。也就是PC指针指向错误的地方。那个地方因为没有你的代码,是个很危险的地方。你不知道那里会发生什么。

qinsong
3楼-- · 2019-03-27 03:41
for(j=1000;j>0;j--);   //延时
         break;  //跳出循环语句,但是没起到作用,为什么???????



晕死 这个 吗  你得好好地看看书了 ,明显 c语言不过关
cd88361417
4楼-- · 2019-03-27 07:26
在最后一个}之前加上一句  while(1);  应该就行了。
bendaye
5楼-- · 2019-03-27 09:16
 精彩回答 2  元偷偷看……
xslyk
6楼-- · 2019-03-27 14:48
运行完了再从头开始运行了呗,它跳不出三界外啊

一周热门 更多>