在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
ajmpstart
org0023h ;串行中断入口
ljmps&r
org0100h
start:mov tmod,#20h ;设置定时器T1方式2
movpcon,#00h;使SMOD为0
movtll,#0fdh;波特率为9600b/s
movthl,#0fdh
setbea;开全局中断
clret1;关T1中断
setbes;开串行中断
setbtrl;开T1定时
movscon,#50h;串行方式1,允许接收
sjmp$
S&r:movc,ri
jcrecive;RI为1,执行接收子程序
sjmpsend;否则,执行发送子程序
recive:mova,sbuf;接收数据
clrri
cjnea,#52h,re;是否接收到“R”
mova,#59h;是,发送“Y”
movsbuf,a
sjmpendtr
re:mov @rl,a ;r1为接收数据存放地址
incr1
sjmpendtr
send:mova,@r0;发送数据,r0为存放数据的地址
movsbuf,a
jnbti,$
clrti
incr0
endtr:reti;中断返回
3 结束语
串口通信是一种广泛应用于各个领域的通信方式,由于目前大部分计算机都安装了Windows95操作系统,所以本文具体实现了在Windows95下利用它的SDK函数来与单片机进行串口通信。本文所提出的实现函数在所有当前流行软件如VC++、Delphi等中都可实现。它不仅可以用于近距离的RS-232通信,而且,还可以实现中远距离RS-485通信。在使用该程序的通信系统中,近远距离的通信都取得良好的效果。
参考文献
1 MirhoCA,TerrisseA著,贺军,高胜友译.WINDOWS95通信编程.北京:清华大学出版社,1997
2 陈光东,赵性初.单片微型计算机原理与接口技术.武汉:华中理工大学出版社,1993
如何实现(电脑)PC机与单片机AT89C51的串行通信
- 89C51(31613)
相关推荐
89C51 单片机I/O 口模拟串行通信的实现方法 ·严天峰·
用普通I/O 口来模拟实现串行通信的时序。2.硬件电路 89C51 单片机通过普通I/O 口与PC 机RS232 串口实现通信的硬件接口电路如图2 所示。由于PC 系列微机串行口为RS232C 标准接口
2012-06-07 15:17:42
89C51 单片机IO 口模拟串行通信的实现方法和单片机的PID控...
本帖最后由 eehome 于 2013-1-5 10:02 编辑
89C51 单片机IO 口模拟串行通信的实现方法单片机的PID控制方法
2012-11-02 16:45:07
89C51单片机异步串行口的通信原理和编程
单片机双机通信一、实验目的二、实验内容三、实验步骤四、C代码如下五、实验结果六、实验体会一、实验目的掌握89C51单片机异步串行口的通信原理和编程掌握串行口工作方式1的使用及其波特率的计算二、实验
2021-11-09 07:32:14
AT89C51单片机 精选资料分享
AT89C51单片机学习一、AT89S51单片机的I/O端口二、AT89S51单片机的中断系统 1、中断处理过程 2、AT89S51单片机的中断源(2)AT89S51单片机的中断控制(3
2021-07-13 06:51:04
AT89C51单片机中断系统的控制
AT89C51单片机的中断系统的控制如图6-2所示,P0口连接了8个发光二极管, 引脚上接了一个按键,要求每次按键均能改变发光二级管的亮灭。#include #define LED P0
2022-01-05 07:03:38
AT89C51单片机定时/计数器详解
继上篇的《单片机(AT89C51)定时/计数器详解及其实验案例》由于各种原因里面没有实验案例现在在此补上。单片机(AT89C51)定时/计数器详解见上篇:案例分析总结了经常遇到的三种类型:已知8051单片机的fosc=12MHz用T1定时,试编程由...
2021-11-18 08:52:29
AT89C51单片机的P2端口接有8只LED
AT89C51单片机的P2端口接有8只LED,一、实验要求:在AT89C51单片机的P2端口接有8只LED,在外部中断0输入引脚P3.2接有一只按键开关K1。当按下K1触发外部中断,P2口高四位,低
2021-07-15 09:40:48
AT89C51单片机的电风扇控制系统设计流程图
AT89C51单片机的电风扇控制系统设计流程图仿真图AT89C51单片机的电风扇控制系统设计+流程图+仿真图摘 要:本文设计了以AT89C51为控制核心的温控电风扇系统。由温度传感器采集的温度信号
2021-09-08 06:52:10
单片机(AT89C51)外设的相关知识
还是熟悉的单片机(AT89C51)系列有需要的可以去看看我的单片机专栏,里面还有更多的关于单片机的知识。希望大佬们可以多多支持。前面要是关于单片机有不了解的可以看看我的专栏,链接给你们丢这里了:单片机专栏开始分享吧!!!目录题目解析方法一实验电路图实验代码...
2021-07-14 06:29:36
AT89S51/52单片机与AT89C51单片机的主要区别在哪
AT89S51/52单片机与AT89C51单片机的引脚功能有何不同?AT89S51/52单片机与AT89C51单片机的编程功能有何不同?
2021-11-09 06:42:34
【DIY单片机最小系统】自制AT89C51单片机最小系统
自己动手制作AT89C51单片机最小系统,加上复位键,功能比较简单。等买来材料自己动手做自己做的AT89C51单片机最小系统,大家给点看法原理图原理图 PCB封装,第一次手工布线,不是太好看PCB封装
2011-11-14 15:38:45
利用AT89C51系列单片机为CPU设计电路
单片机实验4实验内容利用AT89C51系列单片机为CPU,设计电路, 连接4位数码管,并连接两个按键,按第一个按键数码管显示值增加1,按另外一个按键数码管显示值减1。要求线路连接正确,包含晶振电路
2021-11-17 06:05:42
在Windows下实现PC机与单片机AT89C51的串行通信
使用Win32通信API函数来实现这些硬件的握手以及数据的传送。在89C51单片机系统中,分别从P3.0和P3.1引出串口线RXD和TXD通过专用的电平转换芯片转换成RS-232接口标准的电平,这样
2012-12-23 19:06:19
基于AT89C51单片机串口通信的程序设计
通信程序的设计通过本文你可以对AT89C51单片机串口通信的程序设计,有清晰的了解,有助学习单片机串口通信相关知识。基于AT89C51单片机串口通信的程序设计 [hide][/hide]
2011-11-03 17:09:54
基于AT89C51单片机的电子密码锁设计
总体设计本设计是基于AT89C51单片机的电子密码锁设计,实现电子密码锁的基本功能。器件选择序号器件编号Proteus器件名称器件性质参数及说明 1U1AT89C51单片机12MHz 2D1-D2LED.
2021-12-13 06:33:17
基于at89c51单片机的rs_232串行数据截取器设计
本帖最后由 eehome 于 2013-1-5 10:00 编辑
基于at89c51单片机的rs_232串行数据截取器设计
2012-08-14 11:32:01
基于单片机AT89C51的室内灯光控制系统
本文介绍了基于单片机AT89C51的室内灯光控制系统及其原理,提出了有效的节能控制方法。该系统采用了当今比较成熟的传感技术和计算机控制技术,利用多参数来实现对学校教室室内照明的控制。系统以单片
2021-11-19 07:48:02
基于单片机的AT89C51的直流电机PWM调速系统
基于单片机的AT89C51的直流电机PWM调速系统文章设计了以单片机AT89C51和L298控制的直流电机脉宽调制(PWM)调速系统。主要介绍了用单片机软件实现PWM调整电机转速的基本方法, 给出
2009-12-07 16:34:36
基于Visual Basic6.0下PC机与MCS-51单片机的串行通信
Visual Basic6.0编程环境下,利用Win32应用序接(WIN32 API)中的通信API开发了PC机串行通信程序,以MCS-51单片机控制板为实例给出了PC机与单片机通信的具体程序实例。
2011-03-05 13:05:15
如何利用AT89C2051单片机实现水温控制系统的设计
文末下载完整资料 基于单片机的水温控制系统设计 摘要: 本系统以AT89C51,AT89C2051单片机为核心,主要包括
2021-11-10 08:58:23
如何去实现一种基于AT89C51/52单片机的步进电机设计
单片机51—步进电机的设计1.主要功能本设计可采用STC89C51/52、AT89S51/52或AT89C51/52单片机作为主控制器;(1)按键功能:•按键1:正转•按键2:反转•按键3:速度加
2021-12-08 06:19:12
如何去完成AT89C51单片机点亮LED的实验
AT89C51单片机之点亮LED1、环境要求安装proteus(用来单片机仿真的)安装keli(用来生成单片机所需的HEX文件)2、proteus效果图如图所示,这里用了AT89C51芯片,分别
2021-11-18 08:32:42
常见的AT89C51单片机在哪呢
被microchip收购了,这种情况在你安装keil5时安装比较新版本的c51后出现,那么我们常见的AT89C51单片机在哪呢?我们可以看见有一个微芯(Microchip)公式的可选项,展之后就能看见51系列单片机了...
2021-12-01 06:17:27
常见的AT89C51单片机在哪?
被microchip收购了,这种情况在你安装keil5时安装比较新版本的c51后出现,那么我们常见的AT89C51单片机在哪呢?我们可以看见有一个微芯(Microchip)公式的可选项,展之后就能看见51系列单片机了...
2021-12-02 06:18:28
怎样去设计基于单片机(AT89C51)的进制转换及进制计算器
基于单片机(AT89C51)的进制转换及进制计算器闲来无事,用手头51单片机做个进制计算器成品功能:能实现十进制带负数、带小数点的加减乘除,不同进制之间的转换,同一进制之间的加减乘。材料
2021-11-19 07:42:28
浅析AT89C51、AT89S51和STC89C51的区别
标题AT89C51、AT89S51、STC89C51有什么区别?1、首先明确一点,这几个型号都属于51单片机,程序和电路是通用的;2、AT89C51是美国ATMEL公司生产的,下载程序需要专门的高压
2021-12-08 06:11:14
用AT89C51单片机怎么实现通过传感器传递信号给单片机,处理后驱动步进电机运停
请问一下,用AT89C51单片机怎么实现通过速度传感器传递信号给单片机,处理后驱动步进电机转动一定角度,然后停止,谢谢
2016-11-01 16:10:37
请教:51单片机与PC机串行通信
这是我画的51单片机与PC机串行通信的原理图,我想实现按下开关S2单片机向PC发送一个(或者一组数据),PC向单片机发送数据时可以在数码管上显示,程序怎么编写,编程不会,还有这个原理图有没有需要改动的地方,如果有做好的也可以发到我的邮箱:chenshengas@163.com 请各位指教谢谢了
2012-02-09 15:37:22
请问怎样去设计一种基于AT89C51单片机的智能大棚浇水系统?
AT89C51单片机是由哪些部分组成的?AT89C51单片机有哪些主要特性?怎样去设计一种基于AT89C51单片机的智能大棚浇水系统?
2021-07-07 07:24:01
基于AT89C51应用系统的串行通信设计
基于AT89C51应用系统的串行通信设计:介绍了基于AT89C51应用系统中的串行通信软硬件设计方法和实现过程,在基于红外成像技术的电力设备状态检测系统中,将红外测温仪检测到设
2009-11-13 23:06:3294
如何使用AT89C51的串口和电脑的串口进行通信原理与实验
如何使用AT89C51的串口和电脑的串口进行通信原理与实验
串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到电脑端,而
2008-10-14 13:15:176749
基于AT89C51应用系统的串行通信设计
基于AT89C51应用系统的串行通信设计
在红外成像技术的电力设备状态检测系统中,基于AT89C51单片机的应用系统,采用美国雷态公司的型号为3iLRL3的非
2009-09-13 16:33:331778
AT89C51单片机和PLC及PC机的通信
介绍了以226CPU作为下位机与Pc机(上位机)和多台AT89C51开发的仪表的串行通信.着重介绍了通信协议的设计及Pc机、PIE和单片机的通信程序初始设置和相关的程序流程.
2011-12-21 09:46:52406
AT89C51单片机
AT89C51单片机学习一、AT89S51单片机的I/O端口二、AT89S51单片机的中断系统 1、中断处理过程 2、AT89S51单片机的中断源(2)AT89S51单片机的中断控制
2021-11-12 12:21:0059
评论
查看更多