基于单片机的软件UART的
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
思想
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
基于单片机的软件UART的设计思想
目前扩展串口的方法主要有以下方法, ?、采用串口扩展芯片实现~如ST16C550、ST16C554、SP2538、MAX3110等~虽然成本较高, 但系统的可靠性得到了保证~适用于数据量较大、串口需求较多的系统,?、采用分时切换的方法将一个串口扩展与多个串口设备通信~分时复用的方法成本低, 但只适用于数据量不大的场合, 并且只能由这个单片机主动和多个设备通信~实时性差,?、用软件模拟的方法扩展串口~其优势也是成本低、实时性好, 但要占用一些CPU时间。
一般的软件模拟扩展串口方法~使用1个I/O端口、1个INT外部中断和定时器~该方法扩展的串口有2个缺点~?、由于使用了INT外部中断~故只能使用2个INT外部中断扩展2个串口。?、文中的发送和接收数据的效率比较低~占用了CPU的大量时间~不能与其他任务同时进行~所以使用范围有限。
本文提出的模拟串口方法~仅使用2个普通I/O和1个定时器~由于不需要INT的限制~可以扩展出多个串口~且带FIFO的功能~该方法扩展模拟串口的收发数据在中断服务中完成~所以非常效率高~一般的单片机都支持定时器中断~所以所以该方法在大多数单片机上都可以应用。
对于低速度的单片机(如89S51)可以扩展出低速串口
1
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
(9600、4800等)~对于高速单片机(如AVR、PIC、C8051、STC12)可以扩展高速串口(如19200、28800、38400、57600等)。目前单片机的处理速度越来越高~而价格越来越便宜~本文使用的STC12C1052芯片就具有高速度和低价格~价格仅为每片人民币3.8元。电子产品的开发设计时~
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
在保证性能的情况下降低硬件成本~软件模拟扩展串口提供了一种降低成本的好方法。
1、串口通讯原理
在串口的异步通信中~数据以字节为单位的字节帧进行传送~发送端和接收端必须按照相同的字节帧格式和波特率进行通信~其中字节帧格式规定了起始位、数据位、寄偶效验位、停止位。起始位是字节帧的开始~使数据线处于逻辑0状态~用于向接收端
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
明开始发送数据帧~起到使发送和接收设备实现同步。停止位是字节帧的终止~使数据线处于逻辑1状态~用于向接收端表明数据帧发送完毕。波特率采用
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
速度~如4800、9600、19200、28800、38400、57600等。
2、软件UART的设计思想
在本设计对硬件要求方面~仅仅占用单片机的任意2个I/O端口和1个定时器~利用定时器的定时中断功能实现精确的波特率定时~发送和接收都在定时中断的控制之下进行。
数据发送的思想是~当启动字节发送时~通过TxD先发起始位~然后发数据位和奇偶数效验位~最后再发停止位~
2
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
发送过程由发送状态机控制~每次中断只发送1个位~经过若干个定时中断完成1个字节帧的发送。
数据接收的思想是~当不在字节帧接收过程时~每次定时中断以3倍的波特率监视RxD的状态~当其连续3次采样电平依次为1、0、0时~就认为检测到了起始位~则开始启动一次字节帧接收~字节帧接收过程由接收状态机控制~每次中断只接收1个位~经过若干个定时中断完成1个字节帧的接收。
为了提高串口的性能~在发送和接收上都实现了FIFO功能~提高通信的实时性。FIFO的长度可以进行自由定义~适应用户的不同需要。
波特率的计算按照计算公式进行~在设置最高波特率时一定要考虑模拟串口程序代码的执行时间~该定时时间必须大于模拟串口的程序的规定时间。单片机的执行速度越快~则可以实现更高的串口通讯速度。
3、软件UART设计的实现
本程序在宏晶科技(深圳)生产的STC12C1052高速单片机上进行运行测试~STC12C1052单片机是单时钟/机器周期的MCS51内核单片机~与89C2051引脚完全兼容~其工作频率达35MHz~相当与420MHz的89C2051单片机~每片人民币3.8元。由于该单片机的高速度~使得软件扩展串口的方法~更方便实现高速的串口。
3
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
本扩展串口的设计中~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的逻辑位形成字节数据~
4
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
当数据接收完毕且停止位为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) //发数据位
5
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
{ 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();} //数据发送
6
双击此处修改或者 精品资源,临风文档h。ttp://www.docin.com/a feiz精品资源,临风文档h。ttp://www.docin.com/afeiz []删除页眉页脚信息
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队列~使串口发送和接收工作效率高。
7