请高手看一下这个单片机串口发送程序有没有问题

#include<reg51.h>
#include <intrins.h>
unsigned char idata DataResult;
sbit IOCLK=P1^0;
sbit DATAOUT=P1^1;
sbit CS=P1^2;
void int0svr(void) interrupt 0 using 1
{unsigned char count,tmp,i;
EX0=0;
tmp=0;
CS=1;
IOCLK=0;
CS=0;
_nop_();
for(count=0;count<8;count++)
{IOCLK=1;
if(DATAOUT)
tmp++;
tmp=tmp<<1;
IOCLK=0;
}
CS=1;
DataResult=tmp;
for(i=0;i<3;i++)
_nop_();
EX0=1;
}
void main(void)
{TMOD=0x20;
TL1=0xe6;
TH1=0xe6;
PCON=0x00;
TR1=1;
SCON=0x50;
CS=1;
EA=1;
EX0=1;
do
{SBUF=DataResult;
while(TI==0);
TI=0;
}while(SBUF!=0);
while(1);
}

第一就是你波特率初值,我不知道你的单片机型号和晶振,所以不确定,但你初值应该是有问题的,也就是你这里TH1和TL1的值;
然后就是最主要的,你这里串口通信,是用了一个芯片,我不知道是什么芯片,但好象应该不会用外部中断来控制这芯片吧,因为没有硬件图,所以只是猜的,可能这里是对的。但通信的流程似乎应该这样,就是当单片机收到TI=1或者RI=1信号时,处理TI或者RI信号,然后去从SBUF中读或者写一个字节,而你的程序好象是先去直接读写SBUF,并没有判断,然后你后面的判断,也就是while(TI==0);后要执行TI=0;我不理解你什么意思,反正应该是这里的问题了!你再看看
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-09-25
楼主,你的这个程序的基本思想是不是希望把从某处送来的串行数据通过串口发送出去?

你的主程序可能会因为运行速度太快,来不及收到外部中断,就已经在运行主程序的最后那个死循环了。

你只要把你的主程序最后几条命令顺序重排一下,就能源源不断地把从DATAOUT收到的数据从串口发送出去了,如下所示:

while(1)
{
do
{ SBUF=DataResult;
while(TI==0);
TI=0;
}while(SBUF!=0);
}
第2个回答  2010-09-25
上网下别人的来看看吧,好像没见过有这样写的
相似回答