用串口调试助手给单片机发送一串字符串,单片机接受完之后向串口助手回显,出现了个神奇的问题,求助

源程序:#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitD0=P1^0;ucharf... 源程序:#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D0=P1^0;
uchar flag;
uchar a[30];
uint y, u,c;

/*发送子程序*/
void fasong(uchar dat)
{
while(TI==0)
{
SBUF=dat;
}
TI=0;
}

/*延时子程序*/
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<250;j++);
}
}

/*主程序*/
void main()
{

SM0=0;//选择工作方式一
SM1=1;
TR1=1;
REN=1;
TMOD=0X20;//设置定时器1为工作方式2
TH1=0XFD;
TL1=0XFD;//设置波特率为9600
EA=1;//开CPU中断
ES=1;//开串行口中断

delay(1000);
D0=0;
while(1)
{
while(flag)
{
y=0;
while(a[y]!='\0')
{
fasong(a[y]);
a[y]='\0'; //清空字符,方便下次接收
y++;
}
y=0;
flag=0; }
}
}

void jsfs() interrupt 4
{
c=0;
u=1000;
ES=0;
while(u--) //一直接收 直到字符串接收完毕
{
while(RI)
{
a[c]=SBUF;
c++;
RI=0;
u=1000;
}
}
ES=1;
flag=1;
}
结果如图 为啥会出现字符重复显示的现象 求解
结果
展开
 我来答
百度网友d585d01
推荐于2017-12-15 · TA获得超过669个赞
知道小有建树答主
回答量:339
采纳率:0%
帮助的人:464万
展开全部
发送函数中,这样写,防止TI还未来得及置为1,就一直在发送,这样写可防止上述情况
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit D0=P1^0;
uchar flag;
uchar a[30];
uint y, u,c;

/*发送子程序*/
void fasong(uchar dat)
{

ES=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}

/*延时子程序*/
void delay(uint n)
{
uint i,j;
for(i=0;i<n;i++)
{
for(j=0;j<250;j++);
}
}

/*主程序*/
void main()
{

SM0=0;//选择工作方式一
SM1=1;
TR1=1;
REN=1;
TMOD=0X20;//设置定时器1为工作方式2
TH1=0XFD;
TL1=0XFD;//设置波特率为9600
EA=1;//开CPU中断
ES=1;//开串行口中断

delay(1000);
D0=0;
while(1)
{
while(flag)
{
y=0;
while(a[y]!='\0')
{
fasong(a[y]);
a[y]='\0'; //清空字符,方便下次接收
y++;
}
y=0;
flag=0; }
}
}

void jsfs() interrupt 4
{
c=0;
u=1000;
ES=0;
while(u--) //一直接收 直到字符串接收完毕
{
while(RI)
{
a[c]=SBUF;
c++;
RI=0;
u=1000;
}
}
ES=1;
flag=1;
}
追问
为什么会来不及置1呢  对于时序这块我不是很懂  另外 如果将ES关闭  还能发送出去吗 谢谢   刚才试过了 还是会重复发送
追答
发送的时候将中断关闭,发送完以后又打开了,发送数据和中断是否打开无关,发送完数据,TI被硬件置为1,但是这需要时间,单片机处理语句速度很快,你用了while循环,肯定会重复发送,TI为1时会触发中断,所以发送以前将中断关闭,防止触发中断。我试了一下,不会重复的。看图:
百度网友64db161
2012-06-03 · TA获得超过520个赞
知道小有建树答主
回答量:251
采纳率:0%
帮助的人:262万
展开全部
发送子程序修改如下:
/*发送子程序*/
void fasong(uchar dat)
{
SBUF=dat;
while(TI==0)
{
_nop_; }
TI=0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式