原创 基于单片机通用引脚的软件UART设计

2009-8-13 19:36 2222 5 5 分类: MCU/ 嵌入式

摘要:通过对串口技术的研究,提出了一种用软件实现串口扩展的方法,该方法仅使用2个普通I/O引脚和1个定时器,实现了带FIFO的高速全双工串口。该方法可以节约系统开发的硬件开销。文中给出了设计程序,在STC12C1052单片机上进行测试,其通信速率达到38400bps。电子园51单片机学习网y?-j p1?4_3q:n
关键字:软件UART;单片机;STC12C2051电子园51单片机学习网 DCoVS0B`L
电子园51单片机学习网iG'Gf6Oa.C


6x4?`z0o V/J{U45985引言电子园51单片机学习网,Y/t `qm%n


随着单片机应用技术的不断深入,由单片机构成的多机系统取得了长足的发展,多个单片机之间以串口进行数据传输,构成复杂的主从式通讯网。在多机系统中的有一些单片机承担着复杂的通讯任务,当计算机的串口不能满足需要,就必须对串口进行扩展。如多参数医用监护仪、小区防盗报警系统、RS485总线控制系统等。

N-LL5AkCIl45985

目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个单片机主动和多个设备通信,实时性差;③、用软件模拟的方法扩展串口,其优势也是成本低、实时性好, 但要占用一些CPU时间。

8C xg2Qc9J o)T%Vy45985

一般的软件模拟扩展串口方法,使用1个I/O端口、1个INT外部中断和定时器,该方法扩展的串口有2个缺点,①、由于使用了INT外部中断,故只能使用2个INT外部中断扩展2个串口。②、文中的发送和接收数据的效率比较低,占用了CPU的大量时间,不能与其他任务同时进行,所以使用范围有限。电子园51单片机学习网 }2B9u6nZw T-_


本文提出的模拟串口方法,仅使用2个普通I/O和1个定时器,由于不需要INT的限制,可以扩展出多个串口,且带FIFO的功能,该方法扩展模拟串口的收发数据在中断服务中完成,所以非常效率高,一般的单片机都支持定时器中断,所以所以该方法在大多数单片机上都可以应用。

c(i,kHG'cy(i.F:r45985

对于低速度的单片机(如89S51)可以扩展出低速串口(9600、4800等),对于高速单片机(如AVR、PIC、C8051、STC12)可以扩展高速串口(如19200、28800、38400、57600等)。目前单片机的处理速度越来越高,而价格越来越便宜,本文使用的STC12C1052芯片就具有高速度和低价格,价格仅为每片人民币3.8元。电子产品的开发设计时,要求在保证性能的情况下降低硬件成本,软件模拟扩展串口提供了一种降低成本的好方法。电子园51单片机学习网9MO \m*O(w0w


1、串口通讯原理电子园51单片机学习网w[2S'vil}%g


在串口的异步通信中,数据以字节为单位的字节帧进行传送,发送端和接收端必须按照相同的字节帧格式和波特率进行通信,其中字节帧格式规定了起始位、数据位、寄偶效验位、停止位。起始位是字节帧的开始,使数据线处于逻辑0状态,用于向接收端表明开始发送数据帧,起到使发送和接收设备实现同步。停止位是字节帧的终止,使数据线处于逻辑1状态,用于向接收端表明数据帧发送完毕。波特率采用标准速度,如4800、9600、19200、28800、38400、57600等。电子园51单片机学习网A-j,hRI1Q


2、软件UART的设计思想电子园51单片机学习网 Ndt#y&~


在本设计对硬件要求方面,仅仅占用单片机的任意2个I/O端口和1个定时器,利用定时器的定时中断功能实现精确的波特率定时,发送和接收都在定时中断的控制之下进行。电子园51单片机学习网 PU4c"F;I+RjY


数据发送的思想是,当启动字节发送时,通过TxD先发起始位,然后发数据位和奇偶数效验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。电子园51单片机学习网 _vThYv


数据接收的思想是,当不在字节帧接收过程时,每次定时中断以3倍的波特率监视RxD的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。

Gm] ^AB#h45985

为了提高串口的性能,在发送和接收上都实现了FIFO功能,提高通信的实时性。FIFO的长度可以进行自由定义,适应用户的不同需要。电子园51单片机学习网8Iio-se


波特率的计算按照计算公式进行,在设置最高波特率时一定要考虑模拟串口程序代码的执行时间,该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快,则可以实现更高的串口通讯速度。

&b%r;Qv|Fl,dq8d1Eh45985

3、软件UART设计的实现电子园51单片机学习网C1E|-h"G


本程序在宏晶科技(深圳)生产的STC12C1052高速单片机上进行运行测试,STC12C1052单片机是单时钟/机器周期的MCS51内核单片机,与89C2051引脚完全兼容,其工作频率达35MHz,相当与420MHz的89C2051单片机,每片人民币3.8元。由于该单片机的高速度,使得软件扩展串口的方法,更方便实现高速的串口。电子园51单片机学习网B`4~ y,v/hw


本扩展串口的设计中,STC12C1052使用的晶振频率为22.1184Mhz,以波特率的3倍计算定时时间,在接收过程中以此定时进行接收起始位的采样,在发送和接收过程中再3分频得到标准波特率定时,进行数据发送与接收。电子园51单片机学习网 \]1|3W2K#G W


