单片机串行多机通信单片机原理与应用课程设计报告doc.docx
《单片机串行多机通信单片机原理与应用课程设计报告doc.docx》由会员分享,可在线阅读,更多相关《单片机串行多机通信单片机原理与应用课程设计报告doc.docx(25页珍藏版)》请在冰点文库上搜索。
单片机串行多机通信单片机原理与应用课程设计报告doc
单片机原理与应用
课程设计报告
课程设计:
单片机串行多机通信
专业班级:
学生姓名:
学号:
指导教师:
设计时间:
成绩:
信电工程学院
1.绪论
1.1串行通信简介
串行通信可以分为同步通信和异步通信两类。
同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。
这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。
它们均由同步字符、数据字符和校验字符组成。
其中同步字符位于帧开头,用于确认数据字符的开始。
数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。
同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。
异步通信中,在异步通行中有两个比较重要的指标:
字符帧格式和波特率。
数据通常以字符或者字节为单位组成字符帧传送。
字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。
发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。
接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。
1.2串行多机通信背景与研究意义
随着近代电子科技的飞速发展,单片机作为电子领域的新兴产品广泛应用于工业控制、智能仪器仪表,机电一体化等领域,在各行各业中起着重要作用,由于单片机的使用,越来越多的系统开始向智能化方向发展。
多机串行通信也是单片机的一个重要方面。
利用单片机的串口通信可以实现多单片机之间的数据的远程传输、数据分析与系统综合控制功能,尤其是在数据量比较大的场合下,利用一个主机向各个从机发送控制指令是一个很好的解决方案,在这个过程中,串口通信是实现单片机与单片机之间通信的关键串行通信作为单片机之间常用的通信方法之一,由于其通信编程灵活、硬件简洁并遵循统一的标准,因此其在工业控制领域得到了广泛的应用。
单片机家族庞大,种类丰富,体积小,功耗低,使用灵活方便,控制能力强,其中流行的单片机有Atmel公司的51系列单片机等,AT8951系列单片机由于廉价,品种丰富而得到了广泛使用。
1.3课题设计主要研究目的
单片机的多机通信系统通常采用主从模式,用一个单片机作为主机,其他单片机作为从机与主机进行通信。
利用现代虚拟仿真技术可对设计进行仿真实验,与单片机仿真联系紧密的为proteus仿真,利用keil软件设计单片机控制系统,然后与proteus进行联合调试,可对设计的正确性进行检验。
此次课题是三个单片机实现主从式串行通信的系统,主机发送数据到从机,并在LED数码管上显示。
并且通过接在主机上的键盘输入数据,通过主机发送到从机。
2系统整体方案设计
2.1系统的基本方案
本次设计通过使用三块AT89C51单片机芯片实现主从式单片机多机通信,主机通过键盘读取键值,并发送给指定的从机,从机根据接收到的地址信息判断是否接收数据,若接收数据,则通过数码管显示。
系统设计框图如图2-1所示:
图2.1系统设计框图
主机P1口与4X4键盘相连,用来读取数据,通过P0口确定要接收数据的从机的地址。
每个从机连接一位共阳极数码管,P1.0和P1.1分别接地,用来作为地址选择信号。
,每个从机P3.2口连接LED,LED的点亮标志该从机工作。
主机的TXD接口分别与从机1和从机2的RXD口相连,主机的RXD接口分别与从机1和从机2的TXD口相连,作为通信线路
2.2各模块方案选择
2.2.1单片机的选择
采用STC89C51单片机,它是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
2.2.2键盘的选择
采用4*4矩阵式键来控制,把按键按行列组成矩阵,在行列交点上都对应有一个键,这样使用的按键要少,为判定有无键被按下以及被按键的位置,这种称为键扫描法。
这样虽然提高了编程难度,但是节约了单片机大量的I/O口,免去了上拉电阻为焊接带来了方便,提高了整块电路板的美观度。
2.2.3显示模块的选择
采用八段数码管显示模块,同从机地址与主机地址符合时,相应的发光二极管点亮。
3系统的硬件设计与实现
3.1系统硬件概述
本设计包括主机部分和从机两个部分,单片机之间通过串口进行通信,主机通过按键来选择要进行通信的从机,进而通过按键控制从机的数码管显示数字;同时从机可以通过按键控制主机连接的LED灯。
数码管与单片机的连接方式采用并行连接方式。
其中用到的硬件有单片机,矩阵键盘,发光二极管等。
3.2主机电路模块
3.2.1单片机
AT89C51单片机内部主要由9个部件组成:
1个8位中央处理器;4KBFlash存储器;128B的数据存储器;32条I/O口线;2个定时器/计数器;1个具有6个中断源、4个优先级的中断嵌套结构;用于多处理机通信、I/O扩展或全双工UART的串行口;特殊功能寄存器;1个片内振荡器和时钟电路。
AT89S51系列单片机完全继承了MCS-51的指令系统,共有111条指令,按其功能可分为五大类:
数据传送类指令、算术运算类指令、逻辑运算类指令、控制转移类指令、布尔操作。
AT89C51单片机引脚如图3-1所示。
图3.1AT89C51单片机引脚图
管脚说明:
P0口:
8位、漏极开路的双向I/O口。
P0能够用于外部程序数据存储器。
它可以被定义为数据/地址的第八位。
P0口在应用时必须外接上拉电阻,作为输入时,首先应将引脚置1。
P1口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P2口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P3口:
8位双向I/O口,内部含上拉电阻。
作为输入时,应先将引脚置高;若负载为低电平,则通过内部上拉电阻向外输出电流。
P3口除了通用I/O口功能外,还有第二功能。
P3口的第二功能定义如表3-1所示。
表3.1P3口第二功能定义
引脚定义
功能
引脚定义
功能
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:
复位输入,低电平有效。
ALE/PROG:
地址锁存允许信号输出。
在正常操作状态下,该引脚端口输出恒定频率的脉冲。
其频率为晶振频率的1/6,可用作外部定时或其他触发信号。
如果需要,可通过SFR的第0位置禁止ALE操作,但ALE的禁止位不影响对外部存储器的访问。
:
片外程序存储器选通信号,低电平有效。
当AT89S51执行来自外部程序存储器的指令代码时,PSEN/每个机器周期两次有效。
在访问外部数据存储器时,PSEN/无效。
:
片外程序存储器访问允许信号,低电平有效。
XTAL1:
外接晶振。
在单片机内部是反相放大器的输入及端。
XTAL2:
外接晶振。
在单片机内部是反相放大器的输出端,输入到内部时钟发生器。
3.2.2矩阵键盘电路
矩阵键盘电路如图3-2所示。
单片机的P1口控制矩阵键盘。
本设计采用4*4矩阵键盘。
矩阵键盘的行线接P1.0-P1.3引脚,列线接P1.4-P1.7引脚。
将P1.0-P1.3引脚置为高电平,P1.4-P1.7引脚依次置为低电平,当按键没有按下时,P1.0-P1.3口各引脚状态不变,一旦有按键按下,则P1.0-P1.3就会有引脚变为低电平,这样,通过读入P1.0-P1.3的状态就可得知是哪一个按键按下了,然后单片机根据该按键代表的功能执行相应的程序。
图3-2矩阵键盘电路原理图
3.2.3控制电路
单片机的时钟的频率直接影响着单片机的速度和系统的稳定性。
AT89S51片内由一个反相放大器构成振荡器,可以通过XTAL1和XTAL2产生时钟。
常用的单片机产生时钟的方法有两种:
内部时钟方式和外部时钟方式。
本设计选用外部时钟方式,单片机内部XTAL1引脚为高增益反向放大器的输入端,XTAL2为输出端,在这2个引脚之间接石英晶振和电容,就可以构成一个稳定的自激振荡器。
本设计选用的12MHz的晶振。
电路原理图如图3-3所
11.0592
图3-3时钟电路
3.2.4复位电路模块
复位是单片机的初始化操作,复位信号是高电平有效,复位操作有上电自动复位、按键电平复位、外部脉冲复位和自动复位四种方式。
在本设计中复位采用
上电自动复位,当接通电源的瞬间,RST端与Vcc同电位,随着电容的电压逐渐上升,RST端的电压也逐渐下降,于是在RST端便形成了一个正脉冲,只要该正脉冲的宽度持续两个周期的高电平,就可以实现系统的自动复位,复位电路原理图如图3-4所示
3.3从机电路模块
本设计共设置2路从机,2路从机的电路设计和实现的功能是一样的,所以这里只介绍其中一路从机的电路设计。
从机的P0口连接共阳极数码管。
P0口的0~7引脚分别接数码管的a~dp引脚。
数码管采用静态工作方式。
数码管引脚图与接线原理图如图3-5和图3-6所示。
图3-5数码管引脚图图3-6数码管连线图
4.系统的软件设计
4.1软件设计应用环境与设计语言
本设计软件的设计是在KeilC51的环境下编译的。
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
KeilC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效、快速的特点。
4.2软件设计流程
4.2.1主机软件设计流程图
主机软件设计流程图如图4-1所示。
图4.1主机软件设计流程图
4.2.2从机软件设计流程图
从机软件设计流程图如图4-2所示。
图4.2从机软件设计流程图
4.3串口通信
AT89S51的串行口是一个全双工的异步串行通信口,可以同时进行接收数据和发送数据,因为口内的接受缓冲器和发送缓冲器在物理上是隔离的,即是完全独立的。
可以通过访问特殊功能寄存器SBUF,来访问接收缓冲器和发送缓冲器。
接收缓冲器还具有双缓冲的功能,即它在接收第一个数据字节后,能接受第二个数据字节,但是,在它完成接收第二个数据字节之后,若第一个字节仍未取走,那么该字节数据将丢失。
对串行口的控制主要包括对状态控制寄存器SCON、控制寄存器PCON、和串行数据寄存器SBUF的设置。
1、状态控制寄存器SCON:
SCON是一个逐位定义的8位寄存器,由它控制串行通信的方式选择、接收和发送,指示串行口的状态。
寄存器SCON既可字节寻址也可位寻址,字节地址为98H,位地址为98H-9FH。
其格式如下表4-1所示:
表4.1SCON地址格式
位地址
9FH
9EH
9DH
9CH
9BH
9AH
99H
98H
位功能
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0,SM1:
串行口工作方式选择位;
SM2:
允许方式2、3中的多处理机通信位;
REN:
允许串行接收位,置位时,允许串行接收,清除时,禁止串行接收,可用软件置位/清除;
TB8:
方式2和方式3中要发送的第9位数据,可用软件置位/清除;
RB8:
方式3和方式3中接收的第9位数据。
方式1中接收的是停止位,方式0中不使用这一位。
TI:
发送中断标志位,硬件置位,软件清除。
方式0中,在发送第8位末尾置位,在其他方式时,在发送停止位开始时设置;
RI:
接收中断标志位。
硬件置位,软件清除。
方式0中,在接收第8位末尾置位,在其他方式时,在接收停止位中间设置。
2、控制寄存器PCON:
PCON是一个逐位定义的8位寄存器,目前仅有几位有定义,其中仅最高位SMOD与串行口控制有关,其他位与掉电方式有关,其格式如表4-2所示。
表4.2PCON地址格式
D7
D6
D5
D4
D3
D2
D1
D0
SMOD
--
--
--
GF1
GF0
PD
IDL
SMOD:
串行通信波特率系数控制位,当SMOD=1时,使波特率加倍。
寄存器PCON的地址为87H,只能字节寻址。
3、串行数据寄存器SBUF:
SBUF包含在物理上隔离的两个8位寄存器:
发送数据寄存器和接受数据寄存器,但是它们共用一个地址99H,其格式如下表4-3所示。
表4.3数据寄存器格式
D7
D6
D5
D4
D
D2
D1
D0
SD7
SD6
SD5
SD4
SD3
SD2
SD1
SD0
串行口控制寄存器SCON中的SM2为方式2或方式3的多机通信控制位,当串行口以方式2或方式3工作时,若SM2程控位为1,此时只有当串行口就收到的第9位数据RB8=1时,才置1中断标志RI,若接收到的RB8=0,则不产生中断标志,应用MCS-51串行口的这个标志,便可实现多机通信。
在一个多机系统中有一个主机和二个从机组成的多机系统,从机的地址分别为00H,01H,从机系统由初始化程序将串行口编程为方式2或方式3接收,即9位异步通信方式,且置“1”SM2和REN,允许串行口中断。
在主机和某一个从机通信之前,先将从机地址发送给各个从机系统。
接着才传送数据或命令,主机发出的地址信息的第9位为1,数据(包括命令)信息的第9位为0,当主机向各从机发送地址时,各从机的串行口接收到的第9位的信息RB8为1,置“1”RI中断标志位,各从机80C51响应中断,执行中断服务程序。
在中断服务程序中,判断主机送来的地址是否和本机地址相符合,若为本机的地址,则清“0”SM2位,准备接收主机的数据或命令;若地址不相符,则保持SM2=1状态。
接着主机发送数据,此时各个从机串行口接收到的RB8=0;只有与前面地址相符合的从机系统(即已清“0”SM2位的从机)才能激活中断标志位RI,从而进入中断服务程序,在中断服务程序中接收主机的数据或执行主机的命令,实现和主机的信息传送;其他的从机因SM2保持为1,又RB8=0不激活中断标志RI,所接收的数据丢失不作处理,从而保证了主机和从机间通信的正确性。
本次设计多机系统为主从式,由主机控制多机之间的通信,从机和从机之间的通信只能经主机才能实现。
5系统仿真设计
5.1Proteus软件介绍
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:
*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。
使用Proteus软件进行单片机系统仿真设计,是虚拟仿真技术和计算机多媒体技术相结合的综合运用,有利于培养学生的电路设计能力及仿真软件的操作能力;实践证明,在使用Proteus进行系统仿真开发成功之后再进行实际制作,能极大提高单片机系统设计效率。
因此,Proteus有较高的推广利用价值。
5.2Proteus仿真图
图5-1串行多机通信软件仿真图
5.3硬件调试
所有器件按电路原理图焊接完成后,接上导线,放入三节电池,接通电源,按下开关。
相应的从机对应的发光二极管点亮,按下键盘,相应数码管上显示键值。
调试过程中先检查pcb版各个点是否焊接错,连线正确,确保线没有绕道一起。
调试途中由于两从机1.0口同时接地,通过修改第一从机1.0口接地,第二从机1,1口接地。
显示结果正确。
5.4调试结果
刚开始调试并不是很顺利,虽然很小心但调试过程中仍出现了很多的问题,首先电路比较难焊接,必须再加小心以免出现问题难以排查。
还有电路中需接电源正负极的线比较多也要很仔细的去焊接。
刚开始调试两个按键同事控制两个发光二极管而不是各自控制,经过同学帮忙大家努力后终于正确的调试出了结果。
6结论
本次课程设计是设计单片机行多机通信,这次课程设计不光是要掌握模单片机书本上的理论基础,还需要我们锻炼自己的动手能力。
这次课程设计用时2周,需要用到ProteusISIS绘图,同时也用到keil编程,仿真验证程序正确。
软件对女生而言还好一点,最后一步焊接硬件有点困难,因为平时没练过焊接,刚开始的矩阵键盘就焊错了,之后又重新用吸锡器吸掉,列线扫描用导线代替了。
焊接过程遇到许多问题,终于焊接完成后,又发现从机两个灯只受一个开关控制,刚开始以为开关那块中断函数出现问题,又返回去重新改程序,给单片机刷入程序第2次验证,还是没有调试正确。
最后终于发现了问题,原来是硬件焊接时,想当然的两从机的P1.0口都接地,于是回去将第2个从机P1.1口接地,果然调试正确。
调试成功后真的很开心,因为第一次焊接,所以外表不太美观,课件,各个元器件的布局真的很重要。
第一次做单片机硬件,确实让我学到了很多东西,很感谢这次的实践机会。
这次实验从开始准备到焊接硬件完成,虽然短短一点时间,但是它充实了我们的生活,让我们增长了知识,提高了学习能力,一些软件的使用,芯片的管教,电解电容的正负极,等等一些细微的东西,都需要自己去图书馆或者网上找相应的资料。
这次小课程设计对以后的课程设计都有帮助,提前锻炼了我们的能力,同时也感谢实验室的同学的指导以及高老师的指导,让我顺利的完成了课程设计。
这次实验很充实。
参考文献
【1】高玉芹单片机原理与应用及C51编程技术【M】.北京:
机械工业出版社。
【2】刘泉溪单片机原理与应用实验教程【M】北京航空航天大学出版社。
【3】孙育才.MCS-51系列单片微型计算机及其应用【M】东南大学出版社,
附录
附录1:
元件清单与硬件图
1.元件清单:
发光二极管LED-green*2个
晶振CRYSTAL,12MHz*3个
排阻RESPACK-8*1个
AT89C51芯片*3片
按键Button*16个
电解电容10uf*3个
8段数码管*2个
电容30p*3个
电阻2k*3个
开关*2个
2.硬件实物图:
附录2:
C语言源程序
主机程序:
#include
#include
#defineucharunsignedchar
ucharbuf;
ucharaddr,get_key,key;
voiddelay(uchart)
{
uchari;
while(t--)
{
for(i=0;i<125;i++);
}
}
ucharkeyscan(void)
{
ucharscancode,tmpcode;
P1=0xf0;
if((P1&0xf0)!
=0xf0)
{
delay(10);
if((P1&0xf0)!
=0xf0)
{
scancode=0xfe;
while((scancode&0x10)!
=0)
{
P1=scancode;
if((P1&0xf0)!
=0xf0)
{
tmpcode=(P1&0xf0)|0x0f;
return((~scancode)+(~tmpcode));
}
elsescancode=(scancode<<1)|0x01;
}
}
}
return(0);
}
voidsenddata(ucharbuf)
{
TI=0;
TB8=0;
SBUF=buf;
while(!
TI);
TI=0;
}
voidGetkey()
{
switch(get_key)
{
case0x11:
//1行1列,数字0
key=0xc0;
break;
case0x21:
//1行2列,数字1
key=0xf9;
break;
case0x41:
//1行3列,数字2
key=0xa4;
break;
case0x81:
//1行4列,数字3
key=0xb0;
break;
case0x12:
//2行1列,数字4
key=0x99;
break;
case0x22:
//2行2列,数字5
key=0x92;
break;
case0x42:
//2行3列,数字6
key=0x82;
break;
case0x82:
//2行4列,数字7
key=0xf8;
break;
case0x14:
//3行1列,数字8
key=0x80;
break;
case0x24:
//3行2列,数字9
key=0x90;
break;
case0x44:
//3行3列,10
key=0x88;
break;
case0x84:
//3行4列,11
key=0x83;
break;
case0x18:
//4行1列,12
key=0xc6;
break;
case0x28:
//4行2列,13
key=0xa1;
break;
case0x48:
//4行3列,14
key=0x86;
break;
case0x88:
//3行4列,15
key=0x8e;
break;
default:
break;
}
}
voidmain()
{
uchari=0;
key=0xc0;
while
(1)
{
get_key=keyscan();
Getkey();
buf=key;
P0=0xff;
addr=P0&0x0f;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x