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

#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;
}

当然老是接收到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了,速度给分啊,用手机打了老半天
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-04-29
void ser() interrupt 4 //串口中断函数
{
if(RI)
{
RI=0;
a=SBUF; //收到的数据存入缓冲器,然后赋给a
flag=1;
}
}
另外看看你的波特率,应该有问题,9600的话初值应该是0xfd,初始化时也没有设置1T模式,缺省状态应该12T模式的。
第2个回答  2013-04-29
TMOD = 0x20; //设置定时器1为工作方式2
TH1 = 0xd9; //装初值,设定波特率为9600
TL1 = 0xd9;
……
d9,这是设定 9600 吗?
相似回答