历史上的今天

今天是:2024年10月17日(星期四)

正在发生

2019年10月17日 | PIC16系列单片机与PC机串行通信的软硬件实现

发布者:平和宽容 来源: eefocus关键字:PIC16系列  单片机  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 接口原理图 

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 
; 

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 通信协议流程 


Private Function OpenThePort(cPort as String,cBaud as String,cParity 

as String,cData as String,tStops asString)As Boolean ’ 打开串口的子过程 

Dim lResult as Long 

Dim lHandle as Long 

Dim DCB_COMM as DCB 

Dim cDCBConfig as String 

lHandle = CreateFile(cPort,GENERIC_READ Or GENERIC_WRITE, 

0&,0&,OPEN_EXISTING,0&,0&) 

If lHandle = -1 Then ’打开串口失败 

OpenThePort = False 

MsgBox “串口可能正被其他应用程序占用!” 

lResult = CloseHandle(lHandle) ’先关闭串口后再打开 

If lResult = 0 Then 

OpenThePort 

Exit Function 

End If 

End If 

cDCBConfig.band = 2400 ’设置DCB 

cDCBConfig.parity = None 

cDCBConfig.data = 8 

cDCBConfig.stop = 1 

lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用户设定配置一个DCB结构 

If lResult = 0 Then 

OpenThePort = False 

MsgBox “无法建立DCB设备控制块” 

Exit Function 

End If 

lResult = SetCommState(lHandle,DCB_Comm) ’实际设置一个串口的DCB 

If lResult = 0 Then 

OpenThePort = False 

MsgBox “无法建立DCB设备控制块” 

Exit Function 

End If 

OpenThePort = True 

End Function 

Private Sub SendHand ( ) ’发送握手信号的子过程 

Dim Nchars As Long 

Static Readbuff As String * 1 

Static Writebuff As String * 1 

Dim lpDCB As DCB 

Dim lRet As Long 

Dim lHandle As Long 

Dim lpOverlapped As OVERLAPPED 

Dim RNum As Integer 

MsgBox “请把读卡器插在串口2上!”, 

48,“提示窗口” 

lHandle = OpenThePort(COMM1,2400,None,8,1) 

lRet = PurgeComm( lHandle,1 ) ’清输出缓冲区 

lRet = PurgeComm( lHandle,0 ) ’清输入缓冲区 

lRet = GetCommState ( lHandle,lpDCB ) ’获得通讯口的状态 

Shand: 

Writebuff$= Chr$(&H8F) 

lRet = WriteFile (lHandle,Writebuff$,1,Nchars,lpOverlapped ) 

’送握手信号入串口缓冲区 

If lRet <= 0 Then 

MsgBox “发送操作出错,卡握手信号未发送成功”, 16 

GoTo Shand ’不成功则重发 

Else 

GoTo Qtest 

End If 

GoTo Shand 

Qtest: 

Readbuff$ =“ ” ’清除缓冲区为空 

Do While lHandle ’循环查询串口 

RNum = 0 ’设置读串口次数的指针为0 

ReadAgain: 

lRet = ReadFile( lHandle, Readbuff$,1,Nchars,lpOverlapped ) 

If lRet < 0 Then 

MsgBox “读取应答信号时出错”, 16 

End If 

If lRet = 0 Then 

If RNum > 1000 Then ’只读1000次串口,以免陷入死循环 

MsgBox 

"卡没有插接好或卡没有接在串口上!" 

GoTo CloseP 

End If 

RNum = RNum + 1 

GoTo ReadAgain 

End If 

If Hex$(Asc(Readbuff)) <> Hex$(&HFF) Then GoTo Shand 

’回送码不正确则返回继续发送握手信号 

Else 

Label1.Caption = “握手信号是:” 

+Hex$(Asc(Readbuff$)) 

Msgbox “握手信号正确,已正确联机” 

GoTo CloseP 

End If 

Loop 

CloseP:lRet = CloseHandle( lHandle ) 

If lRet = 0 Then 

MsgBox “串行通讯口关闭成功”, 

48,“提示窗口” 

End If 

End Sub 

这里要注意的是:当PC机与单片机系统通信时,单片机数据存储区( RAM )内的数据是十六进制,在信号线上传输的是十六进制数的ASCII码的二进制形式;而Windows系统下使用的是ANSI码,ANSI码仅在前126个与ASCII码相同。即在Win95下接收到的是十六进制数的ASCII码的字符串,可先转换为ANSI码后再在Win95下还原为十六进制数。 


具体为:Code$=Hex$(Asc ( Readbuff$ ) ) 
另外,由于32位API函数参数的数据类型的变化,所有整形参数都被换为长整型(Long)以支持32位的处理,这一点在设置返回值时尤其如此。 

6 结束语 

以上的软硬件在我们的实践中达到了较为理想的效果。通过软件节省了硬件的开销,并通过在PIC16F84单片机系统和PC机双方的通信软件内增加握手信号,达到了软件数据校验的目的,获得了较高的通信可靠性。 

参 考 文 献 

