AT89C51单片机与PC机串行通信的接口实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AT89C51单片机与PC机串行通信的接口实现[摘要] 本文介绍了AT89C51单片机与PC机采用RS232C标准进行串行通
信的接口实现。在接口中采用MAX232作电平转换电路,简单的通信协议,PC 机用VB编程,AT89C51单片机采用中断收发方式。文章给出了相应通信接口电路与程序。
[关键词] 通信协议RS232C 通信接口电路通信接口程序
AT89C51是一种带4K字节可编程可擦除只读存储器(FLASH FPEROM)和128字节的存取数据存储器(RAM)的低电压,高性能CMOS8位微处理器。采用了ATMEL公司的高密度、不容易丢失存储技术,与MCS-51系列的单片机兼容。具有集成程度高、系统结构简单、价格低廉等优点被广泛应用到控制领域中。但是在复杂的数据处理、良好的人机交互等方面不能满足需要,常采用PC 机与AT89C51单片机进行通信,AT89C51单片机(下位机)实时采集数据传送给PC机(上位机)处理,然后接收PC机处理的结果,并进行相应的控制的方式来弥补。本文介绍单片机与PC机进行串行通信的一种接口实现。
一、接口电路的设计
(一)接口逻辑电平的转换
在PC机系统大都装有异步通信适配器,为标准的RS-232C接口。RS-232C 为负逻辑,用+3V~+15V表示逻辑“0”, 用-3V~-15V表示逻辑“1”。AT89C51单片机采用正逻辑TTL电平0和+5V.所以AT89C51与PC机通信时必须进行电平转换。转换的方法有多种。常采用MAXIM公司生产的专用的双向电平转换集成电路MAX232。MAX232引脚排列与外围电路如图1所示。
图1MAX引脚及外围接口图
(二)通信接口电路
本文采用可靠性高的MAX232作电平转换芯片,选择其中一对发送器与接收器,PC机的串行口与MAX232的电平端口相连,MAX232的逻辑电平端口与单片机的串行口相连,接口电路如图2所示。
图2PC机与AT89C51通信接口图
二、通信接口程序
(一)通信协议
PC机与AT89C51进行通信必须有一定的通信协议,本文采用简单的通信
协议。波特率:2400bps;无奇偶校验位;8位数据位;1位停止位。
(二)PC机(上位机)通信程序
PC机(上位机)程序采用VB编写,主要是应用微软公司提供的MSComm 控件通信。在工程中建立通信窗口,添加文本框(接收框、发送框)、发送控件、MSComm控件并对它们的属性进行设置。部分程序如下:
初始化代码
Private Sub Form_Load()
mPort = 1 ’设置串口1
MSComm.Settings = “2400,N,8,1” ’波特率2400bps,无校验,8位数据,1位停止位
MSComm.InputLen = 0 ’读取接收缓冲区的所有字符
MSComm.InBufferSize = 1024 ’设置接收缓冲区为1024字节
MSComm.OutBufferSize = 512 ’设置发送缓冲区为512字节
MSComm.PortOpen = True’打开串口
MSComm.SThreshold = 0 ’不触发发送事件
MSComm.RThreshold = 1 ’每一个字符到接收缓冲区都触发接收事件
MSComm.InBufferCount = 0 ’清除发送缓冲区数据
MSComm.OutBufferCount = 0 ’清除接收缓冲区数据
Text_SEND.Text =““ ’清空发送文本框
Text_RECV.Text =““ ’清空接收文本框
End Sub
发送数据
Private Sub Button_SEND_Click()
Dim x As String
If Text_SEND.Text = ““ Then’发送数据不能为空
x = MsgBox(“发送数据不能为空”, 16)
Exit Sub
End If
If Not MSComm.PortOpen Then ’保证串口打开MSComm.PortOpen = True
End If
MSComm.Output = Text_SEND.Text + Chr$(13)’发送数据For i = 1 To 20000000’延时
Next
End Sub
接收数据
Private Sub MSComm_OnComm()
Select Case mEvent’检验串口事件
Case comEventOverrun’数据丢失
Text_SEND.Text =““’清空发送缓冲区
Text_RECV.Text =““’清空接收缓冲区
Text_SEND.SetFocus
Exit Sub
Case comEventRxOver’接收缓冲区溢出
Text_SEND.Text =““’清空发送缓冲区
Text_RECV.Text =““’清空接收缓冲区
Text_SEND.SetFocus
Exit Sub
Case comEventTxFull’发送缓冲区已满
Text_SEND.Text =““’清空发送缓冲区
Text_RECV.Text =““’清空接收缓冲区
Text_SEND.SetFocus
Exit Sub
Case comEvReceive’接收缓冲区内有数据
Dim str As String
str = MSComm.Input’从接收队列中读入字符串
Text_RECV.Text = Text_RECV.Textstr’读出字符串送显
End Select
End Sub
(三)AT89C51单片机(下位机)通信程序
AT89C51单片机采用中断方式向PC机发送数据和接收PC机数据,部分程序如下:
#include
#define __MAX_LEN_ 256 // 数据最大长度
#define _MHZ_ 12 // 设置单片机使用的晶振频率
#define uchar unsigned char
#define uint unsigned int
void delay10ms(uint count); // 声明延时函数