单片机报告
- 格式:docx
- 大小:82.85 KB
- 文档页数:8
PIC单片机与PC的通信 1. 前言
在很多单片机的应用中,都会涉及到数据采集的问题。由于单片机的局限性,常常需要将单片机采集到的大量数据传输至计算机,利用计算机资源对数据进行处理。数据的传输涉及到单片机的通信,所谓单片机的通信是指单片机与外部设备之间、单片机与单片机或单片机与 PC之间的信息交换, 单片机数据通信的方式有并行和串行通信两种。并行通信是指一次就可以同时传送一个数据字的传输方式,串行通信是把一个数据字逐位顺序分时进行的传输方式。由于串行通信是在一根传输线上一位一位的传送信息, 所用的传输线少, 特别适合于远距离传输, 所以串行接口是微机应用系统比较常用的接口。 串行通信的标准接口存在多种,如RS232、RS485、USB接口、IEEE1394、红外、蓝牙等等,他们各有特点,应用领域也各有不同。RS485在数据传输时抗噪声和干扰能力比较强,常用于工业生产领域;RS232是一种在低速率串行通讯中增加通讯距离的单端标准;USB接口和IEEE1394传输速度较快,但有些计算机和操作系统不支持这样的接口;在一些不适合工作人员接近的场合,就要利用红外或蓝牙这样的无线方式进行数据传输。 PIC系列单片机是由Microchip公司推出的,采用了精简指令集、哈佛总线结构、流水线取指方式的嵌入式微控制器,它的抗干扰能力强,性价比高。PIC16F877有40个引脚,分别有PortA,PortB,PortC,PortD(RD0:RD7)和PortE(RE0:RE2)作为I/O端口,另外还有5路的10bit AD转换通道。 下面主要对PIC16F877单片机通过RS232同PC的通信进行探讨。
2.RS232串口通信 2.1 串行通信的两种基本方式 串行通信存在异步和同步传送两种基本方式。异步传送的数据采用不归零格式,即一位起始位、8位或9位数据位及1位停止位,片内提供的8位波特率发生器BRG可以用来驱动振荡电路,产生标准的波特率频率。而在同步传送方式下,不仅需要有信息传输线,还要有时钟传输线,且不需要把信息组织成包含起始位和停止位的帧结构。 2.2 波特率发生器BRG USART模块带有一个8位的波特率发生器BRG,实际上就是波特率时钟发生器,为串行信息帧格式中每一位编码的发送和接收检测提供定时时钟。利用寄存器SPBRG来定义一个8位定时器的循环周期,以实现对波特率的控制。 波特率计算公式如下表: SYNC BRGH=0(低速) BRGH=1(高速) 0(异步) 波特率=fosc/[64(X+1)] X=[fosc/(64*波特率)]-1 波特率=fosc/[16(X+1)] X=[fosc/(16*波特率)]-1 1(同步) 波特率=fosc/[4(X+1)] X=[fosc/(4*波特率)]-1 无
2.3 串行通信的数据帧格式 典型的数据帧格式如图所示
这样的数据帧结构适用于“点对点”的单片机之间或单片机与PC机之间的通信(不需要寻址操作),若进行“一点对多点”的单片机之间的或者单片机与PC机之间的多机通信(需要寻址操作),则将校验位替换为地址/数据位或标志位。 2.4 与USART相关的寄存器 与USART模块相关的寄存器共有9个,其中INTCON、PIR1、PIE1、TRISC是与单片机其他模块合用的寄存器。相面介绍其他5个USART模块专用的寄存器。 2.4.1 发送兼状态控制寄存器TXSTA
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 CSRC TX9 TXEN SYNC BRGH TRMT TX9D TX9D:发送数据的的第9位(如果使用9位数据帧结构) TRMT:发送移位寄存器(TSR)“空”标志位 BRGH:高波特率选择位 SYNC:USART同步/异步模式选择位 TXEN:发送使能位 TX9:发送数据长度选择位 CSRC:时钟选择位
2.4.2 接收状态兼控制寄存器RCSTA Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 SPEN RX9 SREN CREN ADDEN FERR OERR RX9D RX9D:所接收数据的第9位,可作奇偶校验位或者标志位等。 OERR:超速出错标志位(Overrun Error bit) FERR:帧格式错误标志位 ADDEN:地址匹配检测使能位。只有接收数据选择9位时,该位才起作用。 CREN:连续接收使能位 SREN:单字节接收使能位 RX9:接收数据长度选择位 SPEN:串行端口使能位
2.4.3 USART发送缓冲寄存器TXREG Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TX7 TX6 TX5 TX4 TX3 TX2 TX1 TX0 TXREG是一个用户程序可读可写的寄存器。每次用户发送的数据都是通过写入该缓冲器来实现的。 2.4.4 USART接收缓冲寄存器RCREG
Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 RX7 RX6 RX5 RX4 RX3 RX2 RX1 RX0 RCREG是一个用户程序可读可写的寄存器。每次从对方传送过来的数据,用户都是从该缓冲器最后读出来的。
2.4.5波特率寄存器SPBRG Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 对于波特率发生器产生的波特率的定义值 SPBRG寄存器用来控制一个独立的8位定时器的溢出周期。该寄存器的设定值(0~255)与波特率成反比关系。在同步方式下,波特率仅由这一个寄存器来决定;而在异步方式下,则由BRGH位(TXSTA寄存器的bit2)和该寄存器共同确定。
2.5 硬件部分 由于单片机输入、输出电平是TTL电平,而PC机配置的是RS-232标准串行接口,两者的电气规范不一致,因此要完成单片机与PC机的数据通信,必须进行电平转换。转换采用MAX232,转换芯片,连接图如图所示: 2.6 软件部分 2.6.1 上位机程序 上位机程序采用LabVIEW进行编写。针对PC机的RS232端口,LabVIEW提供了1个子模板,共包括6个VISA节点,分别实现初始化串口口( VISA configure serial port)、串口写(VISA write)、串口读(VISA read )、检测串口缓存( VISA bytes at serial port) 、中断 (VISA serial break )以及关闭串口(VISA close)等功能,这些节点位 于 Functions模板、All Functions子模板、 Instrument I/O子模板、 Serial子模板中。用户通过对这几个节点的配置和连接可以很方便地开发出符合要求的LabVIEW串口通信软件 。 LabVIEW串口通信的流程图如图所示:
通信过程通过PC机发送传送命令来启动,之后PC机检测缓存区是否有数据 , 有数据则读取数据并处理,没有数据则延迟一段时间后再检测。在这个过程中要保证PC机程序与PIC单片机程序在时间上密切配合,如果延时过短,PIC单片机数据来不及传给PC机,造成PC机读不到数据;如果延时过长,PC机还未取走缓存区旧的数据,新的数据又传进来,导致缓存区数据被覆盖。
2.6.2 下位机程序 ;常数定义: VAL_US EQU .249 VAL_MS EQU .200 ;寄存器和位定义 STATUS EQU 3h ;定义状态寄存器 Z EQU 2h ;定义状态寄存器的0标志位的位地址 INTCON EQU 0bh ;定义中断控制寄存器 PORTC EQU 07h ;定义端口C的数据寄存器地址 TRISC EQU 87h ;定义端口C的方向控制寄存器地址 PORTD EQU 08h ;定义端口D的数据寄存器地址 TRISD EQU 88h ;定义端口D的方向控制寄存器地址 RP0 EQU 5h ;定义状态寄存器中的页选位RP0 PIR1 EQU 0ch ;定义第一中断标志寄存器 PIE1 EQU 8ch ;定义第一中断使能寄存器 RCSTA EQU 18h ;接收状态和控制寄存器 TXSTA EQU 98h ;发送状态和控制寄存器 SPBRG EQU 99h ;波特率发生器寄存器 RCREG EQU 1ah ;接受寄存器 TXREG EQU 19h ;发送寄存器 GIE EQU 7 ;总中断使能位 PEIE EQU 6 ;外设中断使能位 RCIF EQU 5 ;接收中断标志位 RCIE EQU 5 ;接收中断使能位 ;变量声明 count EQU 0x70 ;定义一个短延时计数器 count_ms EQU 0x71 ;定义一个长延时计数器 ;************************************************************* ;复位矢量和中断矢量 org 0x0000 ;复位矢量 goto Startup ;跳转到初始化程序 org 0x0004 ;中断矢量 ;************************************************************* ;中断服务程序 btfss PIR1,RCIF ;检查是否为USART发出的中断请求 goto Err_Exit ;否!退出 movf RCREG,0 ;是!从USART接收数据 movwf TXREG ;并且转送回去 Err_Exit retfie ;中断返回 ;************************************************************* ;主程序初始化部分 Startup bsf STATUS,RPO ;选择RAM的体1为当前体 clrf TRISD ;设置PORTD全部输出以便驱动LED显示 bsf TRISC,6 ;断开RC模块与USART TX引脚的联系 bsf TRISC,7 ;断开RC模块与USART RX引脚的联系 movlw .12 ;装载波特率发生器,为19.2kb/s movwf SPBRG ;在单片机时钟为4Mhz时 movlw b'00100100' ;使能USART发送,设置波特率发生器为高速方式 movwf TXSTA bsf PIE1,RCIE ;开放USART的接收中断 bcf STATUS,RP0 ;恢复RAM体0为当前体 movlw b'10010000' ;使能USART连续接收 movwf RCSTA ;同时使能USART端口 bsf INTCON,GIE ;使能全局中断使能位 bsf INTCON,PEIE ;使能外设中断使能位 ;------------------------------------------------------------- ;主程序主体部分 Main clrwdt ;看门狗(如果启用的话)清0 incf PORTD,f ;PORTD=PORTD+1,可以驱动LED作显