PC机与MCS-51单片机的串口通信
前市场上出现了一些新型的RS-232C电平转换芯片MAXIM系列的产品,AXIM公司生产的MAX系列RS-232C收发器芯片。
2. 波特率设置
PC机的波特率必须和单片机相匹配,所以只要单片机的波特率定了,PC机只要下图5-4所示的界面中设置一下即可。
图5-4 波特率设置界面
3、串行口工作方式的选择
为了确保数据传输无误,采用软件握手的方式。即发送方给接收方传送的一个数据,接收方收到后再将这个数据发送回来,发送方将两个数据比较,若二者相同则表示传输无误,接着传送下一个数据。所以不需要奇偶校验,因此选择串行口方式一工作即传输数据的格式为1位起始位,8位数据位,1位停止位。
4、VB串口Mscomm控件
VB提供了串行端口控制Mscomm来为应用程序提供串行通讯。该控件屏蔽了通信过程中的底层操作,程序员可以设置、监视Mscomm控件的属性和事件,结合Timer控件即可完成对串行口的初始化和数据的输入输出工作。Mscomm控件的主要属性如下:
(1)Commport 设置并返回通讯端口号。端口号可以设置为1~16的任何数,如Mscomm.Commport=2表示设置当前通讯端口为COM2。
(2)Setting 设置并返回波特率、奇偶校验、数据位、停止位。格式为Mscomm.Setting=String。String是一个包含四部分的字符串:第一部分为波特率;第二部分为奇偶校验,N表示不校验,M表示符号校验,E表示偶校验,O表示奇校验,S表示空格校验;第三部分为数据位数,其可选值为4,5,6,7,8;第四部分为停止位位数,其可选值为1,1.5,2。Setting属性的缺省值为2400,N,8,1”。
第26页 (共41页)
串行口通信技术
(3)Portopen 设置并返回通讯端口的状态,也可以打开和关闭端口。 (4)Input 从接收缓冲区返回和删除字符。该属性在运行时为只读。
(5)InputLen 设置并返回每次Input属性从接收缓冲区中读取的字符数。InputLen属性的缺省值为0。设置InputLen为0时,Input将读取接收缓冲区的全部字符。
(6)Output 向传送缓冲区写数据。要传送的数据可是文本数据或二进制数据。 (7)CommEvent 返回最近的通讯事件或错误。只要有通讯错误或事件发生错误时就会产生Oncomm事件。CommEvent属性中存有该错误或事件的数值代码。
6 软件设计
PC机与单片机间的通信,特别是PC机和多台单片机构成小型分布系统实现分级分布式控制得到了广泛的应用。本章阐述PC机与AT89C51间的双机通信的汇编语言和Visual Basic 语言通信程序设计技术。
软件需要解决的是设定PC机串口和单片机串行口的工作方式,包括串行口的通讯速率、奇偶校验位、停止位等。本次设计,以PC机为主机,单片机AT89C51作为从机,具体的通信协议如下:
· 波特率设置:2400b/s;
· 信息帧格式:1位起始位,8位数据位,1位停止位; · 校验方式:采用无校验方式;
· 传送方式:PC机采查询方式接收和发送数据,单片机AT89C51采用中断方式接收与发送数据。
6.1 单片机通信程序设计
单片机的数据通信由串行口完成,定时器T1作为波特率发生器,其波特率要与PC机一致。数据的传送格式为1位起始位、8位数据位和1位停止位。采用中断方式发送和接收数据,定时器T1设置为工作工作模式2,串行口设置为工作方式3,由第9位判断停止。具体的程序流程图和程序清单分别见附录2和附录3。 6.1.1 单片机中断方式接收程序
当PC机不发送任何数据的时候,从机单片机始终处于等待状态(P.),直到PC
第27页 (共41页)
PC机与MCS-51单片机的串口通信
机发送数据过来。由于PC机在发送有效数据之前会加一个开始符(FFH),在有效数据之后会加一个开始符(7FH),所以单片机接收到主机发送来的FFH之后,置RAM存贮单元的初始地址30H单元,用来放紧接着接收的数据,程序中还用了一个计数器COUNTER来计接收到的数据位数,直到接收到7FH为止。程序框图见附录2。
单片机接收主程序MAIN及中断服务程序STR清单如下: COUNTER EQU 40H POINT EQU 41H ORG 0000H LJMP MAIN ORG 0023H LJMP SRT
MAIN:MOV SP,#60H
MOV TMOD,#20H ;定时器T1的方式2 MOV PCON,#00H ;串行口波特率控制位 MOV TH1,#0F4H ;2400Kb/s MOV TL1,#0F4H MOV 30H,#15
MOV COUNTER,#1
MOV R0,#30H ;接收数据存放区 MOV R1,#30H
SETB TR1 ;开始计数
CLR ET1 ;清定时中断
MOV SCON,#50H ;串行口控制寄存器给值 SETB EA ;开总中断 SETB ES ;开串行口中断 MOV IP,#10H MAIN1: ACALL DISP SJMP MAIN1 SRT: PUSH ACC PUSH 01H
JBC RI,GET SJMP EXIT
GET: MOV A,SBUF
CJNE A,#0FFH,GET1 ;判断是否为开始字符,不是跳GET1放数据存贮 R0,#30H ;是开始符就置存贮区首地址30H,计数器清0并跳出中断
MOV COUNTER,#0
SJMP EXIT
GET1: CJNE A,#07FH,GET2 判断是否为结束符,不是跳GET2放数据存贮区 MOV R5,COUNTER ;是结束符,放发送缓存区开始字符 INC R5
第28页 (共41页)
MOV
软件设计
MOV POINT,#30H MOV SBUF,#255 SJMP EXIT GET2: MOV @R0,A INC R0
INC COUNTER EXIT: POP 01H POP ACC RETI
6.1.2 单片机中断方式发送程序
由于本次设计的系统要实现的功能是将PC机送到单片机的数据回送到PC机,所以单片机要在接收完PC机数据后立即将数据回送到PC机。也就是说要将RAM存贮单元的初始地址30H单元内数据逐一发送出去。程序框图见附录2。
单片机发送主程序MAIN及中断服务程序SEND清单如下:
COUNTER EQU 40H POINT EQU 41H ORG 0000H LJMP MAIN ORG 0023H
LJMP SRT
MAIN:MOV SP,#60H
MOV TMOD,#20H ;定时器T1的方式2 MOV PCON,#00H ;串行口波特率控制位 MOV TH1,#0F4H ;2400Kb/s
MOV TL1,#0F4H MOV 30H,#15
MOV COUNTER,#1
MOV R0,#30H ;接收数据存放区
MOV R1,#30H
SETB TR1 ;开始计数
CLR ET1 ;清定时中断
MOV SCON,#50H ;串行口控制寄存器给值 SETB EA ;开总中断 SETB ES ;开串行口中断 MOV IP,#10H MAIN1: ACALL DISP SJMP MAIN1 SRT: PUSH ACC
第29页 (共41页)
PC机与MCS-51单片机的串口通信
PUSH 01H
JBC RI,GET ;判断是否为接收,是跳GET接收程序,否执行发送程序 CLR TI
DJNZ R5,SEND1 SJMP EXIT
SEND1: MOV R1,POINT
MOV A,@R1 MOV SBUF,A INC R1
MOV POINT,R1 SJMP EXIT EXIT: POP 01H POP ACC RETI
6.1.3 单片机显示程序
单片机显示部分可以用来检测接收到的数据是否正确,单片机显示程序主要
将接AT89C51从串行口收到的数据显示出来。在程序设计中,在AT89C51RAM存贮器中的四个显示缓冲器单元30H-34H,分别存放着由PC机方发送过来的数据,AT89C51的P2口扫描输出总是只有一位为高电平,即4位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51的P0口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地改变P2口输出为高的位,P0口输出对应的段数据,4位显示器就显示出由缓冲器中显示数据所确定的字符。程序框图见附录2。
单片机显示子程序清单如下:
DISP: PUSH ACC MOV DPTR,#TAB MOV R1,#30H
MOV A,COUNTER
JZ DISP2 ;没有接收到数据,跳出DISP继续显示P.等待状态 MOV R2,A
MOV R6,#08H DISP1:MOV A,@R1 CPL A ANL A,#0FH
MOVC A,@A+DPTR
MOV P0,A ;送字形码到P0口 MOV A,R6
第30页 (共41页)