芯片技术当前位置:您当前位置:邦凯科技 >> 技术理论 >> 芯片技术 >> 浏览文章

PIC单片机与PC机异步串行通信的设计分析

时间:2009-09-16 17:04:38点击:

  单片机与PC机通信的方式有串行通信、并行通信。其中,串行通信具有硬件电路简单、软件实现容易和运行可靠等优点,十分适合对实时性要求不太高的场合。由于部分PIC单片机不具备串行通信所需的硬件USART口,故系统设计者需要用软件实现PIC单片机与PC机之间的串行通信。笔者介绍利用PIC单片机的中断功能实现异步串行通信的方法。
  异步串行通信基本概念
  异步串行通信字符格式如图1所示。通信线路上传送的每个字符包括1个起始位、5~8个数据位、1个奇偶校验位(可无)和1~2个停止位。每个字符的传送都是以起始位作为开始标志,紧跟其后的是要传送的数据(低位先传送),然后是奇偶校验位,最后是停止位。相邻字符之间的时间间隔即空闲时间可为任意长。线路空闲时应表现为“1”,当检测到“0”时,表示一帧字符的开始。
  串行接口硬件电路
  选用的单片机型号为PIC16C711,不具备硬件USART,需要用一般I/O口来模拟串行口。如图2所示,RB0为接收脚,RB5为发送脚。RB0除作为一般I/O引脚外,还可以作为外部中断输入引脚,引起中断的方式分为上跳沿和下跳沿2种方式。在本文中,设置下跳沿引起中断。当起始位到来时,RB0上出现下跳沿,引起中断,如果不是干扰信号则开始接收数据。
  RS-485标准的特点是抗干扰能力强,传输速率高、传送距离远。它规定了双端(平衡式)电气接口特性。当单片机与具有RS-485接口的PC机通信时,需要进行信号形式的转换。从单片机发送到PC机的信号首先转换成平衡信号,再送往PC机。从PC机发送到单片机的信号先转换成非平衡信号,再输入单片机。信号形式的转换工作由RS-485接口芯片SN75176完成。SN75176差分总线收发器工作在半双工方式,当工作于发送方式时,发送使能引脚DE为高电平,接收使能引脚也为高电平。当工作于接收方式时,发送使能引脚DE为低电平,接收使能引脚也为低电平。这样,可以将DE与连接在一起,由RB6引脚输出控制信号, 控制SN75176的发送和接收使能。为了减少线路上信号的反射,需要匹配线路的特性阻抗。由于通信载体是双绞线,它的特性阻抗为120Ω左右,所以线路设计时,在RS-485网络传输线的始端和末端各应接1只120Ω的匹配电阻,R1为单片机一侧的匹配电阻。由于RS485芯片的特性,接收器的灵敏度为±200mV,即差分输入端VA-VB≥±200mV时,输出逻辑“1”;VA-VB≤200mV时,输出逻辑“0”。当︱VA-VB︱≤200mV时,输出不确定。因此,当A、B无信号输入时,可能造成接收引脚R上出现低电平,这会误认为通信帧起始位到来而引起工作不正常。为了避免这种情况发生,可以人为的让A端电位高于B端电位,使R引脚在RS485总线不发送期间呈现唯一的高电平,单片机不会被误中断而接收到乱字符。通过在A、B接上拉、下拉电阻R3、R2可解决这个问题。

[page_break]


  单片机通信程序框图
  单片机与PC机之间的通信方式为半双工方式。一帧数据包括一位起始位、8位数据位、一位停止位和无奇偶校验位。设发送和接收数据的波特率为9600b/s,则每一位占用的时间td为1/9600s,约为104μs。单片机晶振频率为4MHz。单片机执行一条指令耗费时间1μs。
  单片机接收数据程序框图
  PIC16C711单片机的RB0引脚具备外部引脚跳变沿中断功能,向RB0引脚送一个上跳沿或下跳沿信号,则INTCON寄存器的外部引脚跳变沿中断标志位INTF被置1。如果总中断和外部引脚跳变沿中断都使能,并且此时单片机没有执行其他中断服务子程序,程序进入INT中断服务子程序。根据异步串行通信的特点,通信线路空闲时单片机接收的是高电平,起始位到来时单片机接收到低电平,因此空闲位和起始位之间是一个下跳沿。单片机接收到下跳沿即起始位后,马上进入中断服务子程序,准备接收一帧数据。因此在主程序中设置由下跳沿引起外部引脚跳变沿中断。以下内容主要分析接收子程序即中断服务子程序。单片机接收数据程序框图如图3所示。进入中断服务子程序后,首先保护中断现场,然后检测起始位是否是“真的”。由于可能存在的各种干扰,单片机有可能接收到的干扰信号正好是一个下跳沿,而实际上此时根本没有数据到来,从而造成误接收数据。因此检测起始位的真实性是有必要的。采取的方法是在52μs(起始位的中点)后,检测一次RB0上的信号。程序框图中是延时47μs后检测RB0上的信号,原因是保护中断现场的几条指令要耗费几个μs。如果是低电平,则起始位是“真的”,否则为干扰信号,单片机清INTF标志位,然后退出中断服务子程序,回到主程序。若起始位是“真的”,则准备接收数据。本文规定数据位为8位,故首先设置接收计数器R_CNT内容为8。然后将STATUS寄存器中的C位清零,并右移接收数据寄存器RCV_R。C的内容即0移入RCV_R最高位,接下来接收数据位。
  为尽量保证数据的准确性,应该在每位数据的中点检测该位数据。因此,检测第一位数据的时刻距离检测起始位的时刻应该是一位数据所占的时间即104μs,此后的每一位数据检测时刻之间也是如此。此时又要用到延时程序。因为每两次检测时刻之间除了延时之外,指令(C清零、右移等指令)还要占用时间,这些指令占用5~6μs,因此,为了尽量保证在每一位的中心位置检测数据,延时时间定为98μs。如果检测得到的数据位为1,则置RCV_R最高位为1。如果数据位为0,则不必改变最高位,因为C为0且已经移入RCV_R的最高位。然后,将接收计数器内容减1。8位数据接收完毕后,清INTF标志。最后,退出中断服务子程序。至此,8位数据接收全部存放于RCV_R中。

