下面介绍用查询法实现异步串行通讯的方法。同时给出了用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 接口原理图
3 PIC16F84单片机内通信程序的设计
图2 接收子程序框图 图3发送子程序框图
图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
;
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

