
双机通信
一、设计目的
1、掌握单片机C52的程序设计,掌握单片机通信程序编制方法。
2、了解单片机实现通信的硬件环境。
3、掌握双机通信的原理和方法。
二、设计要求
1、用两片单片机,实现双机通信;
2、用与A机连接的按键控制A机对B机的信息传输,每按一次键,首先发送端显示要发送数据,两台机器的发光二极管的显示相同。
3、用与B机连接的按键控制B机对A机的信息传输,每次按键,数码管的显示自动加一。
三、设计器材
| 器件名称 | 个数 |
| STC52RC | 2 |
| 晶振 | 2 |
| 电容(30PF) | 4 |
| 电容(10uF) | 2 |
| LED | 4 |
| 电阻(10K) | 4 |
| 电阻(330) | 2 |
| 电阻(8.2K) | 2 |
| 开关 | 4 |
| 数码管 | 2 |
| 三极管(NPN) | 1 |
| 排阻 | 1 |
1、设计思路
计划采用主从共两片STC52RC单片机来实现双机通信的,我们采用单片机直接交叉连接的方式,上位机发送的数据由串行口TXD端输出,直接由下位机的串行口数据接收端RXD接收。需要注意的是一定要保证主从机相同的数据传输速率,即要求设置相同的波特率。电路分为数码管显示模块,单片机工作的基本复位、晶振模块。
2、设计原理
(1)原理概述
双机通信系统通过主从单片机的串行口来实现数据的收发。主单片机通过开关电路来启动发送程序,当开关按下时向从机发送一个数据,从机通过接收中断来接收主机发送过来的数据,并通过编写好的数据代码在LED数码管上显示主机发送过来的数据。同时从机给主机发送一个应答信号来表示已经接收到了主机发送过来的数据,在主机接收应答并校验正确,以二极管显示,这样就完成了一个数据的通信过程,等待按键按下,然后继续下一次数据的发送直到结束。
(2)串行通信
串行数据通信要解决两个关键问题,一个是数据传送,另一个是数据转换。所谓数据传送就是指数据以什么形式进行传送。所谓数据转换就是指单片机在接收数据时,如何把接收到的串行数据转化为并行数据,单片机在发送数据时,如何把并行数据转换为串行数据进行发送。单片机的串行通信使用的是异步串行通信,所谓异步就是指发送端和接收端使用的不是同一个时钟。异步串行通信通常以字符(或者字节)为单位组成字符帧传送。字符帧由发送端一帧一帧地传送,接收端通过传输线一帧一帧地接收。而对于两个单片机之间的串行通信,由于具有相同的数据格式及电平且是短距离通信则不必要使用一些电平转化芯片便可直接实现串行通讯,需要注意的是两单片机硬件要共地,软件中需要设置相同波特率。
五、软件系统实现
1、软件仿真图
单片机晶振电路 复位电路
2、软件程序代码
(1)甲机程序代码
/* 名称:甲机串口程序
说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管上。*/
#include #define uchar unsigned char #define uint unsigned int sbit LED1=P1^0; sbit LED2=P1^3; sbit K1=P1^7; uchar Operation_No=0; //操作代码 //数码管代码 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //向串口发送字符 void Putc_to_SerialPort(uchar c) { SBUF=c; while(TI==0); TI=0; } //主程序 void main() { LED1=LED2=1; P0=0x00; SCON=0x50; //串口模式 1,允许接收 TMOD=0x20; //T1 工作模式 2 PCON=0x00; //波特率不倍增 TH1=0xfd; TL1=0xfd; TI=RI=0; TR1=1; IE=0x90; //允许串口中断 while(1) { DelayMS(100); if(K1==0) //按下 K1 时选择操作代码 0,1,2,3 { while(K1==0); Operation_No=(Operation_No+1)%4; switch(Operation_No)//根据操作代码发送 A/B/C 或停止发送 { case 0: Putc_to_SerialPort('X'); LED1=LED2=1; break; case 1: Putc_to_SerialPort('A'); LED1=~LED1;LED2=1; break; case 2: Putc_to_SerialPort('B'); LED2=~LED2;LED1=1; break; case 3: Putc_to_SerialPort('C'); LED1=~LED1;LED2=LED1; break; } } } } //甲机串口接收中断函数 void Serial_INT() interrupt 4 { if(RI) { RI=0; if(SBUF>=0&&SBUF<=9) P0=DSY_CODE[SBUF]; else P0=0x00; } } (2)乙机程序代码 /* 名称:乙机程序接收甲机发送字符并完成相应动作 说明:乙机接收到甲机发送的信号后,根据相应信号控制 LED 完成不同闪烁动作。*/ #include #define uchar unsigned char #define uint unsigned int sbit LED1=P1^0; sbit LED2=P1^3; sbit K2=P1^7; uchar NumX=-1; //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //主程序 void main() { LED1=LED2=1; SCON=0x50; //串口模式 1,允许接收 TMOD=0x20; //T1 工作模式 2 TH1=0xfd; //波特率 9600 TL1=0xfd; PCON=0x00; //波特率不倍增 RI=TI=0; TR1=1; IE=0x90; while(1) { DelayMS(100); if(K2==0) { while(K2==0); NumX=++NumX%11; //产生 0~10 范围内的数字,其中 10 表示关闭 SBUF=NumX; while(TI==0); TI=0; } } } void Serial_INT() interrupt 4 { if(RI) //如收到则 LED 则动作 { RI=0; switch(SBUF) //根据所收到的不同命令字符完成不同动作 { case 'X':LED1=LED2=1;break; //全灭 case 'A':LED1=0;LED2=1;break; //LED1 亮 case 'B':LED2=0;LED1=1;break; //LED2 亮 case 'C':LED1=LED2=0; } 六、硬件电路设计 1、硬件电路设计方案 从硬件电路设计的目标出发,我们尽量考虑到可靠、高效、简洁的原则,在整个系统设计过程中严格按照规范进行,做好各部分模块设计最优。简洁是指在满足了可靠、高效的要求后,为了尽量在器件允许的范围内使电路设计导线无交叉,应使电路设计尽量简洁,尽量减少元器件使用数量,缩小电路板面积,使电路部分重量轻。在焊接电路板时由于从机的数码管管脚排布无规律,使得导线不能直接的焊接,我们尽量合理设计元件排列和电路走线,使本系统达到设计要求。 2、单片机最小系统 C52单片机的最小系统采用内部时钟方式:以XTAL1和XTAL2引脚外接晶振,构成了自激振荡器并在单片机内部产生时钟脉冲信号,然后给晶振的每个脚分别外接一个30PF的电容,以此使晶振快速起振并且达到约11.0592MHZ的稳定频率。而在单片机的RST脚接上按键开关以及适当的电阻、电容便构成按键与断电两用的复位电路。 3、数码管显示模块 设计中,我们使用P0口控制数码管段选信号,P1口选取两位为位选信号控制端。拿到数码管后,我们借助万用表进行测试,最终确定为共阴极数码管,进而测试便得出了该数码管对应的管脚分布图。 七、问题分析与解决方法 课程设计初期主要对通过课程设计要求完成的功能进行问题分析,再通过查询书本与网络资源,初步确定一个思路。等所有器件都拿到以后,通过对不同器件功能的分析,确定最终要实现的目标。然后运用ISIS 7 Professional软件连接好所有的器件,然后编写程序,在仿真系统下验证功能是否正确。在得到准确的仿真结果后开始焊接。 在实验过程中,我们遇到了以下几个问题: 1.在仿真没有错误的电路在实际做完之后不工作,首先我们检查了电路焊接,并没有发现有虚焊和短路的现象。因此我们怀疑是否烧程序的时候出现问题我们没有发现,然后我们一共重新烧过三次程序,最后可以正常工作了。 2.虽然我们得到了实验结果,但是数码管显示不是很显眼,于是我们对电路进行了改进,在数码管连接处加上三极管放大电路作为驱动,发现实验结果比之前要好了很多。 3.电路中我们少焊接了一个排阻,以至数码管无法显示,之后添加排阻之后,数码可以显示了。 八、课程设计心得体会 经过两个星期的课程设计,总的来说,我们小组每个人都努力做好了自己要做的,但对结果还是不太满意,虽然板子焊接好了,结果也出来了,但还是对设计的整体要求理解不深,没有对设计有进一步的加深,没有更好的拓展。在这方面我们还需要以后努力的学习,加深理解,更好的锻炼自己。 课设的过程中,我们小组合作的很好,每个人都很好的完成了自己的任务,从查资料,仿真电路,再到焊接板子,我们都是齐心协力,出现问题的时候我们会一起讨论,寻找问题的原因,经过我们的努力问题都得到了解决。 通过这次课设,我们的理论、实践都得到了锻炼。但要学的还很多,只有拓宽自己的知识,才能在实践中更容易找到问题所在,也能对问题有更好的理解。 这一次我们做的是有关单片机的课程设计,是我比较感兴趣的,所以抱有很大的信心。在老师讲解课程设计内容的时候,我们所做的双机通信是最简单的,所以老师一句话就带过了,因此需要我们自主的去查询一些知识。在开始的两天,由于器件没有到手,而且实验室没有电,我们便在宿舍与图书馆查询资料,等到第三天器件都拿到,我们才确定了一个比较明确的思路。 焊接电路时候,我们组是三个男生、一个女生,我是女生,比较心细,就承担起了主要的焊接任务。我们在焊接的时候十分小心,防止有虚焊和短路的情况发生,同时也希望有一个比较美观的布板,所以焊接虽然慢一些却也一次性成功了,除了后期排阻和三极管的添加,基本还是不错的。 我发现在做任何事情的时候都需要我们有足够的耐心与细心来完成,而且我们必须学会将课本上的知识转换到实际的能力,我在这一方面的能力就比较薄弱,是缺少锻炼的缘故,因此以后在学习的过程中,一定要学会关注功能的实现这一方面。最后,我也很感谢我的队友,是我们齐心协力,才如此出色的完成了我们的作品,希望以后还有一起做作品的机会,让我们一起学习,一起进步。 通过这次单片机应用系统设计,培养了我们的设计能 力,实际分析问题和动手能力, ,获取信息和综合处理信息的能 力、文字和语言表达能力以及协作工作能力,养成理论联系实际 和一丝不苟的工作作风, 使我们更加充分的了解了课本上所学不 到的知识,并能够应用于实践当中。 这次课程设计,让我们觉得学术遥远,自己才疏学浅。单片 机应用系统的研究何其复杂,这次设计其实只能是涉其皮毛,距 离理想之境还有很长的路。 课程设计能够顺利完成,并非其中一人之功。组员之间都给 了对方很多帮助,使我们都互相交流学到了许多知识,还有老师 在实验室不倦地指导。队友对彼此的帮助和鼓励。 这次设计的实现凝结着队友的智慧、心血和鼓励。 回顾起此次课程设计,从到定题目到顺利完成,从理论到实 践,在整个学习的日子里,可以学到很多很多的东西,同时不仅 可以巩固了以前所学过的知识, 而且学到了很多在书本上所没有 学到过的知识。在设计中遇到了很多难以解决的问题,最后都在 老师的帮助、队友的辛勤努力下,终于迎刃而解。 本次课程设计我们组做的题目是实现单片机的双机通信,就题目本身而言,这个课题并不难,只是由于我们缺乏经验,做的过程中出现了很多问题,不过这也使我们得到了很多宝贵的经验,学到了更多解决问题的方法。 由于之前所学的单片机的相关理论知识没有形成体系,不知道如何应用,所以刚开始接到题目的时候,有很多问题不太明白。后来通过查阅相关资料以及复习单片机中所讲的有关中断控制,串行通信的原理及应用,单片机复位电路所需注意的问题等知识,对这个题目有了更深的了解。 在完全理解了题目之后,我们开始了程序的编写以及硬件电路的设计和仿真。在编写程序的时候我们先后进行了多次修改,最终达到了我们预期的结果,通过按键产生中断发送数据,且双机之间的数据发送互不干扰。此外就是焊接完成后,由于没有给数码管加三级管,而导致驱动电压过小,三极管亮度不够,后来经分析后正确的给数码管加了三极管,使得三极管能够正常显示数据。 总之,通过本次课程设计,我学到了很多。不仅对单片机的理论知识加深了理解,并将这些知识应用于实践,也对系统开发的过程有了更深入的了解,对于创造思维的培养和开发能力的锻炼有很大的帮助。 九、附录: 参考书目: 1.《单片机原理及接口技术》,李全利,迟荣强---北京:高等教育出版社,2004.1 2.《单片机技能与实训》,宋国富---北京:电子工业出版社,2010.2 3.《单片机原理与应用实践指导》,吴飞青,丁晓,李林功,练斌著。 4.《51单片机及其C语言程序开发实例》,戴仙金---北京:清华大学出版社,2008.2