[page_break]


  单片机发送数据程序框图
  用RB5引脚作为发送引脚,单片机发送数据程序框图。当有数据要从单片机发往PC机时,单片机调用发送子程序。在发送子程序中,首先设置发送计数器内容为8,然后发送起始位,起始位应持续104μs。因此要调用延时子程序,延时子程序执行完后,RB5上的信号并未立刻变成第一位数据的值,这是因为还要执行几条指令,如右移TRS_R、置位等RB5上的信号才会变化。假设延时104μs,那么加上几条指令的执行时间,起始位就比104μs宽了。因此,延时子程序少于104μs,根据具体的程序定为97μs。然后,右移发送数据寄存器TRS_R,将其最低位即要发送的数据位移入C中,再根据C中的内容将RB5清零或置1,然后将发送计数器内容减1,并判断其是否为0。若为1,则说明未发送完毕,继续发送;否则,发送停止位。最后,退出发送子程序。
  PC机通信程序
  VB6.0提供了串行通讯MSComm(电话盒)控件来为应用程序提供串行通信,它将串口设备当作一个目标封装起来,容易操作,编程很方便,其良好的用户界面、简单方便的串行通信和实用性强的优点,无需借用其他语言就可以开发出优秀的通信软件,因而PC机软件采用VB6.0语言编写。
  MSComm控件的调出及其主要属性如下。
  (1)MSComm控件的调出
  VB6.0的MSComm控件并不会主动出现在工具箱中,当需要它时,让它出现在工具箱中的步骤如下:
  ①选择菜单上的“工程”;
  ②在“工程”菜单中选择“部件”;
  ③出现对话框后,在可勾选的项目中勾选Microsoft Comm Contro l6.0;
  ④按下“确定”按钮,即可在工具箱中见到“电话盒”的图标,就可以将此控件加载进行串行通信。
  (2)MSComm属性
  MSComm属性很多,其重要的属性说明如下:
  ①CommPort:设定或返回通信端口号。端口号由1开始往上递增,最大值是16。
  ②Settings:设定通信端口初始化参数。其格式为“Baud,P,D,S”,其中Baud为波特率,    可设为1200、2400、9600、14400、19200和28800等几种;P为校验位(E表示偶校验、O表示奇校验、M表示符号校验(即在校验位放置一个1的位)、S表示空白校验(即在校验位放置一个0的位)、N表示无校验位(默认值));D为数据位数,可选值为4、5、6、7、8(默认值);S表示停止位数,可选值为1、1.5、2。
  ③PortOpen:设定并返回通信端口的状态。
  使用串行端口之前必须先打开该端口(PortOpen=True),而在使用完毕后必须关闭该端口(PortOpen=False)。

[page_break]


  ④Input:从输入缓冲区返回并清除字符。这是一种FIFO(FirstinFirstOut)机制。如Buffer$=MSComm1.Input,表示将输入缓冲区的字符读入Buffer字符串变量中。
  ⑤Output:将一个字符或字符串写入传输缓冲区,如MSComm1.Output=“ABCD”。此即将ABCD4个字符通过串行端口传送出去。
  ⑥InBufferCount:传回在接收缓冲区中的字符数,是指已接收,并在接收缓冲区等待读取的字符数。
  ⑦InputMode:设定和返回类型。该属性设为0时,数据通过Input属性以文本方式取回,如设为1,则数据通过Input属性以二进制方式取回。
  利用PIC16C711的外部中断输入引脚RB0/INT接收数据,避免了查询法带来的耗费大量系统资源的缺点。PIC系列单片机执行指令的速度快,提高了系统效率。