登录站点

用户名

密码

PC机与单片机AT89C51的串行通信

已有 906 次阅读  2009-09-27 17:08   标签单片机  串行  PC机  通信 
PC机与单片机AT89C51的串行通信

 摘 要: 
    在 Windows95 下使用串口 API 函数实现 PC 机与单片机 AT89C51 的串口通信,重点介绍计算机采用事件驱动 I/O 方式的函数编程及单片机串口中断发送、接收程序的实现。 

   关键词: Windows95  单片机 AT89C51 RS-232 接口  RS-485 接口 串行通信 

    在以单片机为基础的数据采集和实时控制系统中,通过计算机中的 RS-232 接口进行计算机与单片机之间的命令和数据传送,就可以利用计算机对生产现场进行监测和控制。由于计算机上的 RS-232 所传送的距离不超过 30m ,所以,在远距离的数据传送和控制时,可以用 MAX485 的接口转换芯片将 RS-232 转换成 RS-485 协议进行远距离传送。在发送和接收端都进行协议转换后, RS-485 协议对数据传送来说是相对透明的,所以依然可以使用计算机中的 RS-232 进行远距离的数据传送和控制。在最简单的 RS-232 直接传送通信系统中,只要发送和接收双方同时准备好,仅用信号发送端 (TXD) ,信号接收端 (RXD) 和信号地 (GND)3 根线即可进行通信;若以应答方式进行数据通信,可使用请求发送 (RTS) 、清除发送 (CTS) 或数据终端准备 (DTR) 、数据装置准备 (DSR) 进行硬件握手。在 Windows95 下,可以很方便地使用 Win32 通信 API 函数来实现这些硬件的握手以及数据的传送。在 89C51 单片机系统中,分别从 P3.0 和 P3.1 引出串口线 RXD 和 TXD 通过专用的电平转换芯片转换成 RS-232 接口标准的电平,这样,二者之间就可以通过 RS-232 接口进行数字信号的传送。单片机也可以以直接传送或应答握手的方式进行数据通信,但由于握手方式占用其他的端口,而单片机的端口数量有限,所以,计算机与单片机的通信常采用直接传送的方式,本文将重点介绍。 
    1 Windows95 下的通信编程 

    Windows95 通信体系提供了 1 个改进的串行应用程序接口 SAPI 用来进行交互式串行通信。其中,串口和其他通信设备是作为文件进行处理的,串口的打开、关闭、读取和写入所用的函数和操作文件的函数相同。

   通信会话以调用 CreateFile 函数开始, CreateFile 函数为读访问或写访问打开串口,打开成功后返回该串口句柄,供读写串口时使用。 CreateFile 函数的使用如下: 

