}

}

}

else //检测起始位

{

if ( RXD_pin )

{

RXD_t = HITS/2;

}

else

{

RXD_t--;

if ( RXD_t == 0 ) //连续HITS/2次采样RXD_pin都是0,就可以确认起始位

{

//启动接收

RXD_t = HITS;

RXD_cnt = 8;

RXD_doing = 1;

}

}

}

//发送数据

if ( TXD_doing ) //正处于发送状态

{

TXD_t--;

if ( TXD_t == 0 )

{

if ( TXD_cnt == 0 ) //发送全部完毕

{

TXD_doing = 0; //清除正在发送的标志

}

else

{

if ( TXD_cnt == 1 ) //8个数据位发送完毕

{

TXD_pin = 1; //发送停止位

}

else //发送数据位

{

TXD_pin = TXD_ch_LSB;

TXD_ch 》》= 1;

//上面2条语句若用{CY=(TXD_ch&0x01); TXD_pin=CY; TXD_ch=ACC;}代替,效率更高

}

TXD_cnt--;

TXD_t = HITS;

}

}

}

else

{

if ( TXD_p2 != TXD_p1 ) //如果发送缓冲队列不空

{

//从发送缓冲队列中取出要发送的数据

TXD_ch = TXD_buf[TXD_p2++];

if ( TXD_p2 》= TXD_BUF_LEN ) TXD_p2 = 0;

//启动发送

TXD_doing = 1;

TXD_cnt = 9;

TXD_t = HITS;

//先发送起始位

TXD_pin = 0;

}

else

{

//发送缓冲队列是空的,不发送任何数据

}

}

}

//系统初始化

void SystemInit()

{

TXD_init();

RXD_init();

T2_init();

}

//主程序

void main()

{

unsigned char c;

SystemInit();

//

TXD_Send_String(“Hello!rn”);

TXD_Send_String(“The author is 21IC suda.rn”);

//以下是简单的测试:从接收引脚接收数据,再通过发送引脚转发出去

for (;;)

{

if ( RXD_p2 != RXD_p1 )

{

c = RXD_buf[RXD_p2++];

if ( RXD_p2 》= RXD_BUF_LEN ) RXD_p2 = 0;

TXD_Send_Char(c);

}

}

}

来源;21ic

关于接口,总线,驱动就介绍完了,您有什么想法可以联系小编。