单片机与电脑串口通信,无论发什么信息都收到00,求问是怎么回事?代码见下面。

#include<reg52.h>unsignedcharflag,a;//flag为标志位voidmain(void){/*串口初始化*/TMOD=0x20;//设置定... #include<reg52.h>
unsigned char flag,a; // flag为标志位
void main(void)
{/*串口初始化*/
TMOD=0x20; //设置定时器1为工作方式2
TH1=0xd9; //装初值,设定波特率为9600
TL1=0xd9;
TR1=1; //启动T1定时器
REN=1; //允许串口接收数据,REN、SM0、SM1这三句亦可以只写一个SCON=0x50
SM0=0; //串口工作方式设置为方式1
SM1=1;
PCON =0X00;
EA=1; //开总中断
ES=1; //开串口中断

while(1)
{
if ( flag == 1 ) //当标志位为1时,进行下列的操作
{
ES=0; //关串口中断,以保证一个数据一个数据的传输
flag=0; //标志位清零
SBUF=a; //如果收到计算机发送的数据,则将该数据再发回给计算机
while(!TI); //这句很重要,等待发送数据的完成

TI=0; // 串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。
ES=1; //开串口中断,用来接收下一个数据
}
}
}

void ser() interrupt 4 //串口中断函数
{
RI=0; //接收中断标志位,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。则必须在中断服务程序中,用软件将其清0,取消此中断申请。
a=SBUF; //收到的数据存入缓冲器,然后赋给a
flag=1;
}
展开
 我来答
huangzhicaicai
推荐于2018-05-17 · TA获得超过687个赞
知道小有建树答主
回答量:1230
采纳率:0%
帮助的人:423万
展开全部
当然老是接收到00了,我给你解释一下:你的串口中断函数不止是在接收数据的时候执行,在执行while(!Ti);时等待发送完成时也会触发中断函数,此时sbuf里面为空,数据之前被取走了。解决办法:把串口中断函数改为:void ser()interrupt 4
{if(Ri)
{Ri=0;
a=sbuf;

if (Ti)

}}
当然老是接收到00了,我给你解释一下:你的串口中断函数不止是在接收数据的时候执行,在执行while(!Ti);时等待发送完成时也会触发中断函数,此时sbuf里面为空,数据之前被取走了。解决办法:把串口中断函数改为:void ser()interrupt 4{if(Ri){Ri=0;a=sbuf;
flag=1;
}if (Ti){}}
再说一句,sbuf里面的数之前被取走的话就为0了,速度给分啊,用手机打了老半天
zhxiufan
2013-04-29 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38381
国家科技进步奖

向TA提问 私信TA
展开全部
void ser() interrupt 4 //串口中断函数
{
if(RI)
{
RI=0;
a=SBUF; //收到的数据存入缓冲器,然后赋给a
flag=1;
}
}
另外看看你的波特率,应该有问题,9600的话初值应该是0xfd,初始化时也没有设置1T模式,缺省状态应该12T模式的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
做而论道
高能答主

2013-04-29 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.1亿
展开全部
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xd9; //装初值,设定波特率为9600
TL1 = 0xd9;
……
d9,这是设定 9600 吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式