资源描述
g
专业课程设计报告
题 目:
基于RS-485的单片机通信系统设计(发送端)
姓 名:
刘张
专 业:
通信工程
班级学号:
09042218
同 组人 :
09042219 彭林
指导教师:
张小林
南昌航空大学信息工程学院
2012 年 06 月 28 日
专业 课程设计任务书
20 11-20 12 学年 第 2 学期 第 17 周- 20 周
题目
基于RS-485的单片机通信系统设计(发送端)
内容及要求
1.利用RS485实现单片机的双向通讯;
2.通过键盘实现从机的选择、发送数据的输入;
3.主机显示发送的数据及从机编号。
4提高要求:通过键盘实现循环工作模式、指定从机这2种工作方式的切换。
进度安排
17周:查找资料,进行系统硬件设计、软件方案设计;
18周:硬件制作、软件的分模块调试;
19周:系统联调;
20周:设计结果验收,报告初稿的撰写。
学生姓名:09042218 刘张 09042219 彭林
指导时间:周一、周三、周五
指导地点:E楼 610 室
任务下达
2012年 6 月 1 日
任务完成
20 12年 6月 30 日
考核方式
1.评阅 □ 2.答辩 □ 3.实际操作□ 4.其它□
指导教师
张小林
系(部)主任
注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查
2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。
摘要
串口通信是一种广泛应用于各个领域的通信方式,在远距离数据传输和控制系统中,可以根据RS-485协议实现数据远距离传输。
本设计即是利用MAX485芯片实现半双工串行口通信的双向通信系统。系统主要由主机控制模块、通信模块、数据输入模块和数据显示模块四个部分构成,实现了利用RS485实现单片机的双向通讯,通过键盘实现从机的选择、发送数据的输入,主机显示发送的数据及从机编号,通过键盘实现循环工作模式、指定从机这2种工作方式的切换。
该系统具有使用方便、操作简单、结构简单、成本低、可靠性高、可扩展性强、易于维护等特点,在实际生活中有广泛的应用前景。
关键字:RS-485协议、双向通信、MAX485
目录
前言..............................................................5
第一章 系统总体方案................................................6
系统总体框图设计.............................................6
系统框图..............................................6
第二章 系统具体设计及硬件设计
2.1 主机控制模块.................................................6
2.1.1 系统主芯片选择........................................6
2.1.2 复位电路...............................................7
2.1.3 时钟电路...............................................7
2.2 通信模块.....................................................8
2.2.1 通信芯片选择...........................................8
2.2.2 通信电路 ..............................................8
2. 3数据输入模块.................................................9
2.4 数据显示模块.................................................9
第三章 软件设计...................................................11
3.1 系统总流程图................................................11
3.1.1 程序流程图............................................12
第四章 硬件调试与分析.............................................16
4.1 实验调试仪器..............................................16
4.2 各个子系统模块调试........................................16
4.2.1 握手信号发送模块调试..................................16
4.2.2 接收数据与拒绝接收数据模块调试........................17
4.2.3 发送数据与接收数据模块调试............................17
第五章 总结与体会................................................19 参考文献..........................................................20
附录一:总原理图..................................................20
附录二:源程序代码................................................21
前 言
在以单片机为基础的数据采集和实时控制系统中,通过计算机中的RS-232接口进行计算机与单片机之间的命令和数据传送,就可以对生产现场进行监测和控制。由于计算机上的RS-232所传送的距离不超过30m,所以在远距离数据传送和控制时,可以利用MAX485的接口转换芯片将RS-232协议转换成RS-485协议进行远距离传送。
RS-232是一个最初用于调制解调器、打印机及其它PC外设的通讯标准,提供单端20kbps的波特率,后来速率提高至1Mbps。RS-232的其它技术指标包括:标称±5V发送电平、±3V接收电平(间隔/符号)、2V共模抑制、2200pF最大电缆负载电容、300最大驱动器输出电阻、3k最小接收器(负载)阻抗、100英尺(典型值)最大电缆长度。RS-232只用于点对点通信系统,不能用于多点通信系统,所有RS-232系统都必须遵从这些限制。
RS-485是双向、半双工通信协议,允许多个驱动器和接收器挂接在总线上,其中每个驱动器都能够脱离总线。接收器输入灵敏度为±200mV,这就意味着若要识别符号或间隔状态,接收端电压必须高于+200mV或低于-200mV。最小接收器输入阻抗为12k,驱动器输出电压为±1.5V (最小值)、±5V (最大值)。
驱动器能够驱动32个单位负载,即允许总线上并联32个12k的接收器。RS-485接收器可随意组合,连接至同一总线,但要保证这些电路的实际并联阻抗不高于32个单位负载(375)。
采用典型的24AWG双绞线时,驱动器负载阻抗的最大值为54,即32个单位负载并联2个120终端匹配电阻。RS-485已经成为POS、工业以及电信应用中的最佳选择。较宽的共模范围可实现长电缆、嘈杂环境(如工厂车间)下的数据传输。更高的接收器输入阻抗还允许总线上挂接更多器件。
第一章 系统总体方案
系统总体框图设计
系统框图
系统框图如下:
通信主机
数据显示
通信模块
数据输入
图2-1 系统原理框图
在本系统中,通信主机是核心部分,主要完成对数据的处理、操作和运算;数据输入模块主要完成数据的输入,所有人机交换的数据都从该模块中输入;数据显示模块完成了通信双方数据的显示;通信模块即完成数据的接收与发送,实现数据远距离传输。
数据从数据输入模块输入,经通信主机处理后发送给通信从机,通信从机接收到数据后显示在相应的模块上。
第二章 系统具体设计及硬件设计
2.1 主机控制模块
2.1.1 系统主芯片选择
系统主芯片是本系统的核心芯片,由于系统要求芯片能灵活处理所传输的数据,且性能稳定,价格低廉,因此需选择一个合适的芯片。
STC89C52是一个低功耗,高性能CMOS 8位单片机,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的它为许多嵌入式控制通信系统提供了高性价比的解决方案。
STC89C52具有如下特点:8k Bytes Flash片内程序存储器,128 bytes的随机数据存储器(RAM),32个外部双向输入/输出(I/O)口,5个中断优先级2层中断嵌套中断,2个16位可编程定时计数器和2个全双工串行通信口,而且价格低廉,市场运用很普遍,因此采用它作为系统的主芯片即可进行灵活的控制。
2.1.2 复位和时钟电路
复位时钟电路如下图:
图2-3 复位时钟电路
主芯片的RST复位引脚是高电平有效的。高电平有效的持续时间应为24个振荡周期以上。若时钟频率为12MHz,则复位信号至少应持续2us以上才可以复位单片机。只要该引脚保持高电平,芯片便循环复位。当RST端由高变低后,程序指针由ROM的0000H开始执行程序。它的复位操作不影响内部RAM的内容。当Vcc加电后,RAM的内容是随机的。
此外主芯片的复位方式有上电复位和手工复位两种。只要Vcc上升时间不超过1ms,通过在Vcc和RST引脚之间加一个10uF的电容和一个1KΩ,
由延时常数 Т=R*C=1KΩ*10uF=1ms
可知,当系统上电后即可完成复位。
时钟电路是给通信主机提供正常工作时序所必不可缺的部分,主机只有在统一的时序下才能进行正常的工作。主芯片内部由一个反相放大器构成振荡器,可以由它产生时钟。时钟可以由两种方式产生,即内部方式和外部方式。图2-3给出的是外部方式。Fosc可在1.2~12MHz之间选择,为方便计算,选取晶振频率fosc=12MHz,可以得到机器周期为:T=1/fosc=1us。电容对频率有微调作用,因此小电容取值为20pF。
2.2 通信模块
2.2.1 通信芯片的选择
MAX485接口芯片是Maxim公司的一种RS-485芯片。RS-485是美国电气工业联合会(EIA)制定的利用平衡双绞线作传输线的多点通讯标准。它采用差分信号进行传输;最大传输距离可以达到1.2 km;最大可连接32个驱动器和收发器;接收器最小灵敏度可达±200 mV;最大传输速率可达2.5 Mb/s。由此可见,RS-485协议正是针对远距离、高灵敏度、多点通讯制定的标准。
MAX485芯片采用单一电源+5 V工作,额定电流为300 μA,采用半双工通讯方式。它完成将TTL电平转换为RS-485电平的功能。MAX485芯片的结构和引脚都非常简单,内部含有一个驱动器和接收器。RO和DI端分别为接收器的输出和驱动器的输入端,与单片机连接时只需分别与单片机的RXD和TXD相连即可/RE和DE端分别为接收和发送的使能端,因为MAX485工作在半双工状态,所以只需要一个信号控制MAX485的接收和发送即可。因此本模块采用MAX485芯片即可满足远距离通信的性能指标。
RS485通信协议:
典型的串行通讯标准是RS232和RS485,它们定义了电压阻抗等,但不对软件对协议给予定义,区别于RS232, RS485的特性包括:
1.RS485的电气特性:逻辑“1”以两线间的电压差为+(2—6)V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比RS—232—C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL 电路连接。
2. RS-485的数据最高传输速率为10Mbps 。
3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。
4. RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米(理论上的数据,在实际操作中,极限距离仅达1200米左右),另外RS-232-C接口在总线上只允许连接1个收发器,即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。
因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。因为RS485接口组成的半双工网络一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)
2.2.2 通信电路
通信模块电路如下:
图2-4 通信模块电路
MAX485的RO和DI引脚分别和单片机的RXD和TXD相连接,/RE和DE受单片机P1.0的控制,当P1.0=1是,MAX485发送数据,当P1.0=0是MAX485接收数据,主机和从机都是按照如图所示的电路进行通信的,为了减少信息传输时的错误,主从机都使用相同频率的晶振,设置主从机相同的波特率。
2.3 数据输入模块
矩阵式键盘,矩阵式键盘稳定,其突出优点是占用I/O口少,I/O端口利用率高,可循环操作,而且扫描键盘时占用CPU时间少,操作灵活,方便。由设计要求可知系统需求能控制多状态而且利用率高的键盘,因此综合以上要求此模块采用矩阵式键盘。
2.4 数据显示模块
采用八段共阴极数码管显示,利用HD7279进行驱动,性能稳定,操作简单。HD7279是一片具有串行接口的可同时驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成显示键盘接口的全部功能。由于系统要求传输的只是简单的数据,因此采用数码管显示即可满足指标要求。
第三章 软件设计
3.1 系统总流程图
多机双向通信的软件设计主要分为:系统初始化、确定主从机关系、双方进行握手、不接收主机数据、主机发送数据和从机接收数据等六大部分;每个功能模块对于通信双方都是必不可缺的,只有这样主机才能很好的对外部的信息进行采集、分析和解决。
1.系统初始化:系统初始化包括串口初始化和显示模块初始化。主要实现串口中断的开启、总中断的开启、定时器的选择及其工作方式的选择、串行口工作方式的选择和显示模块初始化等功能。
2.有键按下:通信双方进行通信时需确定双方的主从关系,然后通过键盘按下,显示所传输的数据。
3.键值处理:在该部分中,通信主机会发送握手信号给从机,主机发送的数据通过处理再传输给从机
4.送显数据:所发送的数据通过处理之后再发送给从机。
5.关闭显示:从机显示数据完毕之后需要关闭显示不再传输数据和显示数据。
6.从机接收数据:此部分功能较简单,只需完成从机不断的接收主机发送的数据的即可。
3.1.1 程序流程图:
开 始
初始化
有键按下
Y
键值处理
送 显
发 送
图3-1 主机程序流程图
本系统程序主要有:初始化,键盘发送,键盘处理,送显,关闭显示等五个部分。
1. 初始化:该部分主要是串行口初始化,16位定时器初始化和中断初始化三部分的功能,具体实现如下:
void init()//初始化子程序
{
TMOD=0x20; //设置定时器1为工作方式2,8位自动重装
TH1=0xe8; //赋计数初值,对应定时26us
TL1=0xe8;
TR1=1; //T1中断开启
EA=1; //总中断开启
REN=1; //串行接收允许
SM0=0; //串行通信方式选择方式1,10位异步收发,由定时器控制波特率
SM1=1;
}
第四章 硬件调试与分析
4.1 实验调试仪器
调试过程中运用到的实验仪器主要有:
1. 微机一台,串行接口线一根;
2. 单片机仿真机一块;
3. 工具箱一个;
4. 5V稳压电源一个;
4.2 各个子系统模块调试
4.2.1 握手信号发送模块调试
系统上电后,通信双方1机2机第1位都点亮,且为闪烁状态,说明初始化部分正常,如图6所示。然后按下1机的发送2键,在1机的第1位都显示数字“2”,说明有发送键按下,在2机第1位数码管都显示数字“2”,说明接收到了1机的握手信号,然后2机按下接收数据1键,在1机的数码管第4位上显示数字“2”,说明接收到了2机,至此握手信号模块全部工作正常,且系统稳定,说明该模块功能实现成功。
图4-1 1机作为主机发送数据2给2机
图4-2 接通电源两单片机都显示0初始化正常
4.2.2 接收数据与拒绝接收数据模块调试
先对系统进行复位,重复以上操作至1机发送握手信号后,如果2机不接收数据1,按下2机的不接收1键,刚开始数码管关闭一下,后又闪烁,且为乱码,说明此部分系统工作不正常,经过检查程序,发现原来缺少了while(1)循环语句,因此数码管关闭一下后又亮了,重新编辑软件,加上了while(1)大循环,在进行系统测试,重新按下不接收1键,数码管全部关闭,如图8所示,再进行其他的测试,数码管还是关闭,说明找到了问题的症结所在,并解决了问题。至此此部分调试完毕。
图 4-3 2机不接收1机的数据
4.2.3 发送数据与接收数据模块调试
重复第一次的步骤后,在握手完成后按下1机的发送数据键,2机接收到了1机数据,且没有错误。
再重复所有步骤,再测试当2机为主机,系统都按照设计的情况运行说明系统工作正常。至此,系统调试全部完成,圆满完成设计任务。
图4-4 1机作为主机发送“6”给2机 图4-5 2机作为主机发送“9”给1机
第五章 总结与体会
本次设计主要基于RS-485协议,设计了一个基于RS485单片机通信系统的发送端,并和另一组搭档完成接收端和发送端的连接发送和接收。完成了双机通信机之间的双向通信、控制和操作,实现了可通过键盘控制从机的选择,主机数据的输入和数据的实时显示等功能。硬件系统主要由主机控制模块、数据输入模块、数据显示模块和数据传输模块四部分构成,软件系统则基于硬件进行相应的设计。该通信系统具有操作简单、结构简单、可靠性高、可扩展性强等特点,在实际生活中有广泛的应用前景。
此次课程设计,主要包括硬件制作和软件设计两大部分。在硬件制作过程中的最为关键的是电路板的焊接,需要认真小心,在焊制的过程中要避免节点之间的短路情况。软件设计过程中需要不停地编译来确定是否有语法上的错误,在确定没有错误之后再下载到单片机中,然后再进行调试,这些过程需要有高度的耐心和仔细,否则容易发生错误。此系统设计突出了软件设计的灵活、方便和功能强大等优点,从设计开始至最终结束,软件部分设计一直是一个至关重要的环节,其重要性在此次课程设计中体现的淋漓尽致。在本系统中,该部分设计相对来说不是很理想,在语句功能的实现方面有点繁琐,由于设计时是利用P1^0口进行控制MAX485芯片的使能端,且涉及到多机通信,因此C语句相对来说较多,也说明直接用P1^0口控制并不是很简便,后来发现若采用中断方式进行控制,程序就会变得更加精炼,简洁,今后若还有机会一定要尝试着利用单片机自身的中断进行控制。
在设计过程中锻炼了自己的动手焊接制作能力,培养了自己的耐心,细心和团队协作的能力。软件设计让自己对程序设计又有了一个新的认识和提高,对C语言有了一个全新的认识和学习,让自己更加清醒的认识到了C语言程序设计的重要性。
参考文献
[1] 谭浩强. C程序设计.北京:清华大学出版社,2009.
[2] 张先庭.单片机原理、接口与C51应用程序设计.北京:国防工业出版社,2011.
[3] 杨子文.单片机原理及应用.西安:西安电子科技大学出版社,2006.
[4] 张友德.单片微型机原理、应用与实验.上海:复旦大学出版社,2006.
[5] 陈志旺.51系列单片机系统设计与实践.北京:电子工业出版社,2010.
[6] 马忠梅.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,2003.
附录一:总原理图
附录二:源程序代码
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define cmd_reset 0xa4//7279复位指令
#define decode1 0xc8//下载且按方式1译码,0~F译码 指令
#define cmd_read 0x15//读键盘数据指令
#define uncode 0x90//下载数据但不译码指令
#define xiao 0x98//消影控制指令1显示,0消影
#define segon 0xe0//段开启指令
#define shan 0x88//闪烁控制指令0闪烁,1不闪烁
void long_delay(void);// 长延时
void short_delay(void);// 短暂延时
void delay10ms(uchar);// 延时10ms
void write7279(uchar, uchar);// 写入到HD7279
uchar read7279(uchar);// 从HD7279读出
void send_byte(uchar);// 发送一个字节
uchar receive_byte(void);// 接收一个字节
uchar get_key_number(uchar);//键盘转换子程序
void fasong11(void);//1发送数据1给2
void fasong22(void);//2发送数据2给1
void bujie1(void);//不接收1的数据
void bujie2(void);//不接收2的数据
void jieshou12(void);//1接收2的握手信号,返回1
void jieshou21(void);//2接收1的握手信号,返回2
void init(void);//初始化程序
sbit cs=P1^4;// 7279cs 接于 P1.4
sbit clk=P1^3;// 7279clk 连接于 P1.3
sbit dat=P1^2;// 7279dat 连接于 P1.2
sbit key=P1^1;// 7279key 连接于 P1.1
sbit rs=P3^0; //接收端接于P3.0
sbit ts=P3^1;//发送端接于P3.1
sbit controlmax=P1^0;//MAX芯片使能端控制口
uchar key_code[]={0x1c,0x1d,0x1e,0x1f,0x14,0x15,0x16,0x17,0x0c,0x0d,0x0e,0x0f,
0x04,0x05,0x06,0x07}; //键值表
uchar key_number;
void main()//主程序
{
uint i;
uchar a,m;
for (i=0;i<0x2000;i++);// 上电延时
send_byte(cmd_reset);// 复位HD7279A
init();//一开始先进行接收数据
controlmax=0; //接收握手信号
RI=0;
while(1)
{
if(!key)//进行按键判断,有键按下时key位低电平,进入循环
{
key_number=read7279(cmd_read);// 读出键码
m=get_key_number(key_number);
switch(key_number)//控制按键选择
{
case 0x1c:fasong11();break;//1发送1给2 case 0x1d:jieshou12();break;//1接收2的握手信号,返回 1
case 0x14:jieshou21();break;//2接收1的握手信号,返回2
case 0x15:fasong22();break;//2发送2给1
case 0x04:bujie1();break;//不接收1的数据
case 0x05:bujie2();break;//不接收2的数据
default :write7279(uncode,0xff);break;
}
}
else
{
write7279(shan,0xc0);//刚开始的数据显示在第1位,程序初始化
a=SBUF;
a=a&0xff;
write7279(uncode,a);//在第1位上显示接收到的数据
}
}
}
void fasong11(void)//1发送1给2?
{
uchar m,j;
init();
controlmax=1; //打开发送使能端
TI=0; //打开发送中断
SBUF=0x30;//发送1给2
write7279(uncode,0x30); //把1显示在第1位上
while (!TI);//如果没发送完,那么继续等待
TI=0;
while(1)
{
controlmax=0; //打开接收使能端,接收握手信号
RI=0;
while (!RI);
RI=0;
while(1)
{
j=SBUF;
delay10ms(0x100);
switch(j)//接收到的数据进行判断,显示在相应的位置上
{
case 0x6d:write7279(uncode+3,j);break;//若接收到2返回的握手信号,则放在第4位
default :write7279(uncode+7,0xff);break;//否则点亮第8位数码管,提示握手失败,从发数据
}
if (!key)// 如果有键按下,则kye为低电平
{
write7279(xiao,0xd5);
init();
controlmax=1; //设置MAX485发送使能端有效
write7279(shan,0xff);
key_number=read7279(cmd_read);// 读出键码
m=get_key_number(key_number);
SBUF=key_number;
TI=0; //开启发送中断
while (!TI); //如果没发送完,那么继续等待
TI=0;
delay10ms(0x10);
write7279(decode1,m);//在第1位上显示发送的数据
}
}
}
}
void jieshou12(void)//1接收2的握手信号,返回1
{
uchar b;
init();
controlmax=1;
SBUF=0x30;//接收到握手信号,返回1
TI=0;
while(!TI);
TI=0;
write7279(uncode+3,0x30);//把1显示在第4位上
delay10ms(0x100);
controlmax=0;
RI=0;//接收中断开启
while(!RI);//如果没收到,继续等待
RI=0;
write7279(xiao,0x0c);
while(1)
{
controlmax=0;
RI=0;//接收中断开启
while(!RI);//如果没收到,继续等待
RI=0;
write7279(shan,0x04);//设置第三位不闪烁
write7279(xiao,0x04);//只显示第三位
b=SBUF;
write7279(decode1+2,get_key_number(b));//把接收到的数据显示在第3位上
}
}
void jieshou21(void)//2接收1的握手信号,返回2
{
uchar b;
init();
controlmax=1;
SBUF=0x6d;//2接收到握手信号,返回2
TI=0;
while(!TI);
TI=0;
write7279(uncode+1,0x6d);
delay10ms(0x20);
controlmax=0;
RI=0;//接收中断开启
while(!RI);//如果没收到,继续等待
RI=0;
write7279(xiao,0x03);
while(1)
{
controlmax=0;
RI=0;//接收中断开启
while(!RI);//如果没收到,继续等待
RI=0;
write7279(shan,0xc1);
write7279(xiao,0x01);
b=SBUF;
write7279(decode1,get_key_number(b));// 把接收到主机1的数据显示在第1位
}
}
void fasong22(void)//2发数据2给1,
{
uchar m,j;
init();
controlmax=1; //设置MAX485发送使能端有效
TI=0; //开启发送中断
SBUF=0x6d;//发送2给1
write7279(uncode,0x6d);
while (!TI);//如果没发送完,那么继续等待
TI=0;
while(1)
{
controlmax=0; //设置MAX485发送使能端有效
RI=0; //开启发送中断
while (!RI); //如果没发送完,那么继续等待
RI=0;
while(1)
{
j=SBUF;
delay10ms(0x100);
switch(j)//把接收回来的信号进行判断,
{
case 0x30:write7279(uncode+1,j);break;//若为1的反馈信号则显示在第2位上
default :write7279(uncode+7,0xff);break;//否则点亮第8位数码管提示握手失败,从新发送数据
}
if (!key)// 如果有键按下,则kye为低电平
{
展开阅读全文