新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > PIC单片机与PC机异步串行通信的设计

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

作者:时间:2012-04-18来源:网络收藏

引言

本文引用地址:http://www.eepw.com.cn/article/171593.htm

因为具有运行速度快、低功耗、价格低、体积小等优点,Microchip公司推出的系列已经得到越来越广泛的应用。应用之一是作为下位机与上位机(例如机),它被广泛应用在工业控制、数据采集和检测等领域中。的方式有、并行通信。其中,通信具有硬件电路简单、软件实现容易和运行可靠等优点,十分适合对实时性要求不太高的场合。由于部分不具备通信所需的硬件USART口,故系统者需要用软件实现单片机与机之间的串行通信。笔者介绍利用PIC单片机的中断功能实现串行通信的方法。

串行通信基本概念

串行通信字符格式如图1所示。通信线路上传送的每个字符包括1个起始位、5~8个数据位、1个奇偶校验位(可无)和1~2个停止位。每个字符的传送都是以起始位作为开始标志,紧跟其后的是要传送的数据(低位先传送),然后是奇偶校验位,最后是停止位。相邻字符之间的时间间隔即空闲时间可为任意长。线路空闲时应表现为“1”,当检测到“0”时,表示一帧字符的开始。

19.jpg
图1 异步串行通信字符格式

串行接口硬件电路

选用的单片机型号为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可解决这个问题。

20.jpg
图2 PIC16C711与PC机之间的接口电路

单片机通信程序框图

单片机与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中。

21.jpg
图3 单片机接收数据程序框图


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