单片机发送一个数据,串口调试助手接收到两个,这是为什么呢?看代码

#include<reg52.h>voidinit_urat(void){TMOD=0x20;//定时器1为自动再装入8位计数器TH1=0xfd;TL1=0xfd;//波... #include <reg52.h>
void init_urat(void){ TMOD = 0x20;//定时器1为自动再装入8位计数器 TH1 = 0xfd; TL1 = 0xfd;//波特率:9600bps TR1 = 1; //启动定时器1:波特率发生器
SM0 = 0; SM1 = 1; //方式1 10位异步收发器(1位起始位+8位数据+1位停止位) 波特率可变 REN = 1;//允许接收 TI = 0; //发送标志位 RI = 0; //接收标志位 EA = 1; //总中断
ES = 1; //串口中断
}void main(void){ init_urat(); SBUF = 'i'; while(1);
}

发送一个i,串口调试助手显示接收到两个ii.
展开
 我来答
a451993547
推荐于2016-04-09 · TA获得超过1593个赞
知道小有建树答主
回答量:595
采纳率:100%
帮助的人:709万
展开全部
由于没写中断处理程序当发送完成后,触发串口中断进入0x0023地址处运行,就相当于复位了一次一样。所以会出现2次的情况。(第二次由于TI已经为1了所以不会触发中断)
解决方法
1、关闭串口中断
EA=0;
ES=0;
2、写一个串口中断处理函数
void UARTInterrupt(void) interrupt 4
{
if(RI)//RI标志位为1代表接收到数据
{
RI = 0 ;//清零接收标志位
//在这里添加中断处理函数

}
else
TI = 0;//如果RI不为1一般是发送完成中断 把TI(发送完成标志位)清零
}

发送完成后清零TI
SBUF = 'i';

while(!TI);//等待发送完成
TI = 0;//发送完成后清零TI

这样就可以实现多个字节发送不会造成冲突
追问
第一次发送完 TI不是已经是1了么?
宇宙跳跃
2013-11-10 · 超过23用户采纳过TA的回答
知道答主
回答量:89
采纳率:100%
帮助的人:41.1万
展开全部
因为开中断却没写中断程序,发送完进中断跳错回主函数再次发送,而产生的中断标志没清,所以两次
追问
谢谢。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天蓝色的天空一
2013-11-10 · 超过11用户采纳过TA的回答
知道答主
回答量:107
采纳率:0%
帮助的人:22.1万
展开全部
你把EA和ES都等于零试试,,,,,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式