基于单片机的软件UART的设计思想
目前扩展串口串口
串口是计算机上一种非常通用的设备通信协议,大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备的通信协议,并可用于猎取远程采集设备的数据。 [全文]
的方法主要有以下方法, ①、采纳串口扩展芯片实现,如ST16C550、ST16C554、SP2538、MAX3110等,虽然成本较高, 但系统的可靠性得到了保证,适用于数据量较大、串口需求较多的系统;②、采纳分时切换的方法将一个串口扩展与多个串口设备通信,分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个单片机
单片机是单片微型计算机(Single-Chip Microcomputer)的简称,是一种将中心处理器微处理器随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)采纳超大规模集成电路技术集成到一块硅片上构成的微型计算机系统。 [全文]
主动和多个设备通信,实时性差;③、用软件模拟的方法扩展串口,其优势也是成本低、实时性好, 但要占用一些微处理器
微处理器也称为中心处理器,是电子计算机的主要设备之一。其功能主要是解释计算机指令以及处理计算机软件中的数据。所谓的计算机的可编程性主要是指对微处理器的编程。微处理器是计算机中的核心配件,只有火柴盒那么大,几十张纸那么厚,但它却是一台计算机的运算核心和操纵核心。计算机中所有操作都由微处理器负责读取指令,对指令译码并执行指令的核心部件。微处理器、内部存储器和输入/输出设备是电子计算机的三大核心部件。 [全文]
时间。 一般的软件模拟扩展串口方法,使用1个I/O端口、1个INT外部中断和定时器定时器
定时器是装有时段或时刻操纵机构的开关装置。它有一个频率稳定的振荡源,通过齿轮传动或集成电路分频计数,当将时间累加到预置数值时,或指示到预置的时刻处,定时器即发送信号操纵执行机构。 [全文]
,该方法扩展的串口有2个缺点,①、由于使用了INT外部中断,故只能使用2个INT外部中断扩展2个串口。②、文中的发送和接收数据的效率比较低,占用了微处理器的大量时间,不能与其他任务同时进行,所以使用范围有限。本文提出的模拟串口方法,仅使用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单片机51单片机
51单片机是单片机中的一种,单片机(single-chip microcomputer)是一块集成芯片,但不是一块实现某一个逻辑功能的芯片,而是在这块芯片当中,集成了一个计算机系统。如中心处理器(微处理器)、存储器(ROM,RAM)、I/O接口、定时器/计数器、中断系统等。中心处理器是单片机的核心单元,他由运算器和操纵器组成,他的主要功能是实现算术运算、逻辑运算、和操纵。 [全文]
,每片人民币3.8元。由于该单片机的高速度,使得软件扩展串口的方法,更方便实现高速的串口。 本扩展串口的设计中,STC12C1052使用的晶振晶振
晶振:即所谓石英晶体谐振器和石英晶体时钟振荡器的统称。不过由于在消费类电子产品中,谐振器用的更多,所以一般的概念中把晶振就等同于谐振器理解了。后者就是通常所指钟振。 [全文]
频率为22.1184Mhz,以波特率的3倍计算定时时间,在接收过程中以此定时进行接收起始位的采样,在发送和接收过程中再3分频得到标准波特率定时,进行数据发送与接收。3.1、数据定义
定义模拟串口程序所必须的一些资源,如I/O引脚、波特率、数据缓冲区等。
#define Fosc 22118400 //晶振频率
#define Baud 38400 //波特率
#define BaudT (Fosc/Baud/3/12)
#define BufLong 16 //FIFO长度
sbit RxD1=P1^7; //模拟接收RxD
sbit TxD1=P1^6; //模拟发送TxD
bit Brxd1,Srxd1;//RxD检测电平
BYTE Rbuf1[BufLong];//FIFO接收区
BYTE Rptr1,Rnum1;
BYTE Tbuf1[BufLong];//FIFO发送区
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队列,使串口发送和接收工作效率高。
来源:蝴蝶
该文章来至网络或用户,仅供学习交流之用,版权归原作者所有。
如有侵权,请及时与我们联系!
基于单片机的频率、电压监测系统设计
随着信息化、数字化在各行各业的迅猛进展,武器系统中的信息化、数字化也将成为未来的进展趋势。武器系统中,司乘人员在空间狭小的操作仓里,经常要面对功能众多、大小不等...
DSP在六自由度电磁跟踪系统中的应用
摘 要:针对目前电磁跟踪系统跟踪速度慢,计算参数精度低的现况,文中介绍了一种采纳DSP系统来完 成对感应天线接收到的模拟信号采集处理的方案。该方案实现了单通道128 kHz...
HOLTEK推出内建UART的A/D型微操纵器HT46RU26
HOLTEK半导体推出内建UART的A/D型微操纵器HT46RU26。HT46RU26的ROM为32k x 16、RAM为768 bytes、I/O最多为48埠,可供设计者应用于多输入及输出操纵的装置,如外部按键输入控...
HOLTEK推出内建UART的A/D型微操纵器HT46RU232
HOLTEK半导体推出内建UART的A/D型微操纵器HT46RU232。HT46RU232的ROM为4k*16、RAM为192 bytes、I/O最多为40埠,除此之外HT46RU232的A/D分辨率为12 bits且总共有8个通道可以...
盛群新款A/D型微操纵器HT46RU24内建UART
盛群半导体(HOLTEK)推出内建UART的A/D型微操纵器HT46RU24。HT46RU24的ROM为8k*16、RAM为384 bytes、I/O最多为40埠,除此之外HT46RU24的A/D分辨率为12 bits且总共有8个通道可...