當前位置:編程學習大全網 - 源碼下載 - 51 單片機模擬串口的問題 目前發送數據沒有問題,接收數據時只能接收前兩位,如發送010203 只能接收到01

51 單片機模擬串口的問題 目前發送數據沒有問題,接收數據時只能接收前兩位,如發送010203 只能接收到01

我前幾天也做模擬串口程序,也遇到了與妳類似的問題,不過現在解決了。

數據格式由壹個起始位,八個數據位,壹個或兩個結束位組成。在數據發送是結束位是不能省。

但在數據接收時,程序中就沒有必要等待結束位了,因為在等待結束位的過程中,把下壹個數據的起始中斷也等待過去了。

把函數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;

}

  • 上一篇:Linux有哪些優缺點
  • 下一篇:夢幻西遊手遊玲瓏石任務通關通關級獎勵壹覽
  • copyright 2024編程學習大全網