CreateFile(szDevice,fdwAccess,fdwShareMode,lpsa,fdwCreate,fdwAttrsAndFlags,hTemplateFile) 

   其中,第 1 个参数 szDevice 是要打开的串口逻辑名,如 COM1 或 COM2 ;第 2 个参数 fdwAccess 指定串口的访问类型,如读、写或两者兼而有之,大部分通信是双向的,因而通常设置为: GENERICREAD | GENERICWRITE ;第 3 个参数 fdwShareMode 指定串口的共享属性,串口不能共享,所以它必须为 0 ;第 4 个参数 lpsa 引用安全性属性结构;第 5 个参数 fdwCreate 指定如果 CreateFile 正被已有的文件调用时应做些什么,既然串口总是存在,此参数就必须被设置为 OPENEXISTING 。第 6 个参数 fdwAttrsAndFlags 描述了该端口的各种属性,对串口而言,唯一有意义的设置是 FILEFLAGOVERLAPPED ,指定该设置时,端口 I/O 可以在后台进行;最后 1 个参数 hTemplateFile 是指向模板文件的句柄,当端口打开时,该参数为 NULL 。 

    打开串口后,在 Windows95 下可以对串口进行合适的配置。 Windows95 提供了 COMMPROP 结构, COMMPROP 结构中包含了对串口允许的设置,如波特率、数据位数、停止位的个数以及奇偶校验方法等,如果串口连接到调制解调器, COMMPROP 结构中还包含调制解调器支持的设置。但 COMMPROP 结构给出的只是单纯的信息,它不能用来改变串口的设置。 Windows95 下串口设置的改变是通过改变它的 DCB 结构来实现的, DCB 结构中包含了所有串口的设置,其中包括硬件的握手、流控制等。

    Windows95 提供 GetCommState 函数来得到当前串口的设置情况,该函数接收 1 个打开的端口句柄和 1 个指向 DCB 结构的指针,在 DCB 结构中返回信息, GetCommState 函数的补充函数是 SetCommState 函数, SetCommState 函数将 DCB 结构中的内容写向串口设置,这 2 个函数的调用如下: 

    BOOLGetCommState(hComm,&dcb) 
    BOOLSetCommState(hComm,&dcb) 

    其中, hComm 为打开串口的句柄, dcb 为 1 个指向 DCB 的结构。 

    Windows95 中实现串口的读写函数与文件的读写函数相同,读写函数的使用格式如下: 

    ReadFile(hComm,inbuff,nBytes,&nBytesRead,&overlapped) 
    WriteFile(hComm,outbuff,nBytes,&nBytesWrite,&overlapped) 

    其中,第 1 个参数是打开串口的句柄,第 2 个参数是数据所使用的缓冲区,第 3 个参数是要读取的字节数,第 4 个参数是实际读取的字节数,实际读取的字节数可能小于要读取的字节数,最后 1 个参数指向 1 个覆盖似的结构,当 CreateFile 中 dwAttrsAndFlags 参数设置为 FILEFLAGOVERLAPPED 时,此参数可以指定 1 个 OVERLAPPED 结构,使数据的读写操作在后台进行。 

    读写端口可以通过 4 种技术来实现:查询、同步 I/O 、异步 I/O( 后台 I/O) 和事件驱动 I/O 。查询方式直接、易于理解,但占用大量 CPU 时间;同步 I/O 直到读取所指定字节数或超时时才返回,这样很容易长时间地阻塞线程;异步 I/O 可以在后台读写数据,而在前台做其他的事情;事件驱动 I/O 是由 Windows95 通知应用程序某些事件什么时候发生,然后根据所发生的事情来对串口进行操作。 

    这 4 种不同的技术,各有利弊和自己适用的领域,所以,在不同的通信系统中,可以根据不同的要求采用不同的技术。在监测系统中,由于事件的偶然性和要求传送的实时性,计算机常采用事件驱动 I/O 方式来进行现场监测。 

    在事件驱动 I/O 方式下, Windows95 报告给应用程序的事件由函数 GetCommMask 返回,改变返回的事件时,可以使用 SetCommMask 函数设置,这 2 个函数的调用如下:

    GetCommMask(hComm,&dwMask) 
    SetCommMask(hComm,dwMask) 

    第 1 个参数是打开串口的句柄,第 2 个参数是要等待的 1 个或多个事件的掩码。在用 SetCommMask 设置了有用的事件后,应用程序调用 WaitCommEvent 函数来等待事件的发生,直到事件发生, WaitCommEvent 函数返回。 WaitCommEvent 函数使用格式如下: 

    WaitCommEvent(hComm,&dwEvent,&overlapped) 

    第 1 个参数是打开串口的句柄,第 2 个参数是返回的事件,第 3 个参数是指定同步或者异步操作。当函数返回后,可根据返回的事件掩码进行相应的串口操作。 

  完成通信后,串口应该关闭,否则,它始终处于打开状态,其他应用程序就不能打开或使用它。关闭串口的函数为: CloseHandle(hComm) ,其中, hComm 为打开的串口句柄。 
    2  单片机下的通信编程 

    单片机 89C51 的串行端口有 4 种工作方式,通过编程设计,可以使其工作在任一方式,以满足不同场合的需要。其中,方式 0 主要用于外接移位寄存器,以扩展单片机的 I/O 电路;方式 1 主要用于双机之间或外设电路的通信;方式 2 、 3 除有方式 1 的功能外,还可用作多机通信,以构成多微机系统,方式 2 、 3 的区别在于波特率的不同。 

  单片机的串行通信的波特率可以程控设定,在不同的工作方式下,由时钟振荡频率的分频值或由定时器 T1 的定时溢出时间确定。 

  单片机的串行端口有 2 个控制寄存器,用来设置工作方式、发送或接收的状态、特征位、数据传送的波特率以及中断标志 TI 和 RI 。

  单片机的串行端口有 1 个数据寄存器 SBUF ,该寄存器为发送和接收所共有,在一定条件下,向 SBUF 写入数据就启动了发送过程,读 SBUF 就启动了接收过程。 

  单片机可以采用循环方式或中断方式实现串行数据的传送。在循环方式下,单片机循环对数据寄存器 SBUF 进行读写来实现数据的接收和发送;在中断方式下,对方式 1 、 2 来说, 1 帧数据发送或接收完后, TI/RI 自动置 1 ,请求串行中断,若 CPU 响应中断,则执行串行中断服务程序,并把 TI/RI 清 0 以再次响应中断。对在方式 2 、 3 下的接收,还要视串口控制寄存器 SCON 的设置才可确定 RI 是否被置位以及串口中断是否开放。 

   实时控制中,由于事件的突发性,常采用中断的方式进行数据传送,中断方式能更大限度地提高资源的利用率,使 CPU 在不进行数据通信时做其他的工作。下面重点介绍单片机在方式 1 下的中断方式编程。 
   方式 1 是 10 位异步通信方式,其中包括 1 个起始位, 8 个数据位和 1 个停止位。波特率由定时器 T1 的溢出率和串口控制寄存器 SMOD 的状态确定,在 CPU 的晶振为 11.0592MHz 时,波特率常采用 9600b/s 。 

  对 SBUF 进行写操作就可启动发送,在发送移位时钟的同步下,从 TXD 先送出起始位,然后是 8 位数据位,最后是停止位,这样, 1 帧数据发送完,中断标志 TI 置位。 

  在允许接收的条件下 (REN = 1) ,当 RXD 出现由 1 到 0 的负跳变时,即被当成是串行发送来的 1 帧数据的起始位,从而启动 1 次接收过程。当 8 位数据接收完,并检测到高电平停止位后,即把收到的 8 位数据装入 SBUF ,置位 RI , 1 帧数据的接收过程就完成了。 

  下面是单片机以方式 1 在直接传送下的中断接收和发送程序。由于没有使用通信握手,所以通信双方都应做好通信准备。在计算机接收、单片机发送时,由计算机先发送字母“ R ”,通知单片机计算机已准备好,然后计算机在事件驱动 I/O 方式下等待接收到字符“ Y ”;当单片机接收到“ R ”时,向计算机发送“ Y ”,表示单片机也已准备好,这样,一旦计算机接收到“ Y ”就表示双方都已准备好,二者之间就可以进行数据交换了。在计算机发送、单片机接收时,计算机发送 1 帧数据,单片机响应中断,接收数据。单片机程序的具体实现过程如下: 

