1系统概述
1.1设计要求
根据所学的知识以及技能,利用MCS-51系列单片机为中心设计一个简易电梯系统,实现四层电梯的无故障运行,并用数码管和指示灯显示对应楼层和运行方向等基本信息。设计所用的单片机为STC89C52为主要的控制器,自带AD转换,当一边有按键按下时,另一边以数字的形式在数码管上显示出相应的数字信息。
选择合适的芯片进行驱动电路的设计;
运行状态精确显示;
平层误差不超过±1cm。
总体设计
总的设计框图如图1-1所示,由单片机模块、矩形按键模块以及系统信息模块三个大模块构成,它们的作用分别为:
单片机模块:数据输入输出的处理。
矩形按键模块:通过按键,将相关信息送入单片机处理。
系统信息模块:用若干个发光二极管和数码管作为此模块的显示电梯的运行状态,如上行或下行、电梯目前到达的楼层等信息。
电机控制模块:电机运行的方向以及电机的速度控制。
其中单片机模块里面包括了电源模块、复位电路模块、时钟电路模块,当通过按键模块按下需要到达的楼层,经过单片机内部转换后在数码管上显示出来。同时对按键进行扫描,定位被按下的按键,确定目标楼层并检测途径楼层是否有被按下,上行下行通过灯的亮灭显示出来,驱动上下行电机进行正转或反转,检测到达指定楼层后上下行电机停止运转,目标楼层的指示灯亮,同时开关门电机进行正转实现开门,停留一段时间后电机反转实现关门。
图1-1总体设计框图
系统设计的整体方案
主控芯片的方案论证
方案一:51系列单片机
采用目前通用的单片机系列STC89C52芯片为核心控制器,其管脚图如图2-1所示,此单片机功能完善具有字节处理和位处理,软件编程灵活,容易显示各种控制功能,价格比较便宜,在市场上比较多见。
方案二:PIC系列单片机
采用PIC系列为核心控制器。与51系列单片机相比,其是一种精简指令型的单片机,指令数量较少,在传送和逻辑运算上都要比51系列单片机比较复杂,编写程序比较麻烦,抗干扰性不是很强,在市面上的使用不是很广泛。
综上所述,结合自己目前所学和比较熟悉的,51系列单片机是自己在校期间所运用最多的,所以对此单片机系统有较深刻的了解。而且要设计出一个相对简单且容易显示的系统,51系列单片机比PIC系列单片机更容易实现,因此设计使用方案一。
图2-1 STC89C52管脚图
显示模块的方案论证
方案一:LED数码管
采用LED数码管作为显示器件,其中数码管又分为共阴数码管和共阳数码管(数码管原理图如图2-2 所示)。使用数码管所构造的电路简单,程序设计也相对简单,关键是数码管价格低廉,设计成本少 ,显示亮度高。
方案二:LCD液晶显示器
采用LCD液晶为显示器件。虽然使用液晶显示屏可以显示很多内容,其构造的电路也简单,程序设计也简单,但是相比于数码管,其显示要求要高,对距离也有一定的要求,显示亮度低,成本上也相差很多。
综上所述,再结合上制作的电梯系统的设计显示方面要求较低,只需要显示运行时相对应的楼层即可,无需其他显示。所以在成本上使用数码管显示比较经济实在,因此设计选用方案一。
图2-2 数码管管脚图
电动机的方案论证
方案一:直流电机
采用直流电机为动力元件。其中直流电机又分为直流有刷电机和直流无刷电机,直流无刷电机成本高但寿命长噪声低;直流有刷电机成本低,使用简单,但生命短噪声大。直流电机的工作原理是只要有合适的电压就可以转动,所以在精度控制上不是很好。
方案二:步进电机
采用步进电机为动力元件。目前步进电机作为动力元件已经很广泛,其中42步进电机更是其行业最常用的步进电机尺寸。步进电机的工作原理大概是将脉冲信号转化为角位移的元件,当步进电机接收到一个脉冲信号时,它就可以向预设的方向转动一个固定的角度,从而达到精确定位的目的。同样可以通过控制脉冲频率来控制电机的转动速度,达到调速的目的。其不受太多外力的影响,控制简单。相比与直流电机的工作原理。步进电机是按照节拍工作的,可以调节很小的角度,在精确度上比较好把控。
综上所述,根据系统对运行的状态和精度有一定的要求,所以设计的动力元件要具有很好的把控力,因此设计使用方案二。
电机驱动模块的方案论证
方案一:L298N驱动
采用L298N电机驱动为控制器。其内置两个芯片,集成性较高,抗干扰能力强,转速可调。不过L298N构成的电路比较复杂,硬件电路连接较为麻烦。关键其成本还比较高。
方案二:A4988驱动
采用A4988电机驱动为控制器。A4988是一款带转换器和过流保护的DMOS微步进电机驱动器,它用于操作双极步进电机,在步进模式,输出驱动的能力35V和+2A 。其控制简单,只需要控制STEP与DIR两个端口; 具有精度调整,拥有五种不同的步进模式:全、半、1/4、1/8、1/16; 可调电位器可以调节输出电流,从而获得更高的步进率。其是一款成本低,体积小,容易设计控制电路。
综上所述,由于电机选用42步进电机,而且系统对于控制精度比较高,所以对比两个方案的性价比之下,选用方案二。
系统硬件电路设计
单片机最小系统的电路设计
STC89C52芯片模块电路设计
根据方案的选择,STC89C52作为所设计系统的主控芯片,将其端口恰当使用,以实现系统各个的功能。其端口分别可以控制数码管的显示,和电机驱动模块控制(脉冲信号)以及各个楼层的按键功能,设计使用单片机的P0口与数码管相连接,使用P1、P2口与楼层的按键和显示灯相连,使用P3^4、P3^5与电机驱动模块相接,电路设计简单,如图3-1所示。
图3-1 STC89C52电路设计图
系统时钟电路设计
时钟电路是产生像时钟一样准确运动的振荡电路。任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。时钟电路一般由晶体振荡器、晶震控制芯片和电容组成。时钟电路应用十分广泛。单片机运行需要时钟支持就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。在MCS-51单片机片内有一个高增益的反相放大器,反相放大器的输入端为XTAL1,输出端为XTAL2,由该放大器构成的振荡电路和时钟电路一起构成了单片机的时钟方式。如图3-2所示。
图3-2 时钟电路设计图
复位电路设计
对于一个完整的电子设计,其中一个关键就是系统复位电路的设计。其可以实现系统的还原和初始化功能。系统所设计的复位电路如图3-3所示,由R1、C1组成复位电路,刚上电时,C1是电压为0,电源开始对C1电容充电,此时的RST引脚处呈现高电平,高电平时间为10K*10UF=0.1S。也就是说在电脑启动的0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。在单片机启动0.1S后,电容C1两端的电压持续充电为5V,这是时候10K电阻两端的电压接近与0,当按下S1,电源电压接通到R1, 由于R1阻值比较大,此时电容开始迅速的放电,这个时候 R1处的电压再升高,所以RST引脚处又接受到高电平,即单片机系统自动复位。
图3-3 复位电路设计
电源电路设计
对于电子系统来讲,其最重要的是电源设计。没有电源提供电压,系统将不会运行。所设计的电梯系统由于需要双电源(单片机的供电电源5V和步进电机驱动的供电电源12V),因此设计一个降压模块,当输入电源为直流12V时,经过其模块内部的处理可以得到一个输出稳定的5V电压,这样就可以为单片机供电,其中的12V电压是为了给步进电机驱动提供电源的。然后在输出端设计一个由RC并联的滤波电路,RC并联电路既能通过直流信号又能通过交流信号,当接上电源时D1就会亮起,有个提示的功能。这样设计电路简单,应用性比较好。电路如图3-4所示。
图3-4 电源模块设计
数码管显示接口电路设计
根据方案选择设计,系统采用一位共阳数码管作为显示模块。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时需要公共极的COM接到地线VCC上,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。
设计的显示接口是用51单片机的P0口,如图3-5所示。在接通电源后,P0口处的输出电流很低,输出为低电平。因为P0口的片内没有上拉电阻,而P0为I/0口工作状态时,上方的FET被关断,从而输出脚浮空,即使驱动能力再怎么强,此时的输出都相当于没有接上电源。对于一位共阴极数码管,需要高电平才能驱动。所以在P0口处设计一个排阻(用作上拉电阻)是用来解决总线驱动能力不足时提供电流的,由电源通过这个上拉电阻给数码管提供电流。这就解决了P0口处输出的问题,使之一位共阴数码管可以点亮相应的字段。
图3-5 数码管电路设计图
按键控制电路设计
根据系统的要求,设计出了如图3-6所示的楼层按键控制电路图。大致就是分为两种功能:电梯外部按键功能和内部按键功能,利用51单片的P1^0~P1^5和P2^0~P2^4来控制实现电梯外部和内部按键的功能,其电梯外部按键分别为S4、S6、S8、S10、S11、S12(它们分别可以实现从电梯外部一楼到四楼上下行的功能),内部对应楼层的按键为S2、S3、S5、S7(它们分别可以实现从电梯内部按下到达对应楼层的功能)最后设计一个紧急按键控制功能(其可以实现紧急报警功能)。电路设计简单,编写程序不用太复杂,功能容易设计实现。
图3-6 楼层按键电路设计
显示灯电路设计
由系统要求所设计出的显示灯电路,是利用51单片机的P2^5~P2^7分别与上下行显示灯所连接的,可以编写程序控制着灯的显示和熄灭。当按下上行的按键时,上行灯与之对应(亮起),按下下行按键时,下行灯与之对应(亮起),当电梯系统出现故障时,则紧急灯亮起。电路设计简单,容易设计控制程序,如图3-7所示。
图3-7 电梯显示灯设计电路图
步进电机驱动模块电路设计
系统设计采用A4988模块作为电机驱动器,其是一款完整的微步电机驱动器,内置转换器,操作简单。设计的电路图如图3-8所示。该模块需要到双电源才能工作,所以设计VMOT接12V电源、VDD接一个5V电源。其中为了使模块能够稳定输出则将ENA口接地,接低电平则模块开始工作,接高电平则模块关机,而系统设计使用全步进模式(步进模式如表3-1所示),所以需要将MS1、MS2和MS3全接地。STEP是脉冲输入口,将它与单片机的控制口P3^4连接,往这个脚输入一个脉冲,则电机转动一步,也就是往这个脚持续输入脉冲,则电机持续转动。DIR是方向控制端,将它与单片机P3^5相连,其工作模式为低电平正转,高电平反转。1A、1B、2A、2B端与电机接口对应连接,电机才能正常工作。
表3-1 步进模式设置
MS1 | MS2 | MS3 | 微步分辨率 |
L | L | L | 全步 |
H | L | L | 半步 |
L | H | L | 四分之一步 |
H | H | L | 八分之一步 |
H | H | H | 十六分之一步 |
图3-8 步进电机驱动电路设计图
电机电路设计
依据整体设计方案,选用42步进电机作为动力元件,A4988作为驱动42电机的驱动器。42电机是一款二相式电机,其驱动方式是将四根导线分别与驱动器的1A、1B、2A和2B相连接。这样电机才能正常工作。电路设计如图3-9所示。
图3-9 电机电路设计图
系统软件设计
控制数码管显示的软件设计
首先将数码管的各个段码设置好,设计一个显示的子程序,其中的显示是按照四个二进制的排序来显示相应的数字,如输入口为0010时数码管上显示的是对应的数字为2。一开始将系统初始化定义,设置当前楼层为1层,楼层之差为0。当按下某层上行按钮时,电机开始正转,上行显示灯也相应的亮起,经过一段时间电机停止,电梯到达某一楼层,则这时候数码管就会显示按下对应楼层的层数。如果在电梯到达这一层之后,按下某层下行的按钮时。电机开始反转,经过一段时间后电机停止,则这时候电梯就会显示当前到达的楼层层数。如果在第一层按下第一层的按钮时,则会触发限位开关,这时候系统将会回归初始化状态,电机不会工作,数码管则显示当前为1层。直到按下上几层的按钮时电机点击才开始工作,此时数码管才会显示相对应的楼层的数字。流程图如图4-1所示。
图4-1 控制数码管显示流程图
控制步进电机驱动模块的软件设计
首先设计电机驱动模块的DIR口为1(DIR=0上行,DIR=1下行)让电机反转,而STEP口处则提供有一定延迟的脉冲信号,直到触发限位开关时,电机驱动停止工作,这时候电梯会显示在第一层,系统回归初始化状态。当电梯停止运转后若有呼叫请求(按键按下),则对呼叫楼层与当前所在楼层进行比较,若呼叫楼层大于当前所在楼层则会上行,若呼叫楼层小于当前所在楼层则会下行。单片机会扫描各个楼层呼叫信号,这样才可以确定电梯响应上升、下降。当按下上行按键时(呼叫请求),这时候电机的DIR为0、STEP为1,为上行呼叫请求。电机开始正转,相应的上行灯也会亮起,直到准确的到达某一楼层时(平层之差),STEP处变为0(STEP=0没有脉冲信号,STEP=1有脉冲信号)电机驱动才会停止工作。同样按下下行按键时,DIR则为1、STEP为1,为下行呼叫请求。电机开始反转,相应的显示模块也会亮起,也是只有准确到达平层之后,STEP出变为0时,电机驱动停止工作。流程图如图4-2所示。
系统实验
测试仪器
数字万用表
测试结果
首先接上电源,若电路板能够正常使用(电源灯会亮起等提示)这样就可以确认其能够被正常的使用,其次用万用表检测线路,如果没有出现导线接通不良或是虚焊的问题,万用表会显示相应的电压值,则出现线路没有接通就不会对应的电压值。将万用表的黑表笔放在地线上,红表笔放到单片机的+5V上,记下万用表上的数值为4.97V。同样在黑表笔放在地线上,红表笔放到电机驱动的+12V上,记下万用表上的数值为11.98V。数据如表5-1所示。然后就是电梯系统各个楼层的按键测试,将测试的结果分别写出。电梯运行状态的具体情况如表5-2所示(其中两个数字分别代表的是:第一个数字为对应楼层;第二个数字为上下行1为上行2为下行)。
表5-1 测试数据值
平层差 | +5V | +12V | |
预估值 | 1cm | 5V | 12V |
实际值 | 2mm | 5.04V | 12.01V |
表5-2 电梯运行状态表
电梯所在 楼层 电梯内 外呼叫按钮 |
一楼 | 二楼 | 三楼 | 四楼 |
S11 | 电梯停止 | 电梯下行 | 电梯下行 | 电梯下行 |
S21 | 电梯上行 | 电梯停止 | 电梯下行 | 电梯下行 |
S22 | 电梯上行 | 电梯停止 | 电梯下行 | 电梯下行 |
S31 | 电梯上行 | 电梯上行 | 电梯停止 | 电梯下行 |
S32 | 电梯上行 | 电梯上行 | 电梯停止 | 电梯下行 |
S42 | 电梯上行 | 电梯上行 | 电梯上行 | 电梯停止 |
S1 | 电梯停止 | 电梯下行 | 电梯下行 | 电梯下行 |
S2 | 电梯上行 | 电梯停止 | 电梯下行 | 电梯下行 |
S3 | 电梯上行 | 电梯上行 | 电梯停止 | 电梯下行 |
S4 | 电梯上行 | 电梯上行 | 电梯上行 | 电梯停止 |
部分程序:
#include #define uint unsigned int //无符号整形 #define uchar unsigned char//无符号字符形 uint lc = 1; //当前楼层 uint lcsx = 4; //楼层上限 int lcc = 0; //楼层差 int lcc2 = 0; //楼层差2 uint a1=0; uint a2=0; uint a3=0; uint a4=0; uint flag=0; uint x = 0,y = 0,z = 0; sbit btf11 = P1^0; sbit btf21 = P1^1; sbit btf22 = P1^2; sbit btf31 = P1^3; sbit btf32 = P1^4; sbit btf42 = P1^5; sbit btd0 = P2^4; sbit btd1 = P2^0; sbit btd2 = P2^1; sbit btd3 = P2^2; sbit btd4 = P2^3; sbit led1 = P2^5; sbit led2 = P2^6; sbit led3 = P2^7; sbit seg = P3^2; sbit sw = P3^3; sbit step = P3^4; sbit dir = P3^5;