有如下單片機(jī)程序,功能是通過串行口向外發(fā)送字符0、1、2、3、4、5、6、7、8、9,波特率:9600,無校驗(yàn)位,8位數(shù)據(jù)位,1位停止位。#include
void Send(char signal)//數(shù)據(jù)發(fā)送函數(shù)
{
SBUF=signal;
while(TI==0);
TI=0;
}
本文引用地址:http://www.ex-cimer.com/article/201611/320208.htmvoid main(void) //主函數(shù)
{
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]); //依次發(fā)送字符
}
}
通過閱讀程序可知,在執(zhí)行時(shí),單片機(jī)會(huì)向外發(fā)送一遍0—9共十個(gè)字符,用Keil仿真的結(jié)果也是這樣,但是將程序?qū)懭腴_發(fā)板實(shí)際運(yùn)行時(shí),就變成一遍遍地發(fā)送字符0—9,形成了死循環(huán)——很難解釋為什么會(huì)這樣。
為了糾正這種現(xiàn)象,不得不在程序末尾加上一句while(1),這樣才正常起來。
改后程序如下:
#include
void Send(char signal)//數(shù)據(jù)發(fā)送函數(shù)
{
SBUF=signal;
while(TI==0);
TI=0;
}
void main(void) //主函數(shù)
{
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]); //依次發(fā)送字符
}
while(1);
}
起碼通過這一現(xiàn)象可以知道,Keil的仿真并不一定能代表真實(shí)情況。
評(píng)論