3.1、数据定义电子园51单片机学习网4ZRV/Lhj3gy.A


定义模拟串口程序所必须的一些资源,如I/O引脚、波特率、数据缓冲区等。电子园51单片机学习网 y$j{#\8b*E?


#define Fosc 22118400 //晶振频率电子园51单片机学习网)c;?"pcX:kA R


#define Baud 38400    //波特率

_1BX-V1K'r6XaW45985

#define BaudT (Fosc/Baud/3/12)电子园51单片机学习网j0qGA N1r


#define BufLong 16    //FIFO长度

_8nr J7?P D45985

sbit RxD1=P1^7;  //模拟接收RxD电子园51单片机学习网x a RGV5Q-Z6O y


sbit TxD1=P1^6;  //模拟发送TxD电子园51单片机学习网:^*B9wc Gb.B


bit  Brxd1,Srxd1;//RxD检测电平

I!@#H.S4T4bs:o45985

BYTE Rbuf1[BufLong];//FIFO接收区电子园51单片机学习网9`UE.w$a5q


BYTE Rptr1,Rnum1;电子园51单片机学习网&w6tU6X@O


BYTE Tbuf1[BufLong];//FIFO发送区电子园51单片机学习网%L*H x_W


BYTE Tptr1,Tnum1;电子园51单片机学习网-N.YRe ^{+v(Cp


BYTE TimCnt1A,TimCnt1B;

dG!Z,A,mV45985

BYTE Mtbuf1,Mrbuf1,TxdCnt1,RxdCnt1;电子园51单片机学习网*j I;it_


3.2、数据接收子程序

H{Fn"Ak m};P f2^45985

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

"sd4^;MC(Y dF45985

void Recv()

0S!b _9K7U_0u9Az:r45985

{电子园51单片机学习网N rI~e?*`K s4q?


  if(RxdCnt1>0)      //存数据位8个电子园51单片机学习网4vN*_)fmB


  {电子园51单片机学习网5]0d[+t0B{#aC6k


    Mrbuf1>>=1;电子园51单片机学习网Z!E.h r)K%g


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

zrV"x$|7U$v45985

  }电子园51单片机学习网w y1G"~ P%gnwh


  RxdCnt1--;电子园51单片机学习网&V(p ^ h+]!g"N O


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

zi'Ml0H E&@2W45985

  {电子园51单片机学习网Qo)I N`q


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

-mawU`#P-v45985

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

,vl$Npr+\8y45985

    if(++Rnum1>BufLong) Rnum1=BufLong;电子园51单片机学习网2~x8M2W0}


  }

xgc[%Zz5H45985

}电子园51单片机学习网 W/t}8V7Q(]


3.3、数据发送子程序

SJ8u$D-i P45985

该程序过程中,当数据发送状态结束时,检测发送FIFO队列是否为空,若非空则取出发送数据,然后启动发送状态;当处于发送状态时,则按照状态机的状态进行起始位、数据位和停止位的发送。电子园51单片机学习网GS0nH/CX ]Y


void Send()

E5^eCz.E:^%g45985

{

@!aX H&gow45985

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

'FTi ]L45985

 {电子园51单片机学习网#cb`4q0FF


  if(TxdCnt1==11) TxD1=0;//发起始位0电子园51单片机学习网;P;WS7FH8JZ


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

5y6r!_1F!G&]J45985

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

4|9c?`GK]45985

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

3ft(aMw-A%V45985

  TxdCnt1--;

"^2@&t'z!j `4S'w~45985

 }电子园51单片机学习网+R9nY+zPk/v


 else if(Tnum1>0)  //检测FIFO队列电子园51单片机学习网_,l| yH:\p)N


 {

:k4c?x*@+t TPd45985

   Tnum1--;电子园51单片机学习网V3ByH*cR}


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

4I?pDE i[z!{45985

   if(++Tptr1>=BufLong) Tptr1=0;电子园51单片机学习网8yE*m5K{9]1Q


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

F%iC`Q8^v45985

 }

*i@;UqTPV45985

}

FBj5RN45985

3.4、中断程序电子园51单片机学习网DM)jH/}$zhiEZe9S


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

W M L:nwyWJ45985

void Uart() interrupt 1 using 1电子园51单片机学习网I!rBYpF3}.q


{

f(a`/YTpFN0\w45985

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

,u8Ns!f2@YO t45985

  {

1d$w9Vpf;M45985

    if(RxD1==0 && Brxd1==0 && Srxd1==1) { RxdCnt1=8; TimCnt1B=0;}电子园51单片机学习网M"@2h_$Wjy b


  }

`tz0uzHR45985

  Srxd1=Brxd1; Brxd1=RxD1;电子园51单片机学习网 l X1ov"} d%V


  if(++TimCnt1B>=3 && RxdCnt1!=0) { TimCnt1B=0;  Recv();}//数据接收电子园51单片机学习网prM,L(~h1i HU


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

BWn.ffq;H45985

}电子园51单片机学习网yM SYa,mx


3.5、串口初始化

C5@*Q,D9o#PE[,c*Z45985

打开定时器的中断,将定时器的设置为自装载模式,依照波特率设置定时中断的定时间隔,启动定时器,并进行UART各变量的初始化。电子园51单片机学习网 a U2T(?f_/D{1QA


void IniUart()

j8I b)BZ t45985

{

xA4zCe{"U45985

  IE="0x82"; TMOD="0x22";电子园51单片机学习网#z#o5tv4p;v T0Q


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

)T#]~We| NPY0JPb*j45985

  Rptr1=0;Rnum1=0;Tptr1=0;Tnum1=0;电子园51单片机学习网:T_l#V&?+m


}

:l,{w:vqV%E Kv8lB:c45985

4、结束语

fogDkS ]w45985

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

-b;H6l;U @~45985

作者在实际应用中已利用该方法在STC12C1052单片机上实现了5个串口的扩展,用于医疗监护仪多个模块数据接收,效果令人满意。随着单片机处理速度的提高,该方法可以替代串口扩展芯片,大大降低系统的硬件成本,由于采样C语言开发,所以可以很方便地移植到AVR、PIC、C8051等高速单片机。

,b\3y/y_2y%L45985

 电子园51单片机学习网v@hVe*a


参考文献

7dO2ib;S1[$U^45985

[1] 陈曦等.基于51系列单片机的通用软件UART的实现[J].微计算机信息,2001,(5):79-80

PL@llp45985

[2] 景鑫.51单片机的串行口扩展方法[J]. 微计算机信息,2005,(13):63-64+155电子园51单片机学习网,a!^Dg P;\[6V;C


[3] 徐爱钧,彭秀华.单片机高级语言C51 Windows环境编程与应用[J].北京,电子工业出版社,2001

3_Q}kZ&jS/p45985

[4] STC12C2052AD系列单片机中文指南.http//www.mcu-memory.com,2005

M3`3Ome c45985
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条