1、单片机双机通信系统-毕业设计汇编(完整版)资料(可以直接使用,可编辑 优秀版资料,欢迎下载) 成都信息工程学院电子工程学院电子技术综合设计总结报告题 目: 单片机双机通信系统 专 业: 生物医学工程 班 级: 2021级1班 姓 名: 指导教师: 胡老师 评 分: 2021年 12月 20 日目录1项目计划11.1项目背景11.2方案设计可行性分析1需求分析1可行性分析11.3项目执行计划22设计说明32.1方案设计32.2硬件设计原理4单片机系统4时钟模块5电平转换6数码管显示7按键模块72.3各单元模块设计流程图8硬件总设计框图8程序设计9按键程序设计9串口程序设计113调试说明113.1
2、调试方法及步骤113.2调试数据123.3故障分析143.4设计注意事项:144总结155参考文献156附录161 项目计划1.1 项目背景单片机作为微型计算机的一个分支,其功能强、体积小、应用灵活等诸多优点,在工业控制、仪器仪表、通信、家用电器和国际科技等各个领域得到广泛的应用,随着集成电路技术的不断发展,单片机的性能也在不断提高其应用的范围必将越来越宽广。然而,随着单片机在工业自动化控制、智能仪器中的广泛应用,单片机已经逐渐满足需要,多机协同工作已经成为重要的发展趋势,多机应用的关键就在于多级之间的互相通信、互传数据信息。单片机和计算机的共同发展下,单片机的应用从独立的单片机向网络发展,由
3、计算机和单片机构成的多机网络系统也是单片机技术发展的一个方向。单片机多机通信是指由两台以上的单片机组成的网络结构,可以通过串行通信方式共同实现对某一过程的最终控制。随着计算机技术的发展,多机通信技术也在不断的发展,现在发展比较成熟的还有光纤通信等。由于计算机的飞速发展和控制系统的复杂化,多机通信已经越来越成为人们热门话题之一。目前,单片机多机通信的形式较多,但通常可分为星型、环型、串行总线型和主从式多机型四种。1.2 方案设计可行性分析分析1.设计任务a.设计两个单片机系统;b.两单片机之间可以进行远距离通信;c.能够通过数码管显示时间;d.能够通过按键设置本机和对方的时间。2.设计要求a.基
4、本要求:设计两个小系统,能实现有线互相通信(互设时间+数据共享)。b.扩展要求:远距离通信或无线通信,并能实现校验。a. 市场可行性分析单片机作为微型计算机的一个分支,其功能强、体积小、应用灵活等诸多优点,在工业控制、仪器仪表、通信、家用电器和国际科技等各个领域得到广泛的应用。b. 技术可行性分析本项目在设计上思路简单,已设计出合理的实际方案,可以实现基础要求和扩展要求,并达到比较好的效果。c. 资源可行性分析资源有人力资源和材料资源,已考虑到各个阶段所需人才类型及数量,完全可以保证项目实施的有条不紊。 d. 经济成本可行性分析本项目设计结构简单,材料在原理图设计完成后导师派发。材料易购,成本
5、还是较为合适。e. 项目风险分析从项目整体上来说考虑各方面较为全面,风险指数已经降到最低,可以实施。1.3 项目执行计划下表为本项目进行的时间进度及人员分配情况:表1.1 工程进度工程名称工期(天)开始时间提交时间人员安排原理图设计3彭跃秒PCB布局3彭跃秒程序设计32021.10.20钮丽媛设计说明书2张惠琳安装、调试2钮丽媛安装调试说明书1张惠琳项目提交1钮丽媛表1.2材料清单序号名称型号规格号位数量1单片机STC89C52RC40C(PDIP40)U12片2接口芯片MAX232CPEU22片3四联数码管3461ASSEG12个4时钟芯片DS1302NLY12个5二极管D12个5按键立式6
6、*6*5(4脚黑)S1、S2、S36个6电池LITIUM CELLCR1220 3V2个7晶振11.0592MHz、32.765MHzY1、A14个8电阻10KR12个9电解电容10uF、100uFC3、C64个10瓷片电容30pF、104C5、C714个11连接线DB9公头1.5mDB91根12上拉电阻1KP12个11底座DIP40、DIP16、DIP8U1、U2、NLY13个12指示灯LED显示灯、红LED2个13排针若干2 设计说明2.1 方案设计通过两个STC89C52单片机为核心设计通信系统。单片机都带有串口,系统要求远距离通信,所以有对外连接的串口相互之间的数据共享。单片机的并行端
7、口也能相互连接来进行数据通信。要求互设时间,可以在IO口连接一时钟模块,这里选择DS1302时钟芯片实现,需要用到按键对时间设置,显示则各自需要数码管。在本次设计中硬件部分:对于两片89C52采用RS232进行双机通信硬件的连接方法如图所示。电平转换芯片采用MAX232,其连接一般采用双绞线。发送方的数据由串行口TXD段输出,经过电平转换芯片MAX232将TTL电平转换为RS232电平输出,经过传输线将信号传送到接收端。接收方也使用MAX232芯片进行电平转换后,信号到达接收方串行口的接收端。接受方接收后在数码管上显示接收的信息。为提高抗干扰能力,还可以在输入输出端加光耦合进行光电隔离。 软件
8、部分:通过通信协议进行发送和接收。初始时两个数码管显示初始值。单片机A对B进行时间设置前要先对自己设置时间,此时显示标志;设置之后需对B设时间,再显示标志开始。通过通信协议进行发送接收,A机在设置时可在B机上同时看到显示。与主机发送来的检验和进行比较,若检验和相同则发送字符给主机TXDAT89C52RXDR2INT2INMAX232T2OUTR2OUTTXDAT89C52RXDT2INT2OUTMAX232R2OUTR2IN2.2 硬件设计原理2.2.1单片机系统STC89C52芯片:有8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX
9、810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。单片机有32根输入/输出线,组成4个8位并行输入/输出接口,分别称为P0口、P1口、P2口、P3口。每个接口都由锁存器、输出驱动器和输入缓冲器组成。P0口和P2口还可用于对外部存储器访问的地址和数据总线。P0口作为I/O接口使用时,输出级属于开漏电路
10、,必须接上拉电阻才有高电平输出。在TXD和RXD处接一个下载口下载程序。单片机最小系统或称为最小应用系统,是指利用单片机自身的资源,用最少的辅助元件组成一个可以工作的系统。包括电源(地)、晶振(一般使用11.0592MHz或者12MHz)和复位电路。图2.1单片机最小系统振荡电路:如图可见,由两个30pF的电容与11.0592MHz的晶振构成稳定的自激振荡器,属于内时钟方式。这两个电容对频率有微调的作用,为减少寄生电容,振荡器和电容应尽可能安装得与单片机芯片靠近。复位电路:在RST复位输入上接入10uF电容至VCC端,在接一个10K电阻接地,组成上电复位电路。上电原理是,在加电时,Vcc通过电
11、容提供给RST端一个短暂的高电平信号,此后该高电平信号随Vcc对电容的充电过程而逐渐回落,即RST高电平持续时间取决于电容的充电时间。上电时,vcc的上升时间约为10ms,而振荡器的起振时间取决于振荡频率。 DS1302时钟模块芯片简介:实时时钟电路DS1302是一种具有涓细电流充电能力的电路,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振。工作电压为2.5V5.5V。本项目采用三线接口通过5、6、7脚与CPU进行同步通信。 DS1302内部有一个318的用于临时性存放数据的RAM寄存器。DS1302的引脚排列,其中Vcc
12、2为主电源,VCC1为后备电源。在主电源关闭的情况下,也能保持时钟的连续运行。DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电运行时,在Vcc2.0V之前,RST必须保持低电平。只有在SCLK为低电平时,才能将RST置为高电平。I/O为串行数图2.2D
13、S1302电路图据输入输出端(双向)。 SCLK为时钟输入端。备用电源Vcc1,可以用电池或者超级电容器(0.1F以上)。如果要长时间保证时钟正常,选用小型充电电池。可以用老式电脑主板上的3.6V充电电池。如果断电时间较短(几小时或几天)时,就可以用漏电较小的普通电解电容器代替。100 F就可以保证1小时的正常走时。DS1302在第一次加电后,必须进行初始化操作。初始化后就可以按正常方法调整时间。本项目有100 F电解电容,也采用了在备用电源处使用3V的电池供电。二极管的作用是给100uF的电容充放电。下图是DS1302在本设计中的原理图:电平转换用8051串行接口通信,如果两台8051单片机
14、之间的距离很近(不超过1.5m),可以采用直接将两台8051单片机的串行接口直接相连,利用其自身的TTL电平(0-5V)直接传输数据信息。如果传输距离较远(超过1.5m),由于传输线的阻抗与分布电容,会产生电平损耗和波形畸变,以至于检测不出数据或数据出错。RS-232C对电器特性、逻辑电平和各种信号线功能都作了规定。在TxD和RxD上:逻辑1(MARK)=-3V-15V,逻辑0(SPACE)=+315V。在RTS、CTS、DSR、DTR和DCD等控制线上:信号有效(接通,ON状态,正电压)+3V+15V,信号无效(断开,OFF状态,负电压)=-3V-15V。为了能够同计算机接口或终端的TTL器
15、件连接,必须在EIA-RS-232C与TTL电路之间进行电平和逻辑关系的变换。图2.3MAX232模块原理图最大直接传输距离说明:RS-232C标准规定,若不使用MODEM,在码元畸变小于4%的情况下,DTE和DCE之间最大传输距离为15m(50英尺。DB-9连接器:用RS-232总线连接系统有近程通讯方式和远程通讯方式两种,近程通讯是指传输距离小于15米的通讯,可以用RS-232电缆直接连接。15米以上的长距离通讯,需要采用调制调解器。计算机和终端用RS-232连接的交叉“发送数据”与“接收数据”是交叉相连的,使得两台设备都能正常的发送和接收。在于DB9相连时需要考虑RS232串口接线是公头
16、还是母头,因为两单片机的TXD与RXD必须交叉相连。 数据发送与接收线:发送数据(TxD)通过TxD终端将串行数据发送到MODEM。接收数据(RxD)通过RxD线终端接收从MODEM发来的串行数据。2.2.4 数码管显示数码管段选与位选接口如图所示,设置强推挽输出,使数码管显示亮度增加。P0口与数码管段选之间接入1k的排阻限流,相比加上拉电阻会减少单片机的功耗。因为上拉电阻在IO口输出低电平时也会有电流,如果接入限流电阻就会避免这种情况,从而减少功耗。图2.4数码管显示原理图2.2.5按键模块本项目有六个按键,每个单片机三个。按键一端接地另一端接单片机的I/O口。S1、S2、S3分别标志点移位
17、键、加1键、菜单键。图2.5 按键原理图2.3 各单元模块设计流程图总设计框图两个单片机通信,每个单片机由四个模块组成。该项目原理图及PCB图是在Altium Deigner软件下设计的。设计框图如下图所示。图2.6总设计框图设计该项目软件设计使用的是Keil编程软件。图2.7主程序流程图UartInit(); /串口初始化Init_DS1302(5555);/初始化1302KeyScan(); /按键扫描DisPlayKey(); /按键响应操作GetTime( ); /获取当前ds1302的时间display(DisNum); /显示当前调整的时间display(SendNum); /显示
18、对目标单片机的调整的时间SendString(UartNum); /发送调整时间到目标单片机程序设计主要是对时间的设置函数:Write_Data(0x8e,0x00);/写保护关Write_Data(0x80,Sec); /初始秒值为50Write_Data(0x82,Min);/初始分钟值为59Write_Data(0x90,0x01); /充电Write_Data(0xc0,0xf0); /初始化一次标示Write_Data(0x8e,0x80); 按键程序设计按键扫描:图2.8按键扫描框图if( (P1 & 0xe0) != 0xe0 ) /扫描按键管脚是否有电平变化cKey = P1
19、& 0xe0; /读出键值while( (P1 & 0xe0) != 0xe0) ; /等待按键松开按键响应:图2.9按键响应框图void DisPlayKey(void) /按键响应/如果是对自己设置时间就将自己的时间装入调整数组if (flag = 1) temp0 = DisNum / 1000;temp1 = DisNum % 1000 / 100;temp2 = DisNum % 100 / 10;temp3 = DisNum % 10;/如果是对对方设置时间就将发送时间装入调整数组/根据键值调整 调整数组里的数字/组合调整后的数字/更改调整模式串口程序设计图2.10串口中断流程图S
20、CON = 0X50;/串口工作方式1TMOD = 0x20;/设定定时器1的工作方式为方式2(8位自动重装)TH1 = -3;/设置串口波特率为9600 TL1 = -3; TR1 = 1; /开启定时器ES = 1; /开串口中断/判断数据是否结束,校验if (uart_datanum-1 = * & uart_datanum-2 = *) 3 调试说明3.1 调试方法及步骤先使用Proteus仿真软件仿真无误后将软件下载到单片机上,再实物调试。两单片机中都下载进程序后,数码管均显示初始化值5555;选择一个主机一个从机,在主机的模块中按下菜单键S3调整模式此时显示3333,对主机设置时间
21、,主机时间从此时开始;按下标志位键选择需要调整的数,标志位的点在数字右下角;设置好主机时间后按下主机菜单键,此时显示4444表示对从机设置时间;通过标志位键和加1键设置从机时间,设置过程中主机设置的时间同步通信到从机中;设置完成后,按下菜单键,主机的数码管显示自己的时间,从机的时间从4444模式下被设置的时间开始。交换主机和从机,重复以上操作,完成本项目的通信操作。注意:主机在对从机设时间的同时自己也在计时。3.2 调试数据下面几图为Proteus仿真的步骤及数据:图3.1 初始化状态图3.2对主机设置时间图3.3 对从机设置时间图3.4完成时间设置3.3 故障分析硬件故障问题是电路板的问题主
22、要有元器件虚焊、损坏和是否接线错误;1.电阻虚焊问题:若电阻正常,则通过电阻两端后应该有一个电压值。根据这个原理,用万用表逐个测量各电阻两端的电压,若飘零则说明该电路没有焊好,短路或者电阻故障,应进一步确认故障原因并处理。2.数码管无法显示:可能是上拉电阻过大,导致显示不清晰;也可能数码管灯管已坏;上拉电阻正负接反。出现乱码,则可能是码表不正确,或是程序未做消隐处理。3.单片机不能下进程序:下载时下载口P3.1(TXD)被占用,或下载口排针虚焊。检查是否为虚焊,若不是,则在TXD处焊接排针引出,通信时用排针帽带上,下载时不用帽。4.按键按下数码管的时间不变:按键虚焊没有接入I/O口或中断程序出
23、错,或按键损坏。检查是否为损坏,是则换掉;若为虚焊,则按电机问题处理 ;若为程序出错可能是每个按键功能没有实现。3.4 设计注意事项:1.串行通信,使用的晶振是11.05926MHZ,波特率是9600两块板子除与DB9的连接线有一个要交叉相连外要严格一致。3.双机通信的基本原理是对RXD和TXD操作,RS23最大通信距离为15m。4.DS1302电路中的100uF电容只能保证在1个小时正常走时,要使掉电后再重新下载程序则要加上电池。4 总结设计体会和收获:最初选择这个项目是因为之前学过微计算机原理,但真正着手才发现做一个工程不单单是学过理论知识就行的。实际的工程中需要的不仅仅是理论还要考虑实际
24、的细节以及队员之间的团结和合理分工,这个课程考验了我们自觉性、动手能力与协作意识的任务,三个臭皮匠赛过诸葛亮,团队合作时我们更便于取长补短,相互讨论收获更大。通过这个项目的实践我们补充了之前不熟悉和没接触的知识对单片机的通信更加了解,学会使用时钟芯片和串口芯片。本项目完成了双机通信的基础要求和扩展要求,但硬件方面还可以更加完善多使用几个按键和数码管。5 参考文献1.单片机微型计算机原理及接口技术 郑郁正主编.北京:高等教育出版社,2021.72.MCS-51单片机多及通信的组成原理及通信程序 云南省邵通地区邮电局,彭宗乾 3.8051单片机实践与应用电子爱好者的电子书6 附录1.原理图图6.1
25、系统原理图图6.2RS232转接板原理图2.PCB图图6.3系统PCB3.实物图图6.44.程序代码/*主函数 */#include ds1302.h#include uart.h#include type.h#include delay.h#include key.h#include display.hvoid main(void)uint16_t timenum, NewTime;uint8_t UartNum10;UartInit(); /串口初始化Init_DS1302(5555);/初始化1302EA = 1;/开总中断while(1)KeyScan(); /按键扫描DisPlayK
26、ey(); /按键响应操作if (flag = 0) /菜单0GetTime( ); /获取当前ds1302的时间/转换时间 秒timenum = (DateTime04)*10+(DateTime0&0x0f); /转换时间 分timenum += (DateTime14)*1000+(DateTime1&0x0f)*100; display(timenum); /显示当前时间DisNum = 3333; /初始化标志位3333SendNum = 4444; /初始发送标志位4444if(flag = 1) /菜单1display(DisNum); /显示当前调整的时间Init_DS1302
27、(DisNum); /用当前调整的时间初始化ds1302if (flag = 2) /菜单2display(SendNum); /显示对目标单片机的调整的时间/将调整的时间转换成字符UartNum0 = (SendNum / 1000) + 0; UartNum1 = (SendNum % 1000 / 100) + 0;UartNum2 = (SendNum % 100 / 10) + 0;UartNum3 = (SendNum % 10) + 0;UartNum4 = *; /通信结束标志位UartNum5 = *;UartNum6 = 0;SendString(UartNum); /发送
28、调整时间到目标单片机if (uart_flag = 1) /串口接收标志位NewTime = 0; /接收到的设置时间/将接收到的字符时间转换成数字NewTime = (uart_data0- 0)*1000 +(uart_data1- 0)*100 +(uart_data2- 0)*10 +(uart_data3- 0);Init_DS1302(NewTime); /用接收到的新时间初始化1302uart_flag = 0; /标志位置零/*串口程序*/#include uart.hstatic uint8_t num = 0;bit busy = 0;uint8_t uart_flag;u
29、int8_t uart_data20;void UartInit(void)SCON = 0X50; /串口工作方式1TMOD = 0x20; /设定定时器1的工作方式为方式2(8位自动重装)TH1 = -3;/设置串口波特率为9600 TL1 = -3; TR1 = 1; /开启定时器ES = 1; /开串口中断void SendData(uint8_t dat) while (busy); /等待当前字符发送结束SBUF = dat; /发送数据 busy = 1;/*/*函数名称:字符串发送函数/*函数功能:发送一串字符/*入口参数:字符串首地址/*调用方式:SendString(asd
30、fghjk);*/void SendString(uint8_t *s) while (*s != 0) SendData(*s+); /发送字符 void UART_SER(void) interrupt 4 /串口中断 if (RI) /判断若为收 RI = 0;uart_datanum = SBUF; /读取SBUF到uart_DATA数组num+;/判断数据是否结束,校验if (uart_datanum-1 = * & uart_datanum-2 = *) uart_flag = 1;/将串口新数据标志位置1num = 0;/清零数组num if (TI) /判断若为发 TI = 0
31、; busy = 0; /*DS1302 */#include ds1302.huint8_t DateTime7;void Write_A_Byte_TO_DS1302(uint8_t dat) uint8_t i;SCLK=0;/初始时钟线置为0_nop_();_nop_();_nop_();/开始传输8个字节的数据for(i=0; i=1;/数据右移一位,准备传输下一位数据uint8_t Get_A_Byte_FROM_DS1302(void) uint8_t i, dat;_nop_();_nop_();_nop_();for(i=0;i=1; /要返回的数据左移一位if(IO=1)
32、/当数据线为高时,证明该位数据为 1dat|=0x80; /要传输数据的当前值置为 1,若不是,则为 0SCLK=1; /拉高时钟线_nop_();_nop_();_nop_();SCLK=0; /制造下降沿_nop_();_nop_();_nop_();return dat;/返回读取出的数据uint8_t Read_Data(uint8_t addr) uint8_t dat;RST = 0;SCLK=0;RST=1; Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302(); SCLK=1;RST=0;return dat;v
33、oid GetTime(void) uint8_t i,addr = 0x81;for(i=0;i7;i+) DateTimei=Read_Data(addr);_nop_();_nop_();_nop_();addr+=2;void Init_DS1302(uint16_t num)uint8_t temp4, Sec, Min;temp0 = num / 1000;temp1 = num % 1000 / 100;temp2 = num % 100 / 10;temp3 = num % 10;Min = temp0*16+temp1;Sec = temp2*16+temp3;Write_D
34、ata(0x8e,0x00); /写保护关Write_Data(0x80,Sec); /初始秒值为50Write_Data(0x82,Min); /初始分钟值为59/Write_Data(0x84,0x17); /初始为24小时模式 初始时间为23点/Write_Data(0x86,0x19); /19日Write_Data(0x90,0x01); /充电Write_Data(0xc0,0xf0); /初始化一次标示Write_Data(0x8e,0x80);void Write_Data(uint8_t cmd, uint8_t dat)RST=0; /初始 CE线置为 0SCLK=0; /
35、初始时钟线置为0RST=1; /初始 CE置为 1,传输开始/传输命令字,要写入的时间/日历地址Write_A_Byte_TO_DS1302(cmd); /写入要修改的时间/日期Write_A_Byte_TO_DS1302(dat); SCLK=1; /时钟线拉高RST=0; /读取结束,CE置为0,结束数据的传输/*按键程序*/#include key.huint8_t wei = 0;uint16_t DisNum = 0;uint16_t SendNum = 1234;uint8_t cKey = 7;uint8_t flag = 0;void KeyScan(void)/扫描按键管脚是
36、否有电平变化if( (P1 & 0xe0) != 0xe0 ) cKey = P1 & 0xe0; /读出键值while( (P1 & 0xe0) != 0xe0) ; /等待按键松开if(cKey = 0xc0) / P2.1按下 -wei+;if (wei = 4)wei = 0;if(cKey = 0xa0) / P2.2按下 +cKey = 3;if(cKey = 0x60)/ P2.2按下 +cKey = 5;void DisPlayKey(void) /按键响应uint8_t temp4; /如果是对自己设置时间就将自己的时间装入调整数组if (flag = 1) temp0 =
37、DisNum / 1000;temp1 = DisNum % 1000 / 100;temp2 = DisNum % 100 / 10;temp3 = DisNum % 10;if (flag = 2) /如果是对对方设置时间就将发送时间装入调整数组temp0 = SendNum / 1000;temp1 = SendNum % 1000 / 100;temp2 = SendNum % 100 / 10;temp3 = SendNum % 10;/根据键值调整 调整数组里的数字if (wei = 0)if (cKey = 3)temp0 += 1;if (temp0 = 10)temp0 =
38、0;cKey = 7;if (wei = 1)if (cKey = 3)temp1 += 1;if (temp1 = 10)temp1 = 0;cKey = 7;if (wei = 2)if (cKey = 3)temp2 += 1;if (temp2 = 10)temp2 = 0;cKey = 7;if (wei = 3)if (cKey = 3)temp3 += 1;if (temp3 = 10)temp3 = 0;cKey = 7;if (flag = 1) /组合调整后的数字DisNum = temp0*1000 + temp1*100 + temp2*10 + temp3;if (flag = 2)SendNum = temp0*1000 + temp1*100 + temp2*10 + temp3;if (cKey = 5) /更改调整模式flag+;if (flag = 3)