新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机程序的无限循环问题

单片机程序的无限循环问题

作者: 时间:2016-11-23 来源:网络 收藏
有如下单片机程序,功能是通过串行口向外发送字符0、1、2、3、4、5、6、7、8、9,波特率:9600,无校验位,8位数据位,1位停止位。

#include
void Send(char signal) //数据发送函数
{
SBUF=signal;
while(TI==0);
TI=0;
}

本文引用地址://m.amcfsurvey.com/article/201611/320208.htm

void main(void)//主函数
{

int i;
char a[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//字符表
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TR1=1;
for(i=0;i<10;i++)
{
Send(a[i]);//依次发送字符
}
}

通过阅读程序可知,在执行时,单片机会向外发送一遍0—9共十个字符,用Keil仿真的结果也是这样,但是将程序写入开发板实际运行时,就变成一遍遍地发送字符0—9,形成了死循环——很难解释为什么会这样。

为了纠正这种现象,不得不在程序末尾加上一句while(1),这样才正常起来。

改后程序如下:

#include
void Send(char signal) //数据发送函数
{
SBUF=signal;
while(TI==0);
TI=0;
}

void main(void)//主函数
{

int i;
char a[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//字符表
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0xfd;
TL1=0xfd;
TR1=1;
for(i=0;i<10;i++)
{
Send(a[i]);//依次发送字符
}
while(1);
}

起码通过这一现象可以知道,Keil的仿真并不一定能代表真实情况。



评论


技术专区

关闭