永发信息网

51单片机间串口通讯,接收端程序调用完接收子程序,主程序不能继续运行

答案:4  悬赏:0  手机版
解决时间 2021-01-28 00:29
  • 提问者网友:相思似海深
  • 2021-01-27 05:28
接收部分程序如下:
#include
#define uchar unsigned char
#define uint unsigned int
#define TR 1
sbit led1=P1^0;
sbit led2=P1^1;
uchar idata buf[10];
uchar pf;
void init()
{
TMOD=0x20;
TH1=0xe8;
TL1=0xe8;
PCON=0x00;
TR1=1;
SCON=0x50;
}

void recieve(uchar idata *d)
{
uchar i;
do
{
while(RI==0);
RI=0;
}while((SBUF^0xaa)!=0);
SBUF=0xbb;
while(TI==0);
TI=0;

while(1)
{
pf=0;
for(i=0;i<16;i++)
{
while(RI==0);
RI=0;
d[i]=SBUF;
pf+=d[i];
}
while(RI==0);
RI=0;
if((SBUF^pf)==0)
{
SBUF=0x00;
break;
}
else
{
SBUF=0xff;
while(TI==0);
TI=0;
}
}
}
void main()
{
init();
recieve(buf);
led1=0;
}

主程序最后一句:led1=0无法执行就结束了
最佳答案
  • 五星知识达人网友:举杯邀酒敬孤独
  • 2021-01-27 07:04
void main()
{
init();
recieve(buf);
led1=0;
while(1);//这句必须有,不然程序就是不可控
}
全部回答
  • 1楼网友:雪起风沙痕
  • 2021-01-27 09:52
主程序要加入一个循环 在循环内是你要完成的工作 void main() {     init();     while(1)     {         你要完成的工作     } }
  • 2楼网友:你可爱的野爹
  • 2021-01-27 09:08
在recieve中的while(1)里一旦【校验和】校验正确就会break退出循环。 但是你这个代码在main中没有while(1),就算你第一次有数据接收,但是代码执行完之后,就从新来过,那么recieve中的while(1)就不满足退出的条件了,死循环。
  • 3楼网友:独行浪子会拥风
  • 2021-01-27 07:50
因为在你recieve()函数里有一个while(1)循环处理过程,其实你这程序在用KEIL编译的时候会有警告提示的,即:led1=0这句将永远不会被执行的
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