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); // 声明延时函数
uint count_s; // 发送计数
uint count_r; // 接收计数
uchar xdata send_buf[__MAX_LEN_]; // 设置发送缓冲区
uchar xdata recv_buf[__MAX_LEN_]; // 设置接收缓冲区
void main()
{
uint i;
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 232; // 设置初值
TL1 = 232;
TR1 = 1; // 开始计时
PCON = 0x80; // SMOD = 1
SCON = 0x50; //工作方式1,波特率2400bps,允许接收
ES = 1; // 开串口中断
EA = 1; // 允许中断
TI = 0;
P1 = 0xff; // 读P1口前应将其置位
for(i=0; i __MAX_LEN_) // 接收缓冲区已满,忽略已接收数据{
RI = 0;
return;
}
recv_buf[count_r] = SBUF; // 接受数据
count_r++; // 接收计数增1
RI = 0; // 清接收标志位
}
}
/* 延时10ms,精度较低,参数count为延时时间*/
void delay10ms(unsigned int count)
{
unsigned int i, k;
unsigned char j;
unsigned int tmp;
tmp = (int)((100*_MHZ_)/12);
for(i=0; i<count; i++)
for(j=0; j<100; j++)
for(k=0; k<tmp; k++);
}
三、结论
本文所介绍的AT89C51单片机与PC机的串行通信接口可靠性好,可行性强。
其硬件结构简单,PC机(上位机)VB6编程环境友好,界面灵活下位机。
AT89C51单片机可灵活的外界电路进行数据采集或实时控制,方便构建远程数据采集系统或控制系统。
参考文献:
[1]求是科技.单片机通信技术与工程实践[M],-北京:人民邮电出版社,2005.1.
[2]吴金戌等. 8051单片机实践与应用[M]-北京:清华大学出版社,2002.9.。