1. 实习目的与要求
1.1 实习目的通过本次实习的实施,增进对单片机的感性认识,加深对单片机理论方面的理解,掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等,了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。通过简单课题的设计练习,以此达到巩固、充实和综合运用所学知识解决实际问题的目的。
1.2 实习要求结合课题体系的实际需求及学生的实践能力、实验条件,进行实习。学生具体应该完成以下内容:
(1)绘制系统原理图;
(2)编制软件框图;
(3)完成详细完整的程序清单和注释;
(4)写出设计小结,对在完成以上文件过程中所进行的有关步骤、设计思想、指标论证、方案确定、元器件选择、原理分析等作出说明,并对所完成的设计作出评价,对自己整个设计工作中经验教训,总结收获和今后的研修方向。
1.3 设计课题选题及任务要求
1.3.1 设计课题选题 主从式串行通信
1.3.2 任务要求 1、从机采集电压(多个从机),主机显示;
2、主机可以设置从机的工作状态;
3、主机轮流显示从机电压。
2.系统设计2.1 系统电路结构
图1系统的总体方案
简单介绍该系统的功能:
1、主机通过独立按键来控制从机的两种工作模式:自动采集模式和手动采集模式。
2、当从机处于自动模式的时候,主机会循环发送指令,并且可以通过矩阵键盘来修改发送指令的间隔时间,从机收到指令后会返回电压数据。主机将得到的电压数据轮流显示在液晶屏幕上。
3、当从机处于手动模式的时候,主机通过矩阵键盘来控制当前你想得到那个从机的电压数据,按下键盘之后,主机就会给相应的从机发指令,从而得到从机的电压数据,并且显示在液晶上面。
2.2 具体功能模块电路设计2.2.1 单片机最小系统的设计本系统共用三块单片机,每块单片机均选用AT89C51,最小系统也都一样。
1、选用AT89C51的引脚功能
XTAL1:单芯片系统时钟的反向放大器输入端。
XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入33PF的小电容,可以使系统更稳定,避免噪音干扰而死机。
RST:重置引脚,高电平工作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其以上周期的时间便能完成系统重置的各项工作,使得内部特殊功能寄存器内容均被设成已知状态。
2、时钟电路
时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。
由于三块单片机的主要任务是通信,为了得到准确的波特率,采用振荡频率为12MHz的晶振,再接两个33pF的瓷片电容即可构成单片机的时钟电路。
3、复位电路
复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位。当按下按键时,就能完成整个系统的复位,使得程序重新运行。
单片机最小系统电路如下:
图2单片机最小系统电路
2.2.2 液晶显示电路设计LM016L:
引脚 符号 功能说明
1 VSS 一般接地
2 VDD 接电源(+5V)
3 VEE 液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4 RS RS为寄存器选择,高电平时选择数据寄存器,低电平时选择指令寄存器。
5 R/W R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。
6 E E(或EN)端为使能(enable)端,下降沿使能。
7 DB0 底4位三态、双向数据总线0位(最低位)
8 DB1 底4位三态、双向数据总线1位
9 DB2 底4位三态、双向数据总线2位
10 DB3 底4位三态、双向数据总线3位
11 DB4 高4位三态、双向数据总线4位
12 DB5 高4位三态、双向数据总线5位
13 DB6 高4位三态、双向数据总线6位
14 DB7 高4位三态、双向数据总线 7位(最高位)
图3液晶LM016L显示电路
电路接口说明:
AT89C51的P0口作为数据的输出端,P2.5和P2.6,P2.7作为控制信号的输出端。
2.2.3 矩阵键盘电路设计图4矩阵键盘电路
主机P1口接4×4的矩阵键盘,共16个按键,分别为0~15键。P1.0~P1.3接矩阵键盘的行,P1.4~P1.7接矩阵键盘的列。
2.2.4 独立按键电路设计图5独立按键电路
独立按键由两个按键分别接P2.0和P2.1口,另一端接地,通过按下时的低电平信号来控制从机的工作状态。
2.2.5 AD转换器模块图6 AD转换器电路
芯片接口说明:
· CS_ 片选使能,低电平芯片使能。
· CH0 模拟输入通道0,或作为IN+/-使用。
· CH1 模拟输入通道1,或作为IN+/-使用。
· GND 芯片参考零电位(地)。
· DI 数据信号输入,选择通道控制。
· DO 数据信号输出,转换数据输出。
· CLK 芯片时钟输入。
· Vcc/REF 电源输入及参考电压输入(复用)
ADC0832的工作原理:
正常情况下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时使用并与单片机的接口是双向的,所以在I/O口资源紧张时可以将DO和DI并联在一根数据线上使用。当ADC0832未工作时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完全结束。此时芯片开始转换工作,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则使用DI端输入通道功能选择的数据信号。在第一个时钟脉冲的下沉之前DI端必须是高电平,表示启始信号。在第二、三个脉冲下沉之前DI端应输入两位数据用于选择通道功能。
2.3 小结本文在研究单片机系统的基础上,设计了一种基于单片机AT89C51 的多机通信系统。目前有三个单片机,其中一个被设置成了主机,其他两块单片机为从机。主机通过串口向从机发送指定格式的数据,从机收到数据并作出响应,主机通过液晶屏显示通信信息,显示从第几个从机接收到的电压数据。在此多机通信系统中,各个从机具有平等的机会握手。握手成功主机开始向从机发送数据,并在液晶上显示,通过独立按键控制从机是自动轮流采集电压数据,还是再通过矩阵键盘手动获取从机的电压数据。只要主机单片机发送的地址也从机的地址相同时,从机才能跟主机进行握手否者就处于监听状态,此通信系统就为主从式多机通信系统。任何时刻,只要主机发送的地址信息可以与指定从机握手成功,其他各从机都是处于监听状态,主机与指定从机进行通讯。系统采用一台主机和多台从机,主机的RXD端与所有从机的TXD端连接,TXD端与所有从机的RXD端相连,主机发送的信息可被各从机接收,而各从机发送的信息只能由主机接收,各从机之间交换信息需通过主机。
3. 程序设计
3.1 程序结构本系统软件程序部分包括通信模块、键盘模块、液晶显示模块、中断服务和定时器等。3块单片机的程序均用C语言编写,采用Keil uVision5作为调试工具。
主机的程序流程图如下:
图7主机单片机程序流程图
键盘模块包括矩阵键盘按键扫描、获取键值与按键处理。按键处理是根据键值进行散转,又有多个函数用来实现不同的功能。通信子程序包括主机模式通信与从机模式通信。初始化模块包括定时器、串口、发送数据区与LCD初始化。其外还有LCD显示模块。
A、B从机单片机程序流程图如下:
图8 从机单片机程序流程图
3.2 具体功能程序设计
3.2.1 键盘程序设计主机的按键采用矩阵形式,4×4的行列矩阵,共16个按键,可以完成多种控制功能。独立键盘分为两个独立的按键用来控制从机的自动采集和手动采集模式。键盘程序包括:按键扫描、获取键值与按键处理几部分。按键处理又包括实现各种功能的函数。由键盘程序负责调度。键盘控制流程如下:
图9 按键控制流程图
矩阵键盘工作原理:由于按键没有接地,4行4列正好占用8个I/O如果4行我们送 P1.0到P1.3送入0 1 1 1 然后去读取 4列的值,如果P3.0的按键按下那么P1.4---P1.7的值等于 0 1 1 1,假如是第2个键按下的话那么读回来的值是 1 0 1 1 ,如果第3个键按下去读回来的值是 1 1 0 1 ,如果第4个键按下去读回来的值是 1 1 1 0,如果没有键按下去读回来就是1 1 1 1所以我们就根据读回来的值来判断按下去的是那个键。当然这是对P1.0这一行,因为矩阵键盘是扫描的,所以下次把P1.0 给P3.1 给0对第2行,陆续的第3 行第4行, 0111 1011 1101 1110而每次都去从新扫描一遍列值列有4个值,以确定是哪个键按下。无论何时任何一个时间有一个按键被按下就跳出循环。当然不可能有2个键刚好一起按下你的手没有这么好的力度,就算有2个键一起按键,程序也有先后检测的顺序,只能检测一个后面的检测不到。
独立按键工作原理:主机的P2.0口和P2.1口分别接控制手动和自动采集模式的独立按键,当按下手动按键,主机执行sendData(1)函数,功能为当再次按下矩阵键盘上value值为1的按键时,主机发送指令给从机A执行一次发送采集的电压数据给主机并在lcd液晶屏上显示,从机B同理。当按下自动按键,主机执行sendData(2)函数,功能为每隔一段时间主机发送指令给从机A执行一次发送采集的电压数据给主机并在lcd液晶屏上显示,时间间隔可由矩阵键盘14,15按键控制,每按下14按键一次,显示数据的间隔时间减少0.5秒,每按下15按键一次,显示数据的间隔时间增加0.5秒,默认间隔时间为1秒,下限为0.5秒,上限为99秒。
3.2.2 系统初始化程序设计系统初始化程序包括定时器初始化、串口初始化、发送数据初始化和全局变量初始化。初始化步骤如下:
图10系统初始化步骤
定时器初始化使定时器一工作在方式二,波特率设置为4800b/s,并开中断。串口初始化使串口工作在方式1,8位数据位。发送数据初始化在发送数据区存放待发送的数据串,以发送完成信号作为发送结束标志。全局变量初始化只需根据需要设置即可。
3.2.3 主从机通信协议设计通信协议的设计是本课题的重点难点,本题通信协议主要是区别主机和从机。 经查找资料,实现此多机通信的功能的方式是通过单片内硬件实现,下面对这种方式进行简单的介绍
多机通信协议:
由于串口的方式2、3发送和接收都是11位其第九为可编程置位可以此作为区分地址帧与数据帧从而实现主机与从机,从机与从机的区别。通信协议同样要规定相同通信速率,编写如下的通信协议:
1、数据传输的双方均使用4800b/s的速率传送数据,使用主从式通信,从机发送数据,,双方在发送数据时使用查询方式。主机接受数据使用中断接收。
2、双机开始数据传输时,从机发送地址帧呼叫主机。
3、各从机开始都处于发送地址帧状态。发送地址帧后,主机将接收到的地址内容和本机地址比较,如果地址相同,则向从机返回本机地址作为确认信息,并开始接收数据;如果不同,则继续等待。
4、主机在接收地址帧后等待,如果接收到的应答信息中的内容和所发地址帧的内容相同,就开始接收数据,如果不一致,从机将继续发送地址帧。如多次应答仍无回应则认为出错则主机跳出本次通信。
需要说明的是,从机通过ADC0832采集滑动变阻器的电压,经由AD转换后将8位电压数据发送到从机,从机在接收到主机的请求指令之后,将采集到的电压数据发送给主机,主机控制lcd液晶显示屏显示电压数据。
3.3 小结在为时一周的软件设计过程中,通过查阅资料和询问老师同学,我们组的两个人设计了这个主从式串行通信程序。下面总结一下本程序的核心思想。首先,本程序分为三个主要的部分,一是独立键盘和矩阵键盘的控制程序,这部分程序主要由主机来实现,按键用来控制整个系统的运行状态和模式。矩阵键盘中只用到了其中4个按键,其他按键可用于系统的拓展,比如通过RXD、TXD串口连接多个从机,同样可以用矩阵键盘来控制多个从机;二是系统中各部分的初始化程序,比如定时器初始化,串口初始化,发送接收数据初始化,lcd液晶显示屏初始化等;三是主从机通信协议的程序,这部分是主从机实现通信的关键所在,从机通过响应主机发送的指令来采集电压数据,并返回数据给主机。指令的确认成功即为主从机握手成功,即主从机实现通信。在整个设计过程中虽然遇到了各种问题,比如,主机的按键在不加消抖延迟程序的条件下很难响应按键按下的操作;lcd显示屏在没有清屏的操作下,有时候会出现显示错的情况;不过通过不断的修改和调试,最终把整个程序调试完成,做到了基本实现课题要求。
4. 系统运行或调试 采用Proteus Version 7.8作为运行和调试工具,过程如下:
1、开始仿真,从机默认状态为手动模式,由于未手动按下对应从机的控制矩阵键盘,主机未发送指令给从机,所以显示的电压为0.00V。
图11
2、当按下按键1(已设置按键1控制从机A),显示屏显示从机A采集的电压数据。
图12
3、当按下按键2(已设置按键2控制从机B),显示屏显示从机B采集的电压数据。
图13
4、这时改变滑动变阻器阻值,显示屏上的电压数据并没有改变。
5、当再次按下按键1或2,显示屏显示从机的实时电压数据。
图14
6、按下自动模式按键,显示屏上的“STOP”变为“START”, 从机切换到自动采集电压模式。定时时间初始值为1.0s,显示屏轮流显示两从机采集的电压,每个从机采集的电压数据每隔1.0s显示。
图15
7、按下按键14或者15(按键14已设置为将定时时间“-0.5”s,按键15已设置为将定时时间“+0.5”s),下图为按下三次15键的结果,定时时间由“1.0s”变为“2.5s”。
图16
8、改变滑动变阻器的阻值,显示屏上的电压数据随之改变,即显示屏显示从机采集的实时电压数据。
图 17
5. 总结两周的单片机课程设计终于顺利完成了,其中包含着快乐,也有辛酸。我们组选的设计题目是“主从式串行通信”,大家都觉得这个题目是比较简单的。其实不然,做了之后,发现设计电路虽然简单,但我认为它真正困难的地方是程序设计,不过在我们同心努力下最终完成了。
关于这次单片机实习,我花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次单片机课题设计的又一收获,在真正设计之前我们做了相当丰富的准备,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。在设计程序时,我们不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;养成注释程序的好习惯是非常必要的,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便;我觉得在设计课题过程中遇到问题是很正常,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的设计又出错了。
在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。如:矩阵键盘的工作原理和扫描程序,主从机通信协议采用什么样的标准比较合适等;经过查找相关资料和科技文献,和51黑电子论坛的同学们交流,一步步解决所遇到的困难。但是在解决这些问题的过程无疑是对自己自身专业素质的一种提高,同时也加深自己对专业技术的认识。通过单片机实习这一次的实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。从中也增强了我的团队合作精神,并让我认识到把理论应用到实践中去是多么重要。