单片机软件UART的设计思想

发布者:Ziyu2022最新更新时间:2012-03-03 来源: 21ic 关键字:单片机软件  UART  设计思想 手机看文章 扫描二维码
随时随地手机看文章

目前扩展串口的方法主要有以下方法, ①、采用串口扩展芯片实现,如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引脚、波特率、数据缓冲区等。

#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;

}

}
[page]

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队列,使串口发送和接收工作效率高。

关键字:单片机软件  UART  设计思想 引用地址:单片机软件UART的设计思想

上一篇:基于单片机的韦根信号的接收
下一篇:基于单片机的太阳能路灯市电互补逆变光伏

推荐阅读最新更新时间:2024-03-16 12:54

STM32 printf 方法重定向到串口UART
在嵌入式系统中调试代码是很麻烦的一件事, 如果能方便地输出调试信息(与调试者交互), 能使极大加快问题排查的过程. 串口在嵌入式领域是一个比较重要的通讯接口. 因为没有显示设备, 在单片机的程序里调用printf()打印内容是不可见的,但我们可以利用它的外设来实现printf(),比如串口, 串口基本上大多数单片机都有, 通常用串口来打印内容. 通过重写fputc()函数来实现. fputc()是printf()的底层函数, 通过它把要打印的数据发送到串口上去. 不使用 MicroLib的普通方式 禁用半主机模式, 禁用了半主机模式才能使用标准库函数printf()打印信息到串口 说明: 半主机模式是ARM单片机的一种调试机制
[单片机]
如何搭建机器视觉系统
  器视觉系统的构成   ---一般机器视觉系统主要包括信息探测、采集系统、图像处理、显示及智能决策等模块,涉及 计算机 图形学、数字图像处理、视频信息处理、模式识别、人工智能理论、智能信息处理、VLSI技术等技术,可广泛应用于工业产品自动检测、航天、航空、遥感、卫星侦察、天文观测、通讯、交通、电子、金融、医疗等图像采集、处理和决策的诸多领域。图1是机器视觉系统的结构图。    嵌入式 图像采集处理系统   ---NetSight II是功能完善的嵌入式图像采集处理系统,能快速、简便地构成生产线上的机器视觉系统,解决了由PC/图像采集卡或智能摄像机构成的机器视觉系统在实际生产环境中所遇到的各种问题,提高了产品生产质量。
[测试测量]
如何搭建机器视觉系统
PIC 单片机软件编程技巧
控制部分采用P IC l6F7X系列 单片机 ,运用汇编语言编程,运行速度较快,能够达到系统的要求。在这里使用的大多是数字信号的控制,电机的控制只有开和合两种状态。在动作的过程中需要两只手臂、身体、头部、脚部等的协调动作。整个控制系统比较复杂,因而在PIC程序编写和空间分配方面需要注意一些问题。 1、 动作标志位的使用 在整个控制中,组合的动作很多,当所有动作定位都通过光电开关控制时,在程序编写上就有一些问题。如要求左手上升到鼓掌位、右手上升到举手位(手初始位置在最下的放下位),光电开关0有效(即为0时是挡住),到达正确位置。用简单的理解可以写成下面的程序: list P=16c73 call lefthand
[单片机]
STM32-USART串口通信【USART和UART的区别】
USART简介 USART(Universal Synchronous/Asynchronous Receiver/Transmitter),即通用同步/异步串行接收/发送器。 所谓同步通信和异步通信的主要区别是前者有公共时钟,总线上的所有设备按统一的时序、统一的传输周期进行信息传输。后者没有公共时钟,没有固定的传输周期,采用应答方式通信。简单的说,“同步”就是发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。 “异步”就是发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。异步通信发送方式下,在每一个字符的开始和结束分别加上开始位和停止位,以便使接收端能够正确地将每一个字符接收来。 我们用
[单片机]
STM32-USART串口通信【USART和<font color='red'>UART</font>的区别】
S3C2410的UART控制(RS232)
一、UART简介 UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,工作于数据链路层。包含了RS-232、RS-422、RS-485串口通信和红外(IrDA) 等等。UART协议作为一种低速通信协议,广泛应用于通信领域等各种场合。UART基本可分为并口通信及串口通信两种。 异步串口通信协议作为UART的一种,工作原理是将传输数据的每个字符一位接一位地传输。图给出了其工作模式: 其中各位的意义如下: 起始位:先发出一个逻辑”0”的信号,表示传输字符的开始。 资料位:紧接着起始位之后。资料位的个数可以是4、5、6、7、8等,构成一个字符。通
[单片机]
S3C2410的<font color='red'>UART</font>控制(RS232)
实验八--uart
一。环境   系统:ubuntu12.04   开发板:jz2440   编译器:gcc 二。说明 有空补上 三。代码 head.S 1 @****************************************************************************** 2 @ File:head.S 3 @ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行 4 @****************************************************************************** 5
[单片机]
STM32 UART 重映射
在进行原理图设计的时候发现管脚的分配之间有冲突,需要对管脚进行重映射,在手册中了解到STM32 上有很多I/O口,也有很多的内置外设像:I2C,ADC,ISP,USART等 ,为了节省引出管脚,这些内置外设基本上是与I/O口共用管脚的,也就是I/O管脚的复用功能。但是STM32还有一特别之处就是:很多复用内置的外设的 I/O引脚可以通过重映射功能,从不同的I/O管脚引出,即复用功能的引脚是可通过程序改变的。 第一次这么干感觉心里没底,所以针对USART1在STM32F103RBT6的板子上实现了一把,以下是相关的测试代码: /***************************************************
[单片机]
MB89P475的UART/SIO结构与应用
摘要:MB89P475是富士通公司生产的八位单片机。该单片机具有丰富的软、硬件资源和良好的EMC性能,可广泛应用于家电控制等产品中。该器件内含两路UART/SIO接口,非常适用于计算机集中控制和管理的多级通信控制系统中。文中介绍了该单片机的特点和UART/SIO结构,给出了MB89P475在LSP300型中央空调的计算机集控系统中的设计应用方法。 关键词:MB89P475;单片机;中央空调;计算机集控系统 MB89P475是富士通公司生产的F2MC-8L MB89470单片机系列产品。该产品具有丰富的软、硬件资源和良好的EMC性能, 而且其程序空间(16k%26;#215;8bits PROM)和数据空间(512%26;
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved