运用Visual Basic实现PC与89C51单片机之间的串行通信

沈 飙 夏海燕

  摘要 在Visual Basic开发环境下,运用VB提供的通信控件,实现PC机与89C51单片机之间的串行通信。
  关键词 Visual Basic 89C51单片机 串行通信 A/D D/A转换

Serial Communication between PC
and 89C51 with Visual Basic

  Abstract:Serial communication between PC and 89C51 single-chip-computer by MSCOMM control box of Visual Basic is introduced.
  Key Words:Visual Basic 89C51 Serial communication A/D D/A

1 系统简介
  在中科院等离子体物理研究所受控核聚变物理实验装置控制系统中,我们开发设计了以计算机控制为基础的各种信号予置系统,系统原理如图1所示。

15-1.gif (3308 bytes)

图1 系统原理图

  系统上位机由一台(PC586)微机构成,软件采用Visual Basic编程,作出十分直观的人机界面,并通过串行口将所需的各种予置信号(数字信号)传给单片机系统,再由单片机系统产生实际的模拟信号经线性光电隔离器送到现场。予置数值可以分别显示在PC机软件窗口和单片机系统的予置数字表头上。同时,现场实测信号经过线性光电隔离器,也可以实时显示在本系统的检测数字表头上和PC机的界面上。如此设计界面直观,而且利于对现场信号进行实时监测。因此,采用本系统,大大提高了现场信号予置精度,对实验操作人员来说人机界面良好,简单易懂。我们将分硬件和软件两方面分别介绍该系统的情况。

2 硬件介绍
  从系统原理图上可见,本系统关键的硬件部分是单片机系统的设计,上位机PC机则直接利用它的RS232串行口即可。系统硬件原理如图2所示。

15-2.gif (8048 bytes)

图2 系统硬件原理图

  本系统采用CPU为89C51的单片微机,89C51本身带有2K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用的8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单、方便等优点,而且完全兼容MCS 51系列单片机的所有功能。该单片机系统的工作流程是这样的:89C51单片机利用自身具有的串行通信口,直接接收PC机传送下来的串行数据,然后将所接收的各组数据通过并行口输出,经过数字光隔,送到数据锁存器74LS373,最后将锁存的数据送到D/A转换器进行数模转换并通过运放将模拟信号输出,同时显示在相应的予置数字表上。现场返回的信号通过隔离,经过A/D转换器和数据锁存器变成单片机所需的并行数字信号送到单片机的数据存储单元中,再由串行口返送到PC机上,同时显示在PC机界面和本系统相对应的检测数字表上以便于予置和实际情况相对比。利用89C51输出口对不同数据锁存器74LS373和A/D、D/A的片选输出可以实现一台单片机同时对多路不同信号进行予置和检测。

3 软件结构
  软件分PC机Visual Basic编程和89C51单片机汇编语言编程两部分,现分别介绍如下。
3.1 PC机部分
  PC机采用Visual Basic(简称VB)编程。目前,VB已成为WINDOWS系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。VB支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件,而且可以十分简便地作出良好的人机界面。在标准串口通信方面,VB提供了具有强大功能的通信控件MSCOMM,文件名为MSCOMM.VBX。该控件可设置串行通信的数据发送和接收,对串口状态及串口通信的信息格式和协议进行设置。这是一个标准的十位串口通信,包括8位标准数据和数据的起始位和停止位。在发送或接收数据过程中触发OnComm事件,通过编程访问CommEvent属性了解通信事件的类型,分别进行各自的处理。每个通信控件对应一个串口,可以设计多个通信控件来访问多个通信口。VB通信控件设计软件如下:

Global comm_time As Integer //定义一些全局变量
Global data(1000)As Integer
Global Receive(1000)As Integer
Private Sub Form_Load()’ //串口初始化
  Comml.CommPort=1 //设置串口1
  Comml.Settings=“9600,N,8,1” //波特率:9600 奇校验,8位数据,1位停止位
  Comml.InputLen=0 //读取接收缓冲区的所有字符
  Comml.InBufferSize=256 //设置接收缓冲区为256字节
  Comml.OutBufferSize=256 //设置发送缓冲区为256字节
  Comml.PortOpen=True //打开串口1
  Comml.SThreshold=1 //发送缓冲区空触发发送事件
  Comml.RThreshold=1 //每一个字符到接收缓冲区都触发接收事件