1 MICROCHIP CO. PIC16/17 MICROCO-NTROLLER DATA BOOK. 1995/1996 
2 李东星等. PIC16CXX系列单片机应用设计. 高奇电子科技公司,1996.10 
3 美 Darwin Boyle等. Visual Basic 4 Developer’s Guide. 北京:机械工 
业出版社,1997.         

关键字:PIC16系列  单片机  PC机  串行通信 引用地址:PIC16系列单片机与PC机串行通信的软硬件实现

上一篇:PIC单片机的浮点数及其与十进制数之间的相互转换
下一篇:PIC16C5X单片机睡眠状态的键唤醒方法

推荐阅读

据CNBC报道,迪拜道路和运输管理局(RTA)发表声明称,将在2018年底开展无人驾驶出租车试运行,为期三个月。RTA公共交通部主管Ahmed Bahrozyan表示,第一辆无人驾驶出租车将在指定路线上运行,最高时速可达35公里,最多容纳四名乘客,其中包括一名人类驾驶员。在遇到故障或突发状况时,人类司机可以通过按钮转换驾驶模式,接管车辆,保证乘客的安全。RTA...
——基于STM32F103RCT6---- 标准库:说明:相关文件共有两个:bsp_spi_cc1101.h;bsp_spi_cc1101.c;以SPI2为例。1、“bsp_spi_cc1101.h”中的参数定义:#ifndef _BSP_SPI_1101_H_#define _BSP_SPI_1101_H_#include <stdio.h>#include "stm32f10x.h"#include "misc.h"#include "os_cfg_app.h"#include "os.h"#include "core_cm3.h"#include "bsp....
10月14日消息,一加登上央视新闻。  在央视记者镜头的见证下,一加在深圳完成了高速率的5G毫米波技术性能试验。  一加创始人兼首席执行官刘作虎表示,很荣幸也很感谢央视新闻深圳经济特区40周年对一加的报道。  我们都知道,5G毫米波频段能够带来更高的网络带宽。一加能够在毫米波网络环境当中获得2Gbps以上的下行速率,在极速下载、线上...
近日,日本海关发布了8月份该国进出口贸易的最新数据。数据显示,8月份出口到中国大陆的总额为14210万亿日元,从中国大陆进口为16293万亿日元,贸易逆差为2082.4亿日元。其中,出口到中国大陆的半导体设备为6301台,同比下降25.5%,价值为952亿日元,同比下降10.1%,占出口到中国大陆所有商品价值的6.7%。出口到中国大陆的集成电路器件的数量为22.4亿个,...

史海拾趣

问答坊 | AI 解惑

求助 谁有好的 Flash作的讲模拟电路的网站呀

(不是模拟电子基础理论)我无意中发现一个Flash的带语音讲解 有人知道吗…

查看全部问答∨

信息家电之花草浇灌系统设计

此题目是毕业设计的题目,网上这方面的材料很少,找了很久也没有什么有价值的 东西,老师也没给什么材料.要求是根据土壤湿度能实现自动浇水,能实现远程的控制对 花进行浇水,要求不只是论文还要做出实物.感觉时间很紧迫,老师为了学校本科评估毕 业设 ...…

查看全部问答∨

优秀论文

本帖最后由 paulhyde 于 2014-9-15 09:41 编辑 很不错的材料 , 不是原创 仅供分享  …

查看全部问答∨

奥本海姆中文版的离散时间信号处理【扫描版】

大家看看 下面在回复里我会贴上打开的软件 [ 本帖最后由 flyingdsp 于 2010-4-20 15:16 编辑 ]…

查看全部问答∨

[请教]和某位哥们一样,请教在C8051F上存储消息

应用情况是这样: 1. 每一个数据大概100Byte 需要在T秒(固定值)存储大概500条数据,只需要一次即可 2. 数据之间有一定的规律,但是大部分数据内部是不同的 我对C8051F单片机的理解: 1. 外扩内存是可以的,C8051F均有复用和非复用的EMIF接口, ...…

查看全部问答∨

问个问题 银行叫号机的控制核心是什么?

请问,银行叫号机的控制核心是什么? 操作系统是什么? 借地方求教一下…

查看全部问答∨

使用PB创建ATM平台

要使用PB创建ATM平台,我自己是刚接触PB,不知道该添加哪些组件; 哪位大虾指点一下哈? 谢谢!!!…

查看全部问答∨

谁装了ce6.0 r3,麻烦传个文件给我。。。

WINCE600\\PUBLIC\\IE\\OAK\\IESAMPLE_EXR\\UI\\iesample_exr.rc 这个文件被我误改了导致现在编译ie_exr过不去了,谁传给我,谢谢…

查看全部问答∨

请教等效阻抗

在网上下载的电路相关学习资料,学习到电路短路判断这一块时。遇到等效阻抗这一概念。根据学习资料上给出的电阻值,其等效阻抗=并联电路的电阻值。但是我看电路图上给出的量电阻的位置处于一条直线上,很矛盾。所以发帖请教各位老师。希望能得到等 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved