锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

如何实现(电脑)PC机与单片机AT89C51的串行通信

时间:2022-10-28 16:30:00 dcb连接器

在Windows95下使用串口API函数实现PC机与单片机AT89C51串口通信,重点介绍事件驱动的计算机I/O单片机串口中断发送和接收程序的方式函数编程。本文引用地址:http://www.eepw.com.cn/article/273495.htm

在基于单片机的数据采集和实时控制系统中,通过计算机RS-计算机与单片机之间的命令和数据传输可以使用计算机监控生产现场。在计算机上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通信系统提供了一个改进的串行应用程序接口SAPI用于交互串行通信。其中,串口和其他通信设备作为文件处理,串口的开启、关闭、读取和写入函数与操作文件函数相同。

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

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

其中,第1个参数szDevice要打开的串口逻辑名,如COM1或COM2;第2个参数fdwAccess大多数通信都是双向的,因此通常设置为:GENERICREAD|GENERICWRITE;第3个参数fdwShareMode指定串口的共享属性,串口不能共享,必须为0;第四个参数lpsa引用安全属性结构;第五个参数fdwCreate指定如果CreateFile现有文件调用时应该做什么?由于串口总是存在,因此必须将此参数设置为OPENEXISTING。第6个参数fdwAttrsAndFlags对于串口,唯一有意义的设置是描述端口的各种属性FILEFLAGOVERLAPPED,设置时指定端口I/O可在后台进行;最后一个参数hTemplateFile是指向模板文件的句柄,当端口打开时,该参数为NULL。

打开串口后,在Windows串口可在95下适当配置。Windows95提供了COMMPROP结构,COMMPROP如果串口连接到调制解调器,则该结构包括允许串口的设置,如波特率、数据位数、停止位数和奇偶校准方法等,COMMPROP结构还包括调制解调器支撑的设置。但COMMPROP结构只给出简单的信息,不能用来改变串口的设置。Windows通过改变95下串口设置的变化DCB实现结构,DCB结构包括所有串口的设置,包括硬件握手、流量控制等。

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

BOOLGetCommState(hComm,&dcb)

BOOLSetCommState(hComm,&dcb)

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

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

ReadFile(hComm,inbuff,nBytes,&nBytesRead,&overlapped)

WriteFile(hComm,outbuff,nBytes,&nBytesWrite,&overlapped)

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

读写端口可通过四种技术实现:查询、同步I/O、异步I/O(后台I/O)和事件驱动I/O。查询方法直接,易于理解,但占用了大量CPU时间;同步I/O直到读取指定的字节数或加时才返回,因此很容易长时间阻塞线程;异步I/O你可以在后台读写数据,在前台做其他事情;事件驱动I/O是由Windows95通知应用程序某些事件何时发生,然后根据发生的事件操作串口。

这四种不同的技术有自己的优缺点和应用领域,因此不同的技术可以根据不同的通信系统的不同要求使用。在监控系统中,由于事件的偶然性和所需传输的实时性,计算机通常使用事件驱动器I/O现场监测的方法。

在事件驱动I/O方式下,Windows函数报告给应用程序的事件GetCommMask可用于返回和改变返回事件SetCommMask这两个函数的调用如下:

GetCommMask(hComm,&dwMask)

SetCommMask(hComm,dwMask)

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

WaitCommEvent(hComm,&dwEvent,&overlapped)

第一个参数是打开串口的句柄,第二个参数是返回事件,第三个参数是指定的同步或异步操作。当函数返回时,可以根据返回的事件代码进行相应的串口操作。

通信完成后,串口应关闭,否则将始终打开,其他应用程序将无法打开或使用。关闭串口的函数为:CloseHandle(hComm),其中,hComm为打开串口句柄。

2 单片机下的通信编程

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

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

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

单片机的串行端口有一个数据寄存器SBUF,在一定条件下,寄存器共享发送和接收SBUF写入数据启动发送过程,读取SBUF接收过程开始了。

单片机可以通过循环或中断传输串行数据。在循环模式下,单片机循环数据寄存器SBUF读写实现数据的接收和发送;在中断模式下,1帧数据发送或接收后,TI/RI如果自动置1,请求串行中断CPU如果响应中断,则执行串行中断服务程序并处理TI/RI再次响应清0中断。接收方式2、3下,还应根据串口控制寄存器SCON只能确定设置RI串口是否中断,是否开放。

在实时控制中,由于事件的突发性,数据传输经常被中断,中断可以更大程度地提高资源的利用率,使CPU在不进行数据通信的情况下做其他工作。以下是单片机在方式1下的中断编程。

模式1是10位异步通信模式,包括1个起始位、8个数据位和1个停止位。波特率由定时器组成T寄存器的溢出率和串口控制SMOD状态确定,在CPU的晶振为11.0592MHz波特率通常为9600b/s。

对SBUF在发送移位时钟的同步下,可以通过写作操作启动发送TXD首先发送起始位,然后发送8位数据位,最后停止位。这样,发送1帧数据后,中断标志TI置位。

在允许接收的条件下(REN=1),当RXD当出现从1到0的负跳变时,它被视为串行发送的1帧数据的起始位置,从而启动一个接收过程。当接收到8位数据并检测到高电平停止位时,包含接收到的8位数据SBUF,置位RI,1帧数据的接收过程已经完成。

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

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章