基于51单片机的双机串行通信课程设计Word文档下载推荐.docx
《基于51单片机的双机串行通信课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于51单片机的双机串行通信课程设计Word文档下载推荐.docx(10页珍藏版)》请在冰点文库上搜索。
接受或发送的数据都要先送到SBUF缓存。
有两个,一个缓存,另一个接受,用同一直接地址99H,发送时用指令将数据送到SBUF即可启动发送;
接收时用指令将SBUF中接收到的数据取出。
(2)串行控制寄存器(PCON)
SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下:
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
SM0,SM1:
串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。
串行接口工作方式特点见下表
工作方式
功能
波特率
0
8位同步移位寄存器(用于I/O扩展)
fORC/12
1
10位异步串行通信(UART)
可变(T1溢出率*2SMOD/32)
2
11位异步串行通信(UART)
fORC/64或fORC/32
3
SM2:
多机通信控制位。
REN:
接收允许控制位。
软件置1允许接收;
软件置0禁止接收。
TB8:
方式2或3时,TB8为要发送的第9位数据,根据需要由软件置1或清0。
RB9:
在方式2或3时,RB8位接收到的第9位数据,实际为主机发送的第9位数据TB8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。
TI:
发送中断标志。
发送完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续发送。
RI:
接收中断标志。
接收完一帧数据后由硬件自动置位,并申请中断。
必须要软件清零后才能继续接收。
(3)输入移位寄存器
接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收SBUF中。
(4)波特率发生器
波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器T1作为波特率发生器,T1设置在定时方式。
波特率时用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。
(5)电源控制寄存器PCON
其最高位为SMOD。
(6)波特率计算
当定时器T1工作在定时方式的时候,定时器T1溢出率=(T1计数率)/(产生溢出所需机器周期)。
由于是定时方式,T1计数率=fORC/12。
产生溢出所需机器周期数=模M-计数初值X。
3.整体电路设计
最终设计电路如下图3所示,发送方的数据由串行口TXD段输出,经过传输线将信号传送到接收端。
信号到达接收方串行口的接收端。
接受方接收后,通过P1口在数码管上显示接收的信息。
图3.串行通信电路
三、软件设计
(1)串行口工作于方式1;
用定时器1产生9600bit/s的波特率,工作于方式2。
(2)功能:
将本机ROM中数码表TAB[16]中的16个数发送到从机,并保存在从机内部ROM中,从机收到这16个数据后送到一个数码管循环显示。
(3)通信协议:
主机首先发送连络信号从机接收到之后返回一个连络信号表示从机已准备好接收。
四、联合调试
在protues上进行仿真实验。
首先使用KeilC将编写完成的程序编译生成HEX文件,将HEX文件烧录到两片单片机中,进行仿真实验,结果如下图所示,可以看到,接收端已将接受到的数据完整的显示了出来。
图4.仿真图
注:
1.仿真的过程中并没有体现出单片机的最小系统的组成元素:
时钟电路和复位电路,但是实际的硬件电路中这两部分是必不可少的,此外,在实际测试中,程序是事先烧进单片机里的,所以这里并没有涉及到电平转换的问题(max232芯片和串口的连接)。
2.在数码管的共阴极与地之间接三极管是为了放大数码管的驱动电流,让数码管更加清楚的显示数据。
附:
主要器件:
两个STC89C52RC
晶振模块:
两个11.0592M的晶振
四个30pf的电容
复位模块:
两个开关
两个10uf的电容
两个10K的电阻
两个1K的电阻
显示模块:
两个单显共阴极数码管
两个NPN型三极管
五、程序清单
1.A机程序
#include<
reg51.h>
absacc.h>
sbitkey=P3^6;
voidsendrecieve();
voidmain()
{
P1=0XFF;
TMOD=0x20;
//定时器1工作作方式2
TH1=0XFD;
TL1=0XFD;
//波特率为9600
PCON=0X00;
//波特率不加倍
TR1=1;
SCON=0X50;
//串口工作方式为3,即11为可变波特率,
//开启允许串口接收中断,多机通讯位SM2置1(广播),TB8置1(表示发送地址)
//开发送及接受中断
EA=1;
key=1;
sendrecieve();
}
voidsendrecieve()
SBUF=0X06;
while(TI!
=1);
//等待数据发送完成,发送完则ti置1,否则为0
TI=0;
while
(1)
{
while(RI!
//等待接收数据完成
RI=0;
P1=SBUF;
//显示B发送来的数据
}
2.B机程序
unsignedcharcodeled[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//共阴极,标准接法(a--hPX.0--PX.7)
unsignedinti;
delay(unsignedintz)
unsignedintx,y;
for(x=z;
z>
0;
z--)
for(y=6000;
y>
y--);
//50ms
//开启允许串口接收中断,多机通讯位SM2置1
delay(20);
{
while(RI!
P1=SBUF;
RI=0;
for(i=0;
i<
16;
i++)
{
SBUF=led[i];
//向A发送信息
while(TI!
TI=0;
delay(60);
//3s
}
i=0;
六、课设中遇到的问题及解决办法:
1.在数码管显示模块连接三极管时,由于万用表的测试三极管的环节接触不良,着实有点让人头疼,但是最后通过借了别租的表才解决了问题,而且我们找到了三极管上的型号与之性质的对应关系;
2.由于这次我们的课设内容比较简单,所以我们在软件环节没有没遇到什么困难,在软件仿真时也很顺利,但是在最后焊接板子的时候,我们却遇到了问题:
数码管的各管脚的排列顺序不是遵循一定的规律的,所以在焊接时要特别注意布局与布线,在这个环节上我们花费了吗大半的时间。
七、课设中的心得体会:
负责总体思路设计,代码编写,软件仿真,并且参与最后的测试工作。
本次课程设计我们组主要研究的是双机通信实验,通过与组成员之间的合作,在开始的前两天中,主要是通过查找资料,或是在图书馆里查看书籍来学习有关双机通信实验的基本要求和实验所需要的器件,以及各实验器件所实现怎样的功能。
经过了我们四个人的协商,由两个人开始编写代码,再由两个人开始设计实验电路。
在编写程序代码的时候,使我学习到了最大的是MCS51单片机的中断程序的编写。
在编写程序的时候由于之前只是在课堂上和书本上学习的有单片机中的中断源以及中断向量,所以在实践的编写代码过程中会遇到很多不懂的问题,需要自己或者与同组成员相互沟通。
并且也学会了单片机的有关中断设计的思想,由于我们是制作双机通信的课程设计,所以在实验中需要用到两片单片机作为主从机来控制信号的接受与发送。
还学习到了单片机在使用中断的时候,如果有中断申请的话,硬件电路会自动把单片机里接受发送中断的TI和RI置1.这样就表示单片机此时有外部中断的申请,必须开中断来接受发送过来的信号。
大概两天的时间,我们就把初步的软件程序和硬件电路设计好了。
并且在PROTEUS的仿真器件中实现了硬件电路的连接,然后我们把PROTEUS的仿真硬件和51的程序下载到单片机中通过调节实验硬件和共同修改软件程序最终实现了器件的仿真。
接下来就是焊接电路的工作了,由另外的组员来实现大部分的硬件电路的焊接,从中我也学习帮忙,尽快完成我们的全部的设计内容。
在完成了所有的焊接的时候,把程序下载到单片机中后,发现了数码管显示的和预期设置的有些不同,在经过简单的修改之后,我们成功的完成了我们的实验作品。
在此次课程设计中我学习到了好多新的知识以及通过了团队小组的合作受益匪浅。
与罗军昌同学一起进行程序设计的思路整合与优化,并采集实验结果,编写报告。
这次课程设计的题目比较简单,我们感觉自己完成的也比较好,至少所用到的知识都是在自己理解的基础之上,我们采用了一位动态显示的数码管,数码管的工作原理;
我们在硬件连接完成好以后进行检测,当我们检测所有的焊点都没有问题后,让单片机发送数据。
我们用了C语言程序,实现了实验的要求。
通过两个星期的学习,我们在巩固和学习硬件知识的同时,用软件控制协调硬件实现现实功能,通过硬件完成软件的功能等方面的融会贯通,取得了一定的效果。
软件编写时,对于某些指令的功能,功能模块的连接,等都到了小问题,不过我们查阅资料得到了解决,与此同时,了解了不少的问题。
在这次设计中,我收获不少东西,也遇到了不少的问题。
首先,在完成单片机课程学习任务后,对内容的掌握不够,缺乏灵活运用的能力,对于知识的扩展也存在一定的问题,因此,初面对设计课题,无法系统地进行设计思路的拟定。
通过本次课程设计,不仅使理论知识得到了实践,有效巩固了知识。
同时对于单片机发展历史、强大功能、应用领域以及系列知识得到了大概的系统认识,同时也初步了解了一个完整的系统开发的过程,对于创造思维的培养和开发能力的锻炼,本次设计,为此提供了一个很好的平台。
负责硬件电路的搭建和测试与纠错。
经过繁忙而又紧张的课程设计,终于顺利的完成了设计任务。
虽然在这段时间里每天都那么繁忙,但是在这忙碌的过程中却得到了许多的收获。
经过课程设计,在查阅资料的过程中,学习了基于单片机的C语言程序设计,了解了单片机串行通信的基本知识,对于以后的学习和工作都有很大的益处。
在学习的过程中,也遇到了一些困难,比如开始的时候,由于发送端和接收端的通信协议没有做好,导致数据不能正确的传输,在解决问题的过程中,对于通信协议的实现有了深刻的认识。
通过这次课程设计,我想真的是锻炼了自己独立思考的能力。
查阅并收集课设中用到的相关的知识和资料,并参与硬件电路的焊接。
我很清楚这个实验的目的,表面上我们最终仅仅只是实现了设计要求的基本功能,但我觉得,这次课程设计更加深刻的意义是——从这样一个最基本,简单的实验中,从这样一个完整的过程中我了解一种系统设计的流程,甚至说是一种思路,思维。
从最初拿到题目,分析设计要求以及实现的初步思路,然后去查阅资料进行更加具体的设计这次实验无疑要求我们团队协作,互相配合并且整体上比较全面的统筹设计。
于是,初步规划后,我们开始将系统要实现功能的各个模块单独开来用PROTEUS仿真,并最终将各个模块组合后整体调试。
整个过程中我们在仿真上花费了较长时间,因为知道仿真成功是实现真正硬件电路的基础,仿真是从根本上检验设计者的设计逻辑以及思路的,很好的仿真才能使得设计系统在实现要求功能的基础上更加稳定、简单,仿真中,我们仔细斟酌了电路布线的合理性。
在焊接过程中,由于之前的统筹布局使得我们的电路布线简洁、明了,需要注意的是,由于焊接的粗心,有些焊点需要一再解焊导致焊盘脱落,而且对于数码管管脚焊接方式也是值得进一步改进的,这便是我今后所要更加注意的,争取全心全意的焊接电路,不要因为某些粗心的原因是电路焊接发生错误,在那个下午坚持不懈的努力下我们终于完成了任务,可以说是大部分的任务都是在那个下午一气呵成的。
总的来说,在实验中,我们尽量统筹并使得团队协作发挥更大作用,第一周的周三分发元器件后,在第二天我们组便基本上完成了设计要求的基本功能,于是,我们利用剩下的时间去调试硬件以及更加深入的总结题目的意义。
最后,作为本次实验小组的组长,我对大家辛勤劳作默契配合的合作精神深感欣慰,希望以后得到好的继承与发扬!