您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

基于单片机的软件UART的设计思想

2022/10/29 16:26:39发布53次查看
目前扩展串口的方法主要有以下方法,①、采用串口扩展芯片实现,如st16c550、st16c554、sp2538、max3110等,虽然成本较高,但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采用分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低,但只适用于数据量不大的场合,并且只能由这个单片机主动和多个设备通信,实时性差;③、用软件模拟的方法扩展串口,其优势也是成本低、实时性好,但要占用一些cpu时间。
一般的软件模拟扩展串口方法,使用1个i/o端口、1个int外部中断和定时器,该方法扩展的串口有2个缺点,①、由于使用了int外部中断,故只能使用2个int外部中断扩展2个串口。②、文中的发送和接收数据的效率比较低,占用了cpu的大量时间,不能与其他任务同时进行,所以使用范围有限。
本文提出的模拟串口方法,仅使用2个普通i/o和1个定时器,由于不需要int的限制,可以扩展出多个串口,且带fifo的功能,该方法扩展模拟串口的收发数据在中断服务中完成,所以非常效率高,一般的单片机都支持定时器中断,所以所以该方法在大多数单片机上都可以应用。
对于低速度的单片机(如89s51)可以扩展出低速串口(9600、4800等),对于高速单片机(如avr、pic、c8051、stc12)可以扩展高速串口(如19200、28800、38400、57600等)。目前单片机的处理速度越来越高,而价格越来越便宜,本文使用的stc12c1052芯片就具有高速度和低价格,价格仅为每片人民币3.8元。电子产品的开发设计时,要求在保证性能的情况下降低硬件成本,软件模拟扩展串口提供了一种降低成本的好方法。
1、串口通讯原理
在串口的异步通信中,数据以字节为单位的字节帧进行传送,发送端和接收端必须按照相同的字节帧格式和波特率进行通信,其中字节帧格式规定了起始位、数据位、寄偶效验位、停止位。起始位是字节帧的开始,使数据线处于逻辑0状态,用于向接收端表明开始发送数据帧,起到使发送和接收设备实现同步。停止位是字节帧的终止,使数据线处于逻辑1状态,用于向接收端表明数据帧发送完毕。波特率采用标准速度,如4800、9600、19200、28800、38400、57600等。
2、软件uart的设计思想
在本设计对硬件要求方面,仅仅占用单片机的任意2个i/o端口和1个定时器,利用定时器的定时中断功能实现精确的波特率定时,发送和接收都在定时中断的控制之下进行。
数据发送的思想是,当启动字节发送时,通过txd先发起始位,然后发数据位和奇偶数效验位,最后再发停止位,发送过程由发送状态机控制,每次中断只发送1个位,经过若干个定时中断完成1个字节帧的发送。
数据接收的思想是,当不在字节帧接收过程时,每次定时中断以3倍的波特率监视rxd的状态,当其连续3次采样电平依次为1、0、0时,就认为检测到了起始位,则开始启动一次字节帧接收,字节帧接收过程由接收状态机控制,每次中断只接收1个位,经过若干个定时中断完成1个字节帧的接收。
为了提高串口的性能,在发送和接收上都实现了fifo功能,提高通信的实时性。fifo的长度可以进行自由定义,适应用户的不同需要。
波特率的计算按照计算公式进行,在设置最高波特率时一定要考虑模拟串口程序代码的执行时间,该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快,则可以实现更高的串口通讯速度。
3、软件uart设计的实现
本程序在宏晶科技(深圳)生产的stc12c1052高速单片机上进行运行测试,stc12c1052单片机是单时钟/机器周期的mcs51内核单片机,与89c2051引脚完全兼容,其工作频率达35mhz,相当与420mhz的89c2051单片机,每片人民币3.8元。由于该单片机的高速度,使得软件扩展串口的方法,更方便实现高速的串口。
本扩展串口的设计中,stc12c1052使用的晶振频率为22.1184mhz,以波特率的3倍计算定时时间,在接收过程中以此定时进行接收起始位的采样,在发送和接收过程中再3分频得到标准波特率定时,进行数据发送与接收。
3.1、数据定义
定义模拟串口程序所必须的一些资源,如i/o引脚、波特率、数据缓冲区等。
#definefosc22118400//晶振频率
#definebaud38400//波特率
#definebaudt(fosc/baud/3/12)
#definebuflong16//fifo长度
sbitrxd1=p1^7;//模拟接收rxd
sbittxd1=p1^6;//模拟发送txd
bitbrxd1,srxd1;//rxd检测电平
byterbuf1[buflong];//fifo接收区
byterptr1,rnum1;
bytetbuf1[buflong];//fifo发送区
bytetptr1,tnum1;
bytetimcnt1a,timcnt1b;
bytemtbuf1,mrbuf1,txdcnt1,rxdcnt1;
3.2、数据接收子程序
数据接收过程中,依次存储rxd的逻辑位形成字节数据,当数据接收完毕且停止位为1时,表示接收到了有效数据,就将结果存储到接收fifo队列中去。
voidrecv()
{
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;
}
}
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product