數據格式由壹個起始位,八個數據位,壹個或兩個結束位組成。在數據發送是結束位是不能省。
但在數據接收時,程序中就沒有必要等待結束位了,因為在等待結束位的過程中,把下壹個數據的起始中斷也等待過去了。
把函數uchar RByte()中的最後壹個WaitTF0();刪除,程序就能連續接收數據了。
下面是我的程序,妳看壹下就明白了。
/*
模擬串口收發程序
改程序發送口采用任壹IO口,接收口采用外部中斷0口,實現了9600bit/s的串口通信
信號產生與接收采用定時器定時溢出標誌來進行控制
註意問題:
1、中斷的中斷標誌要保證狀態正確
2、定時器定時要精確
*/
#include<reg52.h>
sbit txd=P3^1;
sbit rxd=P3^2;
sbit en=P1^7;
sbit clk=P3^7;
#define uchar unsigned char
uchar number,flag;
uchar num[10]={0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
void wait(uchar i);
void send(uchar aa);
void main()
{
uchar i;
IE=0;EA=1;
TMOD=0x12;
TR0=0;EX0=1;
IT0=1;en=0;
while(1)
{
if(num[0]==0x49&&num[1]==0x85&&num[2]==0x54&&num[3]==0x31&&num[4]==0x59&&num[5]==0x87&&num[6]==0x91&&num[7]==0x25&&num[8]==0x34&&num[9]==0x62)
{
en=1;
number=0;
for(i=0;i<10;i++)
{send(num[i]);num[i]=0x00;}
en=0;
}
}
}
void send(uchar aa)
{
uchar i;
txd=0;
wait(0xb9);
for(i=0;i<8;i++)
{txd=aa&0x01;aa>>=1;wait(0xb9);}
txd=1;
wait(0xb9);
flag=0;
}
void int0() interrupt 0
{
uchar i;
EX0=0;clk=!clk;
wait(0xad);
for(i=0;i<7;i++)
{
number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xb9);
}
number>>=1;clk=!clk;
if(rxd)number=0x80|number;
else number=0x00|number;
wait(0xd9);
num[flag]=number;
flag++;clk=!clk;
IE0=0;EX0=1;
if(flag>=10)flag=0;
}
void wait(uchar i)
{
TF0=0;
TH0=i;TL0=i;
TR0=1;
while(TF0==0);
TF0=0;TR0=0;
}