资源描述
g
专业课程设计报告
题 目:
基于RS-485单片机通信系统设计(发送端)
姓 名:
刘张
专 业:
通信工程
班级学号:
09042218
同 组人 :
09042219 彭林
指引教师:
张小林
南昌航空大学信息工程学院
年 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 室
任务下达
6 月 1 日
任务完毕
20 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端由高变低后,程序指针由ROM0000H开始执行程序。它复位操作不影响内部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-99芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接键盘接口RS485采用DB-9(针)
2.2.2 通信电路
通信模块电路如下:
图2-4 通信模块电路
MAX485RO和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程序设计.北京:清华大学出版社,.
[2] 张先庭.单片机原理、接口与C51应用程序设计.北京:国防工业出版社,.
[3] 杨子文.单片机原理及应用.西安:西安电子科技大学出版社,.
[4] 张友德.单片微型机原理、应用与实验.上海:复旦大学出版社,.
[5] 陈志旺.51系列单片机系统设计与实践.北京:电子工业出版社,.
[6] 马忠梅.单片机C语言应用程序设计.北京:北京航空航天大学出版社,.
附录一:总原理图
附录二:源程序代码
#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<0x;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为低电平
{
write7279(xiao,0xd5);
write7279(shan,0xff);
key_number=read7279(cmd_read);//读出键码
m=get_key_number(key_number);
init();
controlmax=1;//设立MAX485发送使能端有效
SBUF=key_number;
TI=0; //启动发送中断
展开阅读全文