摘 要: 介绍一种运用 PIC16F84单片机实现与PC机串行通信的方法,并给出其硬件接口电路及通信源程序。
1 前言
美国 Microchip 公司的 PIC16 系列单片机是一种新型的 CMOS 工艺的 8 位单片机。其中, PIC16FXX 单片机的程序存储器为电可擦除闪速存储器( flash ),可多次修改程序,甚至可以在线编程。 PIC16F83 和 PIC16F84 片内数据存储器除 RAM 外,还有 64 字节的 EEPROM ,可以当作一般的或非易失性的数据存储器使用,简单方便。它还具有片内上电复位、延时电路、看门狗电路等。另外, PIC16 系列单片机功耗极低,因而是一种非常适合在各种便携式设备中使用的高性价比的单片机,并已经得到了越来越广泛的应用。
但是在许多需要大量计算的运用中,还必须借助微机的强大数据处理能力。这样必须通过通信电路实现 PIC 单片机与微机间的可靠数据传输。有的 PIC16 单片机内并没有提供串行口,所以串行通信必须通过自己设计的硬件电路和通信软件来实现。
下面介绍用查询法实现异步串行通讯的方法。同时给出了用 PIC16F84 单片机的两个 I/O 口模拟 2 线串行口的硬件接口电路、程序流程框图、单片机内通信程序以及微机内的通信程序等。
2 硬件实现方法与电路
PIC16F84 的程序存储器由 1K × 14 的闪速( flash )存储器构成,它只有 13 条 I/O 口, 1 个定时器,为了尽量节省单片机的软硬件资源,采用下述异步串行通信的实现方法。
如图 1 所示, PIC16F84 在 4MHz 时钟下,采用半双工方式,可实现 9600 波特率的异步串行数据通信, 1 位停止位, 8 位数据位,无校验位。接收和发送以低位在先(一般模式),采用软件延时。为节省篇幅,单片机内的通信程序中未提供任何握手协议,用户可根据自己的需要在软件中加入握手方式。
由于 PIC16F84 本身没有专门的串行口,这里用其 I/O 口来模拟串行口的功能。
PC 机的串行接口是符合 EIA RS-232C 规范的外部总线标准接口。 RS-232C 采用的是负逻辑,即逻辑“ 1 ”:- 5V 至- 15V ;逻辑“ 0 ”: +5V 至 +15V 。而 CMOS 电平为:逻辑“ 1 ”: 4.99V ,逻辑“ 0 ”: 0.01V ; TTL 电平的逻辑“ 1 ”和“ 0 ”则分别为 2.4V 和 0.4V 。因此在用 RS-232C 总线进行串行通信时需外接电路实现电平转换。在发送端用驱动器将 TTL 或 CMOS 电平转换为 RS-232C 电平,在接收端用接收器将 RS — 232C 电平再转换为 TTL 或 CMOS 电平。
这里选用了 MAXIM 公司的 MAX202E 来作电平转换。 MAX202E 属于 MAXIM 公司的通用串行接收 / 发送驱动器芯片。其外围电路简单,只需外接四个 0.1 μ F 的电容即可,如图 1 所示。
图 1 接口原理图
图 2 接收子程序框图 图 3 发送子程序框图
3 PIC16F84 单片机内通信程序的设计
图 2 和图 3 分别是串行发送和接收的子程序流程框图。发送时,通过使数据发送端 DX 为低电平并保持 B 秒( 9600 波特率时为 104 μ s )来发送起始位。随后每 B 秒钟通过置位或清零 DX 端把数据发送出去。这里的 B 是指一位所持续的时间( B=1/ 波特率)。接收时,数据接收端 DR 大约要每 B/2 秒( 9600 波特率时为 52 μ s )查询一次以检测起始位,如果检测到起始位,则在大约 1.5B 秒( 9600 波特率时为 156 μ s )后检测第一位数据位,随后每 B 秒钟检测一次其它的数据位。 相应的源程序如下:
-
- ;接收子程序
- Rcvr
- clrwdt ;清片内看门狗
- ;定时器
- btfsc RA , DR ;检测起始位
- goto Rcvr ;未检测到起始位
- movlw 8 ;检测到起始位
- movwf R_CNT ; 8 位数据位
- Rnext
- call Delay ;延时 B/2 秒
- bcf STATUS,C ;清进位标志
- rrf RevReg ; LSB 在先
- btfsc RA,DR ;该位为 0
- ;还是为 1
- bsf RcvReg , MSB ;为 1
- call Delay ;延时 B/2 秒
- decfsz R_CNT
- goto Rnext
- retlw0 ;返回
- ;发送子程序
- Xmtr
- clrwdt ;清片内看门狗
- ;定时器
- movlw 8 ;发送位数为 8
- movwf X_CNT
- bcf RA , DX ;发送起始位
- Xnext
- call Delay ;延时 B/2 秒
- call Delay ;延时 B/2 秒
- rrf XmtReg ; LSB 在先
- btfsc STATUS,C ;检测将要发送
- ;的数据位
- bsf RA,DX ;数据位为 1
- btfss STATUS , C
- bcf RA , DX ;数据位为 0
- decfsz X_CNT ;位计数为 0 则
- ;发停止位
- goto Xnext ;位计数不为 0
- ;则发下一位数据位
- Xstop
- call Delay ;延时 B/2 秒
- call Delay ;延时 B/2 秒
- Bsf RA,DX ;发送停止位
- Retlw 0 ;返回
- ;延时子程序
- Delay
- movlw 12 ; 52 μ S 延时
- movwf DCNT ;
- Dnext
- decfsz DCNT
- goto Dnext ;
- retlw 0 ;
4 Win95 的串行通信机制及串口查询法的原理
常用的 DOS 系统主要是工作在响应中断方式。 PC 机串行通信程序大多利用其 BIOS 块的 INT14H 中断,以查询串口的方式完成异步串行通信。
Windows 系统函数即包含了通信支持中断功能。 Win95 系统为每个通信设备开辟了用户定义的输入输出缓冲区(即读 / 写缓冲区),数据进出通信口均由系统后台来完成。应用程序只需完成对输入输出缓冲区操作就可以了。实际过程是每接收一个字符就产生一个低级硬件中断, Win95 系统中的串行驱动程序就取得了控制权,并将接收到的字符放入输入数据缓冲区。然后将控制权返还正在运行的应用程序。如果输入缓冲区数据已满,串行驱动程序用当前定义的流控制机制通知发送方停止发送数据。队列中的数据按“先进先出”的次序处理。
(1) 按协议的设置初始化并打开串口,这样做就是通知 Windows 本应用程序需要这个串口,并封锁其他应用程序使它们不能使用此串口。
(2) 配置这个串口。
(3) 在串口上往返地传输数据,并在传输过程中进行校验。
(4) 不需要此串口时,关闭串口。即释放串口以供其它应用程序使用。
在这四个步骤中,主要的程序代码集中在第( 3 )步。
串口查询法是一种主要工作在查询方式下的实现方法。当通信程序工作在“查询”方式时,可以不考虑 Win95 的进程和线程的问题。仅在串口有数据时,去读串口缓冲区就可以了,如图 4 所示。这种方法下确定串口读取的时机、握手协议及软件纠错的实现是程序员应考虑的主要问题。
图 4 读取接收缓冲区数据流程图
图 5 串口初始化流程
由于这种方法主要工作在查询方式。程序员必须完成相当一部分通信状态的检测工作,许多细节(甚至包括通信过程中的字符属性的转换)也必须通过程序代码完成。这种查询方法对通信双方协议的依赖性尤其大。双方通信协议的约定对程序实现的难易程度影响很大。
串口查询法中,一般串口初始化的流程如图 5 。
值得注意的一点是,此方法下协议的约定必须满足以下条件:即甲方发送时,乙方必须在甲方发送动作之前进入循环接收状态,直到接收到字符后通过对串口读取函数 ReadFile 返回值的判断跳出循环状态。
同时,一般为了不使系统因循环等待接收而进入“死循环”状态,可以人为设置读取串口的循环次数,一般 1000 ~ 10000 次即可。 本程序的实现平台是 VB4 ,这是一种极为灵活的高级语言,它可以方便地引入汇编语言的思维,利用其 GoTo 转向语句方便地控制程序的流程,灵活方便。
5 PC 机内通信程序的实例
现约定甲方是 PC 机,乙方是单片机系统(如读卡器)。通信格式设置为 2400 波特率, 8 位数据位, 1 位停止位,无奇偶校验。 下面是一个约定好通讯协议的程序实例,协议流程如图 6 所示。 以下是甲方( PC 机)的几个子函数的程序实例。
图 6 通信协议流程
[
本帖最后由 老夫子 于 2009-12-9 14:19 编辑 ]