当前位置:首页 > 读后感 > 基于单片机的多串口实现方案 多串口单片机
 

基于单片机的多串口实现方案 多串口单片机

发布时间:2019-02-21 04:44:09 影响了:

  摘要:针对PC和CPU通常只有一个串行接口的问题,本文介绍了基于单片机的多串口实现方案,该方案能扩展出5个不同电平标准的通用串口,并且选用了一种应用到实践当中,试验证明,设计可靠,性能稳定,解决了单片机单个串口的局限性。
  关键词:单片机 串行接口 多串口 串口通信协议
  中图分类号:TP334.7 文献标识码:A 文章编号:1007-9416(2012)01-0082-03
  
  1、总述
  随着控制技术的发展,控制系统的数字化在生产过程中的应用越来越普遍。作为控制核心的CPU需要和多个检测及控制的相关设备进行通信。这就给控制系统带来一个问题,一般的CPU都是只有1个串口(单片机最多的有4个),如果外界串行口设备过多,设计上就会出现许多困难。笔者因此论述了几个多串口实现方案,并采用其中一种实现了5个全双工串口,并且可以兼容多种串行通信电平标准(RS232/RS485/RS422)。
  2、几种多串口扩展实现方式
  扩展串口的方法归纳起来主要分为两类:一是软件实现方式,二是硬件实现方式。
  2.1 软件实现方式
  软件实现方式一般有两种,一种是读写I/O,另外一种是读写端口。软件模拟法可根据串行通讯的传送格式,利用定时器和主机的I/O口来模拟串行通讯的时序,以达到扩展串口的目的。接收过程中需要检测起始位,这可以使用查询方式,或者,在端口具有中断功能的主机中也可以使用端口的中断进行处理。接收和发送过程中,对定时的处理既可以使用查询方式也可以使用定时器中断方式。如今软件模拟以其价格低廉,使用方便,已经成为一种潮流。但同时也存在着通讯波特率低(一般不能超过4800bps),可靠性差(尤其是对于实时性要求很高的情形下)等缺点,并且不是所有的单片机都支持串口软件扩展。
  2.2 硬件实现方式
  硬件扩展方法主要是通过增加一个器件来实现,具体实现方法有2种:其一是采用串口扩展芯片实现,就是一个主串口带多个从串口,如GM8125(每个串口波特率必须是一致的)、视普科技的SP3539(各个串口可以设置为不同的波特率)等;其二是分时复用将一个串口分时切换成多个串口使用,就是把并行数据转换成串行数据,器件有TI等的TL16C754等,该器件可与MCU的P0口和P2口及4个中断对接,经过扩展后,系统对外接口可增加4个,且均可设置为全功能的串行接口。
  3、基于硬件方式实现的多串口扩展
  3.1 SP3539的简介
  SP3539是采用低功耗CMOS工艺设计的通用异步串行口扩展芯片,它可轻松将主机原有的1个串行口扩展成5个完全独立且每个子串口波特率、奇偶效验方式、数据帧长度都可独立设置的全双工子串口(子串口波特率最高可达115.2Kbps,满足数据高速传输要求)。
  SP3539采用分时复用技术将一个全双工串口(上位机自带串口)扩展成5个完全独立的全双工串口(子串口),在上电默认模式下母串口的波特率是各子串口波特率的6倍,即:各子串口可在特定的时间段内独占母串口,因此即使所有子串口都有连续不断的数据输入也不会发生数据丢失。母串口和各子串口内部都分别有8字节的接收和发送FIFO缓存,即使5个子串口同时接收到数据和启动数据发送也不会丢失数据。
  3.2 基于SP3539串口扩展的硬件电路设计
  本文采用了经典的8051单片机(AT89S52)作为主控芯片。该芯片与SP3539相连时接口非常简单。SP3539共有六个串口,即一个母串口,五个子串口,它们都是全双工的串行通信口,允许同时接收和发送数据。母串口与单片机的串口相连,子串口与其他串口设备相连,这样就实现了只有一个串口的单片机可与五个串口设备相连。 SP2338有一套发送地址线,一套接收地址线,用以选择发送串口和接收串口。当单片机要向串口设备发送数据时:
  A单片机先发送地址信息(子串口地址)到SP3539的输入地址“ADRI2”、“ADRI1”、“ADRI0”(如图1),即选中待发送数据对应的子串口。
  B将待发送的数据由单片机通过母串口发送到SP3539。SP3539的母串口收到单片机串口送来的数据后就根据ADRI0、ADRI1和ADRI2的状态,把数据送往对应的子串口。
  C对应的子串口再把数据经过电平转换变成对应的电平标准发给对应的设备。
  当串口设备向单片机发送数据时,其数据流程为:
  A SP3539的将子串口收到的数据缓存到FIFO里面,并发送到母串口。
  B 单片机接收到数据后,必须尽快读取ADRO2、ADRO1、ADRO0三位输出地址的状态,并由此来判断接收到的数据来自哪个子串口。
  由于SP3539的母串口和各子串口内部都分别有8 字节的接收和发送FIFO缓存,因此扩展后的五个串口就可以完全独立地同时通信。SP3539各子串口都支持10位及11位数据帧格式, 允许上位机更改各子串口数据帧长度,初次上电后各子串口默认数据格式都为10位。
  SP3539母串口波特率为:
  K5 = 3600�Fosc_in
  各子串口波特率为:
  k = 600�Fosc_in/n
  式中“Fosc_in”为SP3539输入时钟(OSCI),单位为“MHz”,n为对应子串口设置的分频系数,默认状态为“1”。本文采用的输入时钟为16.0MHz,则上电默认状态下:母串口波特率:K5 = 3600�16.0 = 57600 Bps,K0~4 = 600�1�16.0/1 = 9600 Bps。
  如果想要子串口的波特率工作在其它频段,就必须根据上面的公式重新计算Fosc_in,同时也要改变SP3539和单片机的晶振。
  3.3 基于SP3539串口扩展的程序设计
  采用SP3539扩展串口程序简单,占用资源少,不占用单片机的外部中断和数据总线,5个子串口共享单片机串口中断实现数据收发。但在使用过程中一定要注意:SP3539的地址总线一定要区分读写,否则会发生错误,造成芯片异常发热;串口中断里面对各个子串口操作的代码一定要尽量优化,否则在大数据量收发时会造成子串口数据丢失。
  下面是SP3539的接口程序,采用C语言编写,程序分为串口中断,系统初始化和主程序三个部分。
  bit bdata bUartBusy;
  bit bdata bInstructFlag;
  uchar idata Uart0RBuf…………….//子串口接收buf
  uchar idata Uart0Coef…………..//子串口分频系数波特率控制寄存器
  uchar idata Uart0CoefBuf…………..//分频系数缓冲寄存器
  
  sbit AdrIn0 =P2^0; //可以设置为任意IO
  sbit AdrIn1 =P2^1;
  sbit AdrIn2 =P2^2;
  sbit AdrOut0=P2^3;
  sbit AdrOut1=P2^4;
  sbit AdrOut2=P2^5;
  
  serial () interrupt 4 { //串口中断函数
  if(RI){ //接收中断函数
  RI=0;
  switch(P2&0x07){ //解析接收到的数据来自于哪个子串口
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   case 0:{
  Uart0RBuf=SBUF; //缓存子串口0收到的数据
  break;
  }
  case 1: …..
  case 2: ……
  case 3: …….
  case 4: ……. //其它case语句除了地址和对应的缓冲区不一样,其它操作一样
  }
  else{ //发送中断函数
  TI=0;
  switch(UartPointer){ //判断向哪个子串口发送数据
  case 0:{ //向子串口0发送数据
  UartPointer++; //下一次发送中断准备向子串口1发送数据
  if((--Uart0CoefBuf)==0){ ,
  Uart0CoefBuf=Uart0Coef;
  if(Uart0TNum){//判断串口0发送缓存区是否有数据需要发送
  AdrOut0=0;
  AdrOut1=0;
  AdrOut2=0;
  SBUF=Uart0Tbuf[--Uart0TNum];//将串口0发送缓存中的一个字节
  break; //由子串口0发送到下位机
  }
  else goto T_NopInstruction; //子串口0没有数据发送发送空指令
  }
  else goto T_NopInstruction;
  }
  case 1: …….
  case 2: …….
  case 3: …….
  case 4: …….. //其它case语句除了地址和对应的缓冲区不一样,其它操作一样
  }
  }
  
  void InstructSet (uchar InstructWord){ //入口参数:操作SP3739的命令字
  while(bInstructFlag); //等待操作SP3739的其它命令结束
  InstructBuf=InstructWord; //加载命令字
  bInstructFlag=1; //置发送命令请求标志
  if(bUartBusy==0){
  TI=1; //判断中断服务程序中的发送部分是否处于激活状态,
  bUartBusy=1; //否则将主动激活上位机中断服务程序的数据发送程序
  }
  }
  
  void init_serialcom(void){
  SCON = 0x50; //串口工作在模式1
  T2CON |= 0x34; //定时器2工作在模式2,自动重装载
  RCAP2H = 0xFF; //波特率:57600 晶振为11.0592MHz
  RCAP2L = 0xFA;
  IE |= 0x90; //使能串口中断
  IP = 0x10; //只允许串口中断为最高优先级,其它为次优先级。
  
  Uart0Coef=0x01; //由于子串口0的波特率为9600bps,所以
  Uart0CoefBuf=0x01; //程序中不用定义和使用这两个变量
  
  InstructSet(0x1F); //设置子串口1的波特率为4800BPS
  Uart1Coef=0x02; //置子串口1的分频系数为"2"
  Uart1CoefBuf=0x01; //分频系数临时缓存,初始化为"1"
  
  …………… //依照datasheet设置对应的字串口参数
  }
  
  main()
  {
  init_serialcom(); //初始化MCU串口波特率和所有子串口波特率
  while(1);
  }
  4、结语
  本文成功运用硬件方式实现了串口扩展并应用到实际当中,该方案经过了长时间的工作考核验证,实践证明,稳定可靠,性能稳定,实现简单,大大降低系统的软件开销,由于采用C语言开发,所以可以很方便地移植到AVR、PIC、ARM等其它高速CPU。
  参考文献
  [1]SP3539 数据手册[Z].成都视普科技有限公司,2005.12.
  [2]李华.MCS-51系列单片机应用接口技术[M].北京:北京航空航天大学出版社,2002.
  [3]刘毓梅,彭琦,赵广宇.通用异步串口扩展芯片GM8125的原理和应用.21IC中国电子网.
  [4]景鑫.51单片机的串行口扩展方法[J].微计算机信息,2005,(13):63-64+155.
  作者简介
  甘宇红,女,南宁职业技术学院讲师,研究方向电子技术及自动控制。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3