沈阳航空航天大学
课程设计
(论文)
题目 单片机与PC机RS-485的串行通信设计
班 级
学 号
学 生 姓 名
指 导 教 师
目 录
0 前言 1
1 总体方案设计 2
2 硬件电路设计 2
2.1 AT89C51单片机 2
2.2 时钟电路 4
2.3 按键复位电路 4
2.4 MAX485转换芯片 4
2.5 PC机RS-485 通信的接口电路 5
3 软件设计 6
4 调试分析 8
5 结论及进一步设想 8
参考文献 8
课设体会 10
附录1 电路原理图 11
附录2 程序清单 12
单片机与PC机RS-485串行通讯设计
摘要:本文提出了一种PC机与单片机进行串行通信的方案,该方案通过PC机的RS232串口、485总线实现与51单片机的串口通信,PC机送出的信号进行电平转换后送到485总线,单片机则接受MAX485芯片转换得到的信号,从而进行串行通信。该系统的特点是电路设计简单可行、通信稳定、实用性强。
关键词:PC机;单片机;串口通信;MAX485芯片;
0 前言
在计算机测控领域经常会采用一台PC 机与一个或多个单片机组成小型的测控网络, 这种测控系统充分发挥了单片机功能强, 抗干扰性能好, 温度适应范围宽,面向控制的优点, 同时又可以利用计算机弥补单片机在数据处理和交互性等方面的不足。在测控系统中一般是以PC 机作为主控机,采用串行通讯定时扫描以单片机为核心的智能控制器(从机) 以便采集数据或发送信号。PC机的串口一般采用RS—232的总线标准,但由于RS—232接口标准发布较早,难免有不足之处,主要体现在以下四点:1、接口信号的电平值较高,已损坏接口电路芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接;2、传送速率较低,在异步传送时,波特率为20Kbps;3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;4、传输距离有限,最大传输距离标准为50英尺,实际上也只能用在50m左右。
针对RS-232的不足, 于是先后又出现了一些新的接口标准RS-485 就是其中之一。RS—485总线标准是美国电气工业协会(EIA)公布的平衡电压数字接口电路的电气性能标准,是为改善RS-232标准的电气特性,又参考RS-232兼容而制定的。RS-485标准与RS-232标准相比具有以下优点:1、RS-485的电气性能:逻辑“1”以两线间的电压差为+(0.2-6)V表示;逻辑“0”以两线间的电压差为-(0.2-6)V表示。接口信号电平比RS-232降低了,就不易损坏接口电路芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。2、RS-485的数据最高传送速率为10Mbps。3、RS-485接口是采用平衡驱动器和和差分接收器的组合,抗共模干扰能力强,抗噪声干扰性好。4、RS-485最大的通信距离约为1219m,传输速率与传输距离成反比,在100kb/s的传输速率下才可以达到最大的通信距离,如需传输更长的距离,需加485中继器。RS-485总线最大支持32节点。由于RS-485接口具有良好的抗干扰性,较长的传输距离和多站通信能力等优点,使其成为首选的串行接口。RS-485接口组成的半双工网络,一般只需两根连线,所以RS-485总线接口均采用双绞线传输。
1 总体方案设计
针对本课题的设计任务,进行分析得到:本次设计用RS-485标准进行单片机与PC机的串行通信,PC机发出的数据经过RS-232/485转化器后发送,再经过单片机端的MAX485芯片把信号转换成TTL电平送给单片机,单片机接收到PC机发来的数据后再回送给PC机。
该串行通信系统设计,在总体上大致可分为以下几个部分组成:1、RS-232/RS-485转换电路,TTL电平转换芯片,单片机最小系统。系统原理框图如图1所示。
图1 系统原理框图
2 硬件电路设计
2.1 单片机介绍
图2 AT89C51
引脚说明
VCC:接+5V电压,
GND:接信号地。
I/O口部分
P0口:(P0.0~P0.7)P0口为一个8位双向I/O口,在不接片外存储器和不扩展I/O口时,可作为准双向输入/输出口。在接片外存储器或扩展I/O口时,P0口分时复用为地8位地址总线和双向数据总线。
P1口:(P1.0~P1.7)P1口是一个8位双向I/O口。
P2口:(P2.0~P2.7)P2口为8位准双向I/O口,在接有片外存储器或扩展I/O口且寻址范围超过256B时,P2口用作高8位地址总线。
P3口:(P3.0~P3.7)P3口是一个8位双向I/O口。它还有第二功能如表1所示。
表1 P3口第二功能表
管脚
第二功能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0)
P3.3
(外部中断1)
P3.4
T0(定时/计数器0计数脉冲输入端)
P3.5
T1(定时/计数器1计数脉冲输入端)
P3.6
(外部数据存储器写选通信号输出端)
P3.7
(外部数据存储器读选通信号输出端)
控制与复位部分
RST:复位信号。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。
ALE/:地址锁存允许输出。当访问外部程序存储器或数据存储器时,ALE输出脉冲用于锁存地址的低8位字节。一般情况下,ALE仍以时钟振荡频率的1/6输出固定的脉冲信号,因此它可对外输出时钟或用于定时目的。
:外部程序存储器的选通信号。当读外部ROM时,有效,实现从片外程序存储器的读操作。
/V:为片外程序存储器选用端。当保持低电平时,只选用片外部程序存储器。否则,单片机上电或复位后选用片内程序存储器。
外接晶振部分
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:反向振荡器的输出。
2.2 时钟电路
图3 时钟电路
外接晶振X1以及电容C1、C2构成并联谐振电路,内部振荡器产生自激振荡,一般晶振可在2~12MHz之间任选,本系统选用的晶振频率为12MHz。对外接电容值虽然没有严格的要求,但电容的大小多少会影响振荡频率的高低、振荡器的稳定性、起振的快速性和温度的稳定性,根据经验本系统所接电容C1、C2为22pF如图3所示。
2.3 按键复位电路
图4 复位电路
上电自动复位是通过给电容充电进而给RST引脚一个高电平信号,此信号随着VCC对电容C的充电过程而逐渐回落,即RST引脚上的高电平持续时间取决于电容C充电时间,为保证系统可靠复位,RST引脚上的高电平必须维持足够长的时间,按键复位由此产生,当按下复位按钮,电容对R1迅速放电,RST端变为高电平,按钮松开后,电容通过电阻R2进行充电,使RST端恢复低电平,本系统采用按键复位电路如图4所示。
2.4 MAX485转换芯片
图5 MAX485芯片
MAX485接口芯片是Maxim公司的一种RS-485芯MAX485是专用于RS-485 通讯的小功率收发器, 它采用8 脚DIP/SO 封装, 内含一个驱动器和一个发送器。其驱动器采用限斜率设计, 这样可以将电磁干扰(EMI)减至最小,并减小因电缆不匹配而产生的影响, 因此, 能够以高达250kb/s 的速率无误差地传送数据。当RE为低电平时,MAX485数据输入有效;当DE为高电平时,MAX485数据输出有效。在半双工使用中,通常可以将这两个脚直接相连,然后由PC或者单片机输出的高低电平就使MAX485在接收和发送状态之间转换了。MAX485芯片采用单一电源+5 V工作,额定电流为300 μA,采用半双工通讯方式。A端和B端分别为接收和发送的差分信号端,当A引脚的电平高于B时,代表发送的数据为1;当A的电平低于B端时,代表发送的数据为0。在与单片机连接时接线非常简单,只需要一个信号控制MAX485的接收和发送即可,同时将A和B端之间加匹配电阻,一般可选100Ω的电阻。
2.5 PC 机RS-485 通信的接口电路
图6 PC 机RS-485通信的接口电路
在上图中,MAX485是通过两个引脚RE(2脚)和DE(3脚)来控制数据的输入和输出。当RE为低电平时,MAX485数据输入有效;当DE为高电平时,MAX485数据输出有效。在半双工使用中,通常可以将这两个引脚直接相连,然后由PC或者单片机输出的高低电平就可以让MAX485在接收和发送状态之间转换了。本电路使用TX线和MAX232的另外一个通道来控制MAX485的状态切换。平时MAX232的9脚输出低电平,使MAX485的RE和DE为低电平而处于数据接收状态。当PC机发送数据时,MAX232的9脚输出高电平,使MAX485的RE和DE为高电平而处于数据发送状态。
3 软件设计
89C51单片机是本次设计的核心部分,所有的程序都将写入到单片机里。在本次的设计中,单片机的在电路中的主要目的就是对PC机发来的的数据在回送给pc机,在串口调试助手中显示,其中数据的流向是通过单片机控制MAX485芯片来实现的。
设计单片机通信程序时,必须充分发挥单片机的效率,由于单片机多应用于实时性较强的控制场合,因此, 应将及时响应和控制对象的动作放在优先考虑的位置,以尽量减少通信等辅助性操作所占用的CPU时间。基于上述考虑,在设计单片机通信程序时,将通信程序分为发送处理程序、接收中断处理程序,从而构成整个单片机的通信程序。当系统上电后,单片机程序初始化芯片的端口及变量初始化赋值, 串口中断发生时,自动进入中断服务程序,其主程序的流程图如图7所示。
N
Y
图7 系统主程序流图
当程序写好后,通过烧写器完成程序的调试工作,然后就是用串口线将实验板和PC机相连起来,同时给实验板接上电源,然后就是通过PC机软件来发数据了,要在PC机上向串口发送数据一定要借助相应软件,串口调试软件,它设置方便、灵活,界面简洁明。串口调试助手支持常用的300bps~115200bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进制接收或发送任何数据或字符。
为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用计算机串口调试软件来观察如图8所示。
图8 串口调试软件
这里我们需要设置一下串口通讯的参数,将波特率调整为9600,串口选择为COM1,校验位:无;数据位:8位;停止位:1位;当然AT89C51单片机实验板的串口也要和电脑的COM1连接,将烧写程序的单片机插入单片机实验板的万能插座中,并接通AT89C51单片机实验板的电源这样就可以实现PC机与单片机的串口通信了。
4 调试分析
PC机的串口调试助手无任何显示。这是因为烧写的程序出现了错误,应在发送程序中把TI清零。
PC机的串口调试助手出现乱码,不能正确的收到单片机发送的字符。这是因为选取的波特率不匹配,或控制MAX485芯片的单片机引脚发出的控制命令时间太短,芯片来不及转换状态,解决方法是选择相匹配的波特率,适当增加延时函数。
5 结论及进一步设想
根据实验结果,本设计基本完成了设计要求,但由于系统存在内部和外部的各种电气干扰、焊接硬件时的不牢固、外部环境条件等影响,数据流可能会有误码,严重时可能会使控制状态失灵。如果时间允许我会自己设计一个PCB板来承载各种元件,这样元件连接的靠性就会大大增加,出错的概率也会减少。
参考文献
[1] 刘复华.单片机及其应用系统.北京:清华大学出版社,1992
[2] 李朝青.PC机及单片机数据通信技术[M],北京航空航天大学出版社,2002
[3] 王仲文.精通串行口通讯[M] ,北京电子工业出版社,1995
[4] 李华.MCS-51系列单片机实用接口技术[J],北京航空航天大学出版社,1993
[5] 李响初.数字电路基础与应用[M],机械工业出版社,2008
课设体会
经过一段时间的收集资料,我的课程设计终于完成,看着自己的成果,有说不出的感触。通过这段时间的努力,对我这学期的学习有了系统的总结。
本设计利用AT89C52单片机串行口,实现与PC机通讯。本设计中包括了单片机通讯的编制,串行通讯的硬件环境,数据格式的协议,数据交换的协议等多方面的知识,在这个单片机串行口与PC机通讯设计中,用一个相对简单的实验来实现这个功能。其次,在连接各个模块编译程序的时候一定要注意各个变量的定义和功能,因为每个定义和功能不一样的,会影响实验结果,再者就是程序需规范化,语法不能出错,编译才能通过,试验才能成功。
在测试通讯时,遇到了很多的困难,想要的结果总是不能正确的显示,后来,在多次的修改程序,调试电路之后,才发现是因为延时函数的时间太长了。经过屡次调试,终于找到了比较合适的输入数值,终于成功了。通过此实验,让我看到了自己的水平和差距,虽然我有还很多不足,但是在我的努力下,弥补了我的缺憾。此次学习使我受益匪浅。从中学到很多以前没有接触到的知识,及其解决办法和一些程序的设计方法。增加了自己在编程方面的功底。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。同时让我学会了分析问题、处理问题的方法,可以说达到了举一反三的目的,为以后工作、学习都打下了坚实的基础。
[2013年7月 12日完成]
附录1 电路原理图
附录2 程序清单
#include <REG52.H>
#include <stdio.h>
sbit RE=P2^7; //定义485的使能脚
sbit DE=P2^6;
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void)
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD= 0x20; //定时器1工作方式2
TH1 = 0xFD; // 波特率9600、数据位8、停止位1。效验位无 (12M)
TL1 = 0xFD;
TR1 = 1; //开定时器
ES = 1; //开串口中断
EA = 1; // 开总中断
while(1)
{
if (SendFlag==1) // max485(半双工通信) RE/DE定义 RE=0为接受状态 DE=1为发送状态
{ RE=1; // DE=1为发送状态
DE=1;
SBUF=SenData; //发送数据
delay(50);
}
else
{
RE=0; //接收状态
DE=0;
}
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 //4为中断号
{
if(TI == 1)
{
TI = 0; //发送中断标志位置零
SendFlag = 0;
}
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
SendFlag = 1;
}
}
|