End Sub
Public Sub send-data() //发送n个数据
  For i=0 To n
  Comml.Output=Chr(data(i))
  Next i
End Sub
Public Sub Comml_OnComm() //接收数据触发OnComm()事件
  Select Case Comml.CommEvent //在CommEvent中接收数据
  Case comEvReceive
  Receive(comm_time)=Asc(Comml.Input) //将接收数据放在Receive(comm-time)数组中  Comm_time=comm_time+1
 End Select
End Sub

3.2 单片机部分
  单片机89C51采用MCS51系列的汇编语言编程。它有一个标准的串行口,有4种工作方式,其中方式1是标准的10位异步通信方式,10位数据和PC机的标准串口相对应,由串行口控制寄存器SCON设置状态,其字节地址为98H。如下式所示:

SM0 SM1 SM2 REN TB8 RB8 T1 R1

  本系统中89C51串口控制器SCON设置为50H,SM0、SM1为0、1,即为串行工作方式1,REN为1,即允许串口接收。另外,还应使89C51的中断允许寄存器IE的开放或禁止所有中断位EA为1,开放或禁止串行通道中断位ES为1,即允许串行口中断。89C51的并行口P0和P2分别作为八位数据的输入和输出口。P3口的输出作为数据锁存器和D/A、A/D的禁止和允许。程序流程如图4所示。
单片机程序清单简介:
(1)主程序
   MOV SP,#07
   ACALL INIT //调串口初始化子程序
STRAT:CLR EA 清中断
   MOV R0,#DATA1 存放接收数据首地址#DATA1
   MOV R1,#DATA2 存放发送数据首地址#DATA2
   MOV R2,#N 数据个数
   SETB EA 开中断
   ACALL D/A 调延时并启动D/A转换子程序
   ACALL SEND 启动A/D转换子程序并串口发送
   SJMP START 返回
(2)串口初始化程序
INIT:MOV TH1,#FD 设置波特率
   MOV TL1,#00
   MOV TMOD,#20 定时器2为工作方式2
   MOV TCON,#40 启动定时器
   SETB ES 允许串口中断
   MOV SCON,#50 置串行口工作方式1
   MOV P2,#0F
   RET
(3)中断服务程序
0023 PUSH ACC 保护堆栈
   PUSH PSW
   MOV DPH,#00
   JB TI,TEMP1 判断是否为发送,是则跳转
WAIT:JNB RI,WAIT 判断是否为接收,否则循环
   MOV A,SBUF 将接收的数据送到数据地址内
   MOV @R0,A
   CLR 98 清接收中断
   INC R0
   DJNZ R1,TEMP1 数据若送完则将标志置1
   SETB 00
TEMP1:CLR  99 清发送中断
   POP PSW
   POP ACC
   RETI
(4)延时及调D/A转换子程序
D/A:INC DPTR 延时
   MOV A,DPH
   CJNE A,#FF,D/A
   JNB 00,D/A 数据未送完,返回
   CLR 00 送完则将送完标志清零
   ACALL OUT
   RET
OUT:CLR A
   MOV A,@R0 将接收的串行口数据送到P2口
   MOV P2,A
   SETB 90 封锁数据锁存器
   MOV R3,#00
WAIT1:DJNZ R3,WAIT1 延时
   CLR 90  解除封锁数据锁存器
   RET
(5)A/D转换及串口发送子程序
SEND:MOV DPTR,#ADRESS IN0通道地址首址
   MOV R7,#08H 从IN0-IN7依次采集的通道个数
LOOP1:MOVX @DPTR,A 启动A/D转换
   MOV R6 #0AH 延时100μs
DELAY:NOP
   NOP
   NOP
   DJNZ R6,DELAY
   MOVX A,@DPTR 将转换结果送到指定地址R1
   MOV @R1 A
   MOVX A,@R1
   MOV SBUF,A 将指定地址数据从串口输出
   INC DPTR   INC R1
   DJNZ R7,LOOP1
   RET

15-3.gif (8298 bytes)

图3 程序流程图

4 结束语
  该系统目前已成功地应用在中科院等离子体物理研究所的HT-7超导托卡马克受控核聚变物理实验装置上,运行良好。对于目前广泛应用的Windows环境下实现PC机与单片机之间的通信问题,希望本文能够提供一点有用的参考价值。

作者单位中科院等离子体物理研究所 合肥 230031