单片机设计:软件UART的设计思想

发布者:石头12345最新更新时间:2017-09-14 来源: ofweek关键字:单片机  软件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;

  }

  }

  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的设计思想

上一篇:单片机内部复位电路图解析
下一篇:NOR Flash与8位单片机接口设计

推荐阅读最新更新时间:2024-03-16 15:36

Microchip PIC16F18x MCU在贸泽开售为传感器节点应用提供支持
Microchip PIC16F18x MCU在贸泽开售为传感器节点应用提供支持 2022年9月1日 – 专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics, Inc.) 即日起开售Microchip Technology的PIC16F18015/25/44/45和PIC16F18126/46 系列MCU。 这两个系列专门为需要8位MCU来配合传感器设计的开发人员而设计,拥有丰富的功能,为传感器信号调理和实时控制提供了低成本解决方案。 对于成本敏感型传感器和控制应用,PIC16F18015/25/44/45 MCU提供了7KB到14KB的闪存、稳定的控制和外设功能,以及高
[传感器]
Microchip PIC16F18x <font color='red'>MCU</font>在贸泽开售为传感器节点应用提供支持
基于MSP430单片机的智能小车寻迹模块研究
简介:设计方案以MSP430单片机为系统的控制核心,采用反射式光电传感器模块寻迹,实现智能小车的自动寻迹行驶。在实验中采用与白色相差很大的黑色引导线作为智能小车的既定路线,系统驱动采用控制方式为PWM的直流电机。详细介绍了反射式光电传感器寻迹模块的工作原理,寻迹模块的电路图以及在以MSP430单片机为控制核心的基础上如何实现智能寻迹小车的自动寻迹行驶。 0 引言 智能小车又称轮式移动机器人,能够按预设模式在特定环境中自动移动,无需人工干预,可用于科学勘测、现代物流等方面。针对路面采用黑色标记线条作为路径引导线的应用场合,反射式光电传感器是常用的路径识别传感器。反射式光电传感器因信号处理方式和物理结构简单的特点而被广泛应用于结构
[单片机]
基于MSP430<font color='red'>单片机</font>的智能小车寻迹模块研究
基于HD7279和51单片机的计算器
HD7279是一款用于扩展单片机I/O口的芯片,至少我是这么认为的,虽然它占用了单片机4个I/O但是真正作为传输的仅仅是一根总线,它可以同时驱动8位共阴数码管(或者8×8点阵),及8×8的矩阵键盘,而同时接在单片机上的话,至少需要3~4组I/O,当然单总线控制的芯片基本需要自己的指令和时序。 接到这个课程设计之前我自己懒懒散散地看了一段时间的C51(用C语言编写单片机代码),之前老师教的是A51(用汇编编写单片机代码),我玩了很久,但是发现A51真的很局限,汇编这种语言是写给机器看的,真正地写0和写1,真正是一个寄存器一个寄存器的调用,对于8位的51单片机来说,要实现1000×1000或者小数是比较困难的。老师推荐用C,之前只是看
[单片机]
基于HD7279和51<font color='red'>单片机</font>的计算器
STM32F0单片机快速入门六 用库操作串口(UART)原来如此简单
1.从 GPIO 到 UART 前面几节我们讲了MCU如何启动,如何用翻转IO引脚,以及用按键去触发中断。接下来我们介绍的也是最常用的一个模块,串口(UART)。 串口可以说是最古老,而且生命力最强的一种通信接口了。RS485总线更是久经考验。虽然串口早已经从大多数PC的标配中去掉了,但是嵌入式系统跟上位PC机通信用的最多的应该还是通过串口转USB吧。 我们用 Keil 打开下面这个工程: STM32Cube_FW_F0_V1.11.0ProjectsSTM32F030R8-NucleoExamplesUARTUART_TwoBoards_ComPollingMDK-ARMProject.uvprojx 这个代码配置串口为 96
[单片机]
单片机中74HC138三八译码器的应用
在我们设计单片机电路的时候,单片机的 IO 口数量是有限的,有时并满足不了我们的设计需求,比如我们的 STC89C52 一共有 32 个 IO 口,但是我们为了控制更多的器件,就要使用一些外围的数字芯片,这种数字芯片由简单的输入逻辑来控制输出逻辑,比如 74HC138这个三八译码器,图 3-15 是 74HC138 在我们原理图上的一个应用。 图 3-15 74HC138 应用原理图 从这个名字来分析,三八译码器,就是把 3 种输入状态翻译成 8 种输出状态。从图 3-15所能看出来的,74HC138 有 1~6 一共是 6 个输入引脚,但是其中 4、5、6 这三个引脚是使能引脚。使能引脚和我们前边讲 74HC245 的 O
[单片机]
<font color='red'>单片机</font>中74HC138三八译码器的应用
面向超低功耗设计微控制器功效优化方案
不论是消费、工业还是医疗应用,功耗优化一般都是通过缩短有效处理时间以及延长处理器睡眠模式时间来实现的。不过,随着超低功率应用的出现,这种方法已然无法满足要求。单 电池 工作、接近电池阈值的充放电,电机和/或高亮 LED 的控制需求,以及减小器件外形尺寸并降低成本,种种趋势已经改变了开发人员的功耗优化方式。   对于电动牙刷、PMP、遥控器、无线 传感器 以及其它便携和手持式设备来说,必须将功率管理贯穿于系统的各个层面。通过高效单电池电压转换优化功耗、利用多种电流模式、引入智能电池管理、在应用级采用节能技术,便可以在整个系统范围实现功耗调节。    高效的电压转换   许多超低功率应用都在向单电池架构方向发展,以降低器件成本,减小
[嵌入式]
面向超低功耗<font color='red'>设计</font>的<font color='red'>微控制器</font>功效优化方案
STM32GPIO口8种模式细致分析(类比51单片机
关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1、浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态。 用处:感觉在信号处理方面用的比较好,比如在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的。 类比:51单片机找不到类似的输入模式 2、上拉输入 上拉输入和浮空输入的区别是,上拉电阻的开关关闭了,如上图所示。IO没有输入的时候,IO电平等于VDD即1电平,当然IO输入低电平的事就是VDD和IO口形成一个闭环电路,根据分压
[单片机]
MCU 面临 800V 电动汽车牵引逆变器的 3 种挑战
电动汽车 (EV) 牵引逆变器是电动汽车的核心。它将高压电池的直流电转换为多相(通常是三相)交流电来驱动牵引电机并控制制动能量的再生。电动汽车电子设备正在从 400V 架构转向 800V 架构,这正在逐步现实、普及,更高的电压会带来至少三个好处: - 快速充电 - 在相同电流下提供双倍的电量。 - 通过使用碳化硅 (SiC) 提高效率和功率密度。 - 通过使用更细的电缆来减轻重量,从而减少 800V 相同额定功率所需的电流。 在牵引逆变器中,微控制器(MCU)是系统的大脑,通过模数转换器(ADC)执行电机控制、电压和电流采样,使用磁芯计算磁场定向控制(FOC)算法,使用脉宽调制 (PWM) 信号驱动功率场效应晶体管
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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