微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机设计:软件UART的设计思想

单片机设计:软件UART的设计思想

时间:09-18 来源:互联网 点击:

O发送区

BYTE Tptr1,Tnum1;

BYTE TimCnt1A,TimCnt1B;

BYTE Mtbuf1,Mrbuf1,TxdCnt1,RxdCnt1;

3.2、数据接收子程序

数据接收过程中,依次存储RxD的逻辑位形成字节数据,当数据接收完毕且停止位为1时,表示接收到了有效数据,就将结果存储到接收FIFO队列中去。

void Recv()

{

if(RxdCnt1>0) //存数据位8个

{

Mrbuf1>>=1;

if(RxD1==1) Mrbuf1=Mrbuf1|0x80;

}

RxdCnt1--;

if(RxdCnt1==0&& RxD1==1) //数据接收完毕

{

Rbuf1[Rptr1]=Mrbuf1; //存储到FIFO队列

if(++Rptr1>BufLong-1) Rptr1=0;

if(++Rnum1>BufLong) Rnum1=BufLong;

}

}

3.3、数据发送子程序

该程序过程中,当数据发送状态结束时,检测发送FIFO队列是否为空,若非空则取出发送数据,然后启动发送状态;当处于发送状态时,则按照状态机的状态进行起始位、数据位和停止位的发送。

void Send()

{

if(TxdCnt1!=0) //字节发送状态机

{

if(TxdCnt1==11) TxD1=0;//发起始位0

else if(TxdCnt1>2) //发数据位

{ Mtbuf1>>=1; TxD1=CY;}

else TxD1=1; //发终止位1

TxdCnt1--;

}

else if(Tnum1>0) //检测FIFO队列

{

Tnum1--;

Mtbuf1=Tbuf1[Tptr1]; //读取FIFO数据

if(++Tptr1>=BufLong) Tptr1=0;

TxdCnt1=11; //启动发送状态机

}

}

3.4、中断程序

中断定时时间为波特率定时的1/3,即以3倍的波特率对RxD进行采样,实现起始位的判别,当起始位到达时启动接收过程状态机。将该定时进行3分频再调用数据的发送和接收过程,进行准确波特率下的串口通信。

void Uart() interrupt 1 using 1

{

if(RxdCnt1==0 ) //接收起始识别

{

if(RxD1==0 && Brxd1==0 && Srxd1==1) { RxdCnt1=8; TimCnt1B=0;}

}

Srxd1=Brxd1; Brxd1=RxD1;

if(++TimCnt1B>=3 && RxdCnt1!=0) { TimCnt1B=0; Recv();}//数据接收

if(++TimCnt1A>=3) { TimCnt1A=0; Send();} //数据发送

}

3.5、串口初始化

打开定时器的中断,将定时器的设置为自装载模式,依照波特率设置定时中断的定时间隔,启动定时器,并进行UART各变量的初始化。

void IniUart()

{

IE="0x82"; TMOD="0x22";

TH0=-BaudT; TL0=-BaudT; TR0=1;

Rptr1=0;Rnum1=0;Tptr1=0;Tnum1=0;

}

  4、结束语

本文提出的模拟串口设计方法,其独特之处在于:仅仅使用任意2个普通I/O引脚和1个定时中断实现了全双工串口,对硬件的占用较少,具有多可串口扩展能力;在串口接收的起始位判别时采用了连续3次采样的判别方法,该方法实现简单、准确率高;用定时中断实现了串口数据的发送和接收,并实现了FIFO队列,使串口发送和接收工作效率高。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top