org 0000h 
ajmp start 
org 0023h   ;串行中断入口 
ljmp s&r 
org 0100h 
start: mov tmod,#20h  ;设置定时器 T1 方式 2 
mov pcon,#00h ;使 SMOD 为 0 
mov tll,#0fdh ;波特率为 9600b/s 
mov thl,#0fdh 
setb ea ;开全局中断 
clr et1 ;关 T1 中断 
setb es ;开串行中断 
setb trl ;开 T1 定时 
mov scon,#50h ;串行方式 1 ,允许接收 
sjmp $ 
S&r:mov c,ri 
jcre cive;RI 为 1 ,执行接收子程序 
sjmp send ;否则,执行发送子程序 
recive:mov a,sbuf ;接收数据 
clr ri 
cjne a,#52h,re ;是否接收到“ R ” 
mov a,#59h ;是,发送“ Y ” 
mov sbuf,a 
sjmpendtr 
re:mov @rl,a   ; r1 为接收数据存放地址 
inc r1 
sjmpendtr 
send:mova,@r0 ;发送数据, r0 为存放数据的地址 
movsbuf,a 
jnbti,$ 
clrti 
incr0 
end tr:reti ;中断返回 
    3  结束语 

  串口通信是一种广泛应用于各个领域的通信方式,由于目前大部分计算机都安装了 Windows95 操作系统,所以本文具体实现了在 Windows95 下利用它的 SDK 函数来与单片机进行串口通信。本文所提出的实现函数在所有当前流行软件如 VC++ 、 Delphi 等中都可实现。它不仅可以用于近距离的 RS-232 通信,而且,还可以实现中远距离 RS-485 通信。在使用该程序的通信系统中,近远距离的通信都取得良好的效果。 

    参考文献 
    1 MirhoCA,TerrisseA 著,贺军,高胜友译 .WINDOWS95 通信编程 . 北京:清华大学出版社, 1997 
    2  陈光东,赵性初 . 单片微型计算机原理与接口技术 . 武汉:华中理工大学出版社, 1993

    本文可能所用到的IC型号: ADT7476ARQZ ADXL150EM-3 MAX9704ETJ-T MAX6709MUB HI3-0201HS-9 MAX4579CPP M29W040B55K1

上一篇: 探讨几种LED保护电路设计方案 下一篇: 基于McBSP的双DSP间高速通信

分享 举报