电子设计大赛训练设计报告基于AT89C52单片机的电梯控制模型系统设计.doc
电子设计大赛训练设计报告电梯控制模型 训练学生xxxxxx xxxxx xxxxx完成时间 2011年x月xx日目录目录2摘要3关键词3Abstract3Keywords3一、设计任务与要求4二、总体方案设计与论证41、控制器选择42、动力选择4三、硬件电路设计51、整体电路设计52、对电机的控制设计53、传感器模块设计74、键盘模块设计8四、软件设计101、整个系统程序设计思路10附加:总电路原理图14五、实际测试及结果分析14六、结束语14参考文献14附录:程序代码16摘要:本系统采用单片机(89C52)作为信号的检测和控制核心。使用按键按下与否带来的电平的改变来控制对应的单片机输入或输出口工作。楼层检测使用霍尔传感器;速度控制采用易控的步进电机子;基于这些完备而可靠的硬件设计,使用了一套软件算法,实现了电机在运动和加速及减速过程的精确控制。关键词:步进电机 单片机 传感器 Abstract: The system uses a microcontroller (89C52) as the signal detection and control of the core. Or use the button pressed to bring change to control the level of the corresponding single-chip input or output work. Floor inspection using Hall sensors; speed control with easy to control the stepper motor sub; these complete and reliable hardware design, using a set of software algorithms to achieve the motor acceleration and deceleration in the movement and precise control of the processKeywords: stepper motor microcontroller sensor一 设计任务与要求J2B CA D345F GE H DJ1M图1 电梯控制模型图1中:电梯间竖井模型部分可由有机玻璃粘成无上盖板的六面体ABCDEFGH,高度AE为1.2m;电梯桥厢模型J通过滑轮悬挂并由电动机M牵引,可在电梯间竖井模型的空间内上下运动。该电梯间竖井模型每隔20cm自下向上分成5层,其楼层编号如图1所示。设计并制作一个电梯控制模型。示意图如图1所示。(二)、 要求:1、 基本要求:(1) 当某层有呼叫并有呼叫信号显示时,桥厢模型作相应的运动,并准确平层,平层的位置误差£10mm。要求平均每层运行时间不超过5秒,平层结束时给出提示信号。(2) 当有多层呼叫时,桥厢模型将按说明中的电梯模型运行规则作相应的运动,并依次在呼叫的楼层停留5秒。(3) 能自动记录、显示桥厢模型当前到达的楼层编号。(4) 要求桥厢模型在加载400克的条件下,从1层到5层和从5层到1层的往返时间相等,单程时间不超过12秒,往、返时间之差不大于1秒,并自动记录、显示运行时间。2、 发挥部分:(1) 要求桥厢模型能够加载0500克的重物,显示并存储该物体的重量,显示分辨率为1克,误差:±3%。(2) 桥厢模型的额定负荷可以预置,当加载的物体超过预置值时,将发出超重报警信号。(3) 增设模拟桥厢内表示乘客欲到达层数的按钮,桥厢模型将按照电梯模型运行规则作相应的运动。(4) 其它。二、总体方案设计与论证 1、控制器选择本系统的系统板主要由MCS51系列单片机AT89C52组成。AT89C52有8K字节的片内ROM、256字节的片内RAM、3个16位定时器和六个中断源,其有8K字节的ROM足够本系统中的编程部分。此最小系统除了具有一般单片机最小系统的功能如地址锁存、输入输出控制外,另外它的主要特点是它的输出口部分接有液晶显示,可以数字显示各要输出的状态和数据,系统板的P1,P2,P3口经过三级管和发光二级管相接,可以显示各口线的实时工作状态。2、动力选择本设计用步进电机及其驱动器uln2003,我们首先,步进电机具有良好的可控性:起停迅速,控制简单,避免了惯性带来的误差,在低速情况下仍然具有良好的驱动力;其次,电机的负载满足承载一公斤左右的重量,符合要求;其三,步进电机性价比较高,更安全可靠。故我们采用此步进电机和其配套的驱动器。三、硬件电路设计1、整体电路设计 当外部人为操作电梯的指令发出,经过A/D转换和系统板二的处理后发出信号到系统板,系统板通过指令来控制步进电机的工作从而带动轿厢的运动。同时控制按键的控制、LED、数码管的显示、电动机的转动、传感器经A/D转换后输出的信号的处理等等。2、对电机的控制设计 由以上论证知,本部分设计采用MCS51-AT89C52单片机来完成,通过I/O口 输出的具有时序的方波作为步进电机的控制信号,信号经过芯片uln2003驱动步进电机通过uln2003构成步进电机的驱动电路,电路图如下图1所示。52的4个端口接uln2003的1-4输入端。另外,用键盘来对电机的状态进行控制,采用一个四位数码管显示当前楼层,想到达的楼层,运行时间。数码管采用直接驱动并接上拉电阻。如图二。 图一 图二3 传感器模块设计采用采用的是霍尔开关集成电路CS3144,CS3144 霍尔开关集成电路应用霍尔效应原理,采用半导体集成技术制造的磁敏电路,它是由电压调整器、霍尔电压发生器、差分放大器、史密特触发器,温度补偿电路和集电极开路的输出级组成的磁敏传感电路,其输入为磁感应强度,输出是一个数字电压讯号,输入输出关系如图4所示。CS3144 霍尔开关集成电路具有体积小,灵敏度高,响应速度快,温度性能好,精确度高,可靠性高等优点。CS3144 霍尔开关集成电路的功能方框图如图3所示。 图.3 图 .4霍尔传感器平层电路 当磁铁靠近的时候,霍尔输出低电平,单片机P1217引脚接霍尔的输出信号,这样通过程序查询是哪个楼层霍尔输出为低电平,就可知道电梯到达了哪个楼层并使数码管显示当前的楼层。outN图154 键盘模块设计按键电路P0口的八个引脚连接八个按键,分别是1,2,3,,楼电梯内外的按键及检修电路按键,。通过程序不断的查询1、2、3、楼层内、外是否按键按下来使单片机程序控制电梯运行。其按键如下图所示四、软件设计电源打开时,电梯轿厢停靠在任意位置。此时要判断是否有外招或内招,即判断是否应该工作。若有,则电机即要开始转动到指定位置,期间要继续检测是否还有外招或内招。若有,先判断是否在其工作的范围,若在其范围内,响应;若不在范围内,不响应。期间光电信号一直检测,看是否到达目的的,当到达时,即可停止。平层在停止的位置,一直等下一个内招或外招来临。2、电机控制部分(1)轿厢运行部分:我们知道,任何从静止开始的运动过程都要经过加速和减速的过程。故我们在程序的设计过程中把电机的运行过程分为加速、匀速和减速三个阶段。我们调节方波的频率大小来控制步进电机的转速,调节方波信号的个数来控制步进电机的转过的角度,达到控制轿厢移动高度。整个电机的运行过程大致如图3.1.1所示:附加:五、实际测试 略六、结束语首先感谢学院对学生电子设计竞赛的重视,给我们这样一次珍贵的锻炼机会!同时感谢各位老师对我们的信任,让我们参加此次培训,该设计完成了题目基本部分和发挥部分内容,经理论检测运行效果良好,可达到预期目的。通过本次竞赛,我们受益匪浅,终生难忘收益。我们不仅完成了一件作品,巩固和拓展了我们的专业知识,而且大大提高了我们的创新精神,动手能力,团队协作和竞争意识,这些在今后的人生道路上都将是一笔宝贵的财富。同时经过此系统的设计和制作,又提升了我对电子设计和制作的兴趣。用单片机和可编程逻辑器件编著的程序结合可以使电路和设计非常简单;系统的功能也比较稳定且容易控制;软硬件的结合无疑是这几年并且是今后相当长一段时间内的主流,对于今后的电子设计与制作的发展前景,我们充满信心。参考文献:1张齐 杜群贵著,单片机应用系统设计技术,电力工业出版社,2007.72童诗白 华成英主编,模拟电子技术基础 第三版,高等教育出版社,2006.123阎石主编,数字电子技术基础,高等教育出版社,2007.114谭浩强著,C程序设计 第三版,清华大学出版社,2006.65潘永雄 沙河著,电子线路CAD实用教程,西安电子科技大学出版社,2009.16李华主编,MCS-5系列单片机实用接口技术,北京航天航空出版社,2003.67陈杰 黄鸿著,传感器与检测技术,高等教育出版社,2008.2程序代码主函数#include<reg52.h>#include<intrins.h>#include"keyscan.h"#include"display.h"#define uint unsigned int#define uchar unsigned charsbit J=P24;sbit S=P25;sbit X=P26;sbit f1=P12;sbit f2=P13;sbit f3=P14;sbit f4=P15;sbit f5=P16;sbit A1=P10;sbit B1=P11;sbit C1=P17;sbit D1=P27;#define Coil_AB1 A1=1;B1=1;C1=0;D1=0;/AB相通电,其他相断电#define Coil_BC1 A1=0;B1=1;C1=1;D1=0;/BC相通电,其他相断电#define Coil_CD1 A1=0;B1=0;C1=1;D1=1;/CD相通电,其他相断电#define Coil_DA1 A1=1;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_A1 A1=1;B1=0;C1=0;D1=0;/A相通电,其他相断电#define Coil_B1 A1=0;B1=1;C1=0;D1=0;/B相通电,其他相断电#define Coil_C1 A1=0;B1=0;C1=1;D1=0;/C相通电,其他相断电#define Coil_D1 A1=0;B1=0;C1=0;D1=1;/D相通电,其他相断电#define Coil_OFF A1=0;B1=0;C1=0;D1=0;/全部断电unsigned char flag;unsigned char ucKeyCode;uchar bianshu;uchar changshu;uchar count,disnum;uchar key,temp;uchar gf,nf;/gf目的楼层,nf当前楼层uchar up_call5,down_call5,in_call5;/存放呼叫事件void check();void stop();unsigned char vKeyProcess(unsigned char ucKeyCode) /按键检测switch(ucKeyCode)case 11:in_call0=1;key=1,temp;break; /1楼内 case 12:in_call1=1;key=2;break; /2楼内case 13:in_call2=1;key=3;break; /3楼内case 14:in_call3=1;key=4;break; /4楼内 case 21:in_call4=1;key=5;break; /5楼内 case 22:up_call0=1;key=6;break; /1楼上case 23:up_call1=1;key=7;break; /2楼上case 24:down_call1=1;key=8;break; case 31:up_call2=1;key=9;break; /'1'case 32:down_call2=1;key=10;break; /'2'case 33:up_call3=1;key=11;break;case 34:down_call3=1;key=12;break;case 41:down_call4=1;key=13;break; /'3'case42:J=1;gf=1;disnum=0;flag=0;while(nf!=gf)check();if(nf=2)TR1=1;elseTR2=1;display(gf,disnum/10,disnum%10,nf);TR1=0;TR2=0;stop();PCON=0x02;key=14;break;case 43:;key=15;break; /'0'case 44:;key=16;break; /'+'default:break;return(key);void check()/霍尔楼层检测程序if(f1=0)nf=1;if(f2=0)nf=2;if(f3=0)nf=3;if(f4=0)nf=4;if(f5=0)nf=5; void stop()/停车报警程序 S=0;X=0;Coil_OFFTR0=0;disnum=0;TR0=1;delay(200);/while(vKeyProcess(ucKeyScan()!=15)/因为15已经有按下不能用来做标记while(disnum%10!=6)/一旦到时 跳出 vKeyProcess(ucKeyScan();check();display(gf,disnum/10,disnum%10,nf);TR0=0;disnum=0;if(nf!=gf)TR0=1;/上升程序void uper()S=1;TR0=1;flag=1;while(nf!=gf)vKeyProcess(ucKeyScan();check();X=0;S=1;display(gf,disnum/10,disnum%10,nf); if(nf=1&&gf=3) /电梯从一楼到三楼是否有顺路 vKeyProcess(ucKeyScan(); check();while(nf=1) vKeyProcess(ucKeyScan();check();X=0;S=1;if(in_call1|up_call1)TR1=1;else TR2=1;display(gf,disnum/10,disnum%10,nf);if(in_call1|up_call1) TR1=0;stop();in_call1=0;up_call1=0; if(nf=1&&gf=4) /电梯从一楼去4楼看2、3是否有人顺路 vKeyProcess(ucKeyScan();check();while(nf=1) vKeyProcess(ucKeyScan();check();/可能得到 2 3 X=0;S=1;if(in_call1|up_call1)TR1=1;elseTR2=1;vKeyProcess(ucKeyScan();display(gf,disnum/10,disnum%10,nf);if(in_call1|up_call1)/二楼有响应TR1=0;stop();in_call1=0;up_call1=0;while(nf=2)vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=0;TR2=0;if(in_call2|up_call2)TR1=1;elseTR2=1; vKeyProcess(ucKeyScan();display(gf,disnum/10,disnum%10,nf);if(in_call2|up_call2)/三楼有响应 TR1=0;stop();in_call2=0;up_call2=0;if(nf=1&&gf=5) /电梯从一楼去五楼看2,3,4是否有顺路 vKeyProcess(ucKeyScan();check();while(nf=1) vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=0;TR2=0;if(in_call1|up_call1)TR1=1;elseTR2=1;display(gf,disnum/10,disnum%10,nf);if(in_call1|up_call1)TR1=0;stop();in_call1=0;up_call1=0;while(nf=2)vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=0;TR2=0;if(in_call2|up_call2)TR1=1;elseTR2=1;display(gf,disnum/10,disnum%10,nf);if(in_call2|up_call2) TR1=0;stop();in_call2=0;up_call2=0;while(nf=3)vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=0;TR2=0;if(in_call3|up_call3)TR1=1;elseTR2=1;display(gf,disnum/10,disnum%10,nf);if(in_call3|up_call3)TR1=0;stop();in_call3=0;up_call3=0;/*从2楼3楼开始的电梯向上工作方式*/if(nf=2&&gf=4) vKeyProcess(ucKeyScan();check(); while(nf=2) vKeyProcess(ucKeyScan();check();X=0;S=1;if(in_call2|up_call2)TR1=1;elseTR2=1; display(gf,disnum/10,disnum%10,nf);if(in_call2|up_call2)TR1=0;stop();in_call1=0;up_call1=0; if(nf=2&&gf=5) /电梯从二楼去5楼看3、4楼是否有人顺路 vKeyProcess(ucKeyScan();check();while(nf=2) vKeyProcess(ucKeyScan();check();X=0;S=1;if(in_call2|up_call2)TR1=1;elseTR1=2;vKeyProcess(ucKeyScan();display(gf,disnum/10,disnum%10,nf);if(in_call2|up_call2)/三楼有响应TR1=0;stop();in_call2=0;up_call2=0;while(nf=3)vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=0;TR2=0;if(in_call3|up_call3)TR1=1;elseTR1=1; vKeyProcess(ucKeyScan();display(gf,disnum/10,disnum%10,nf);if(in_call3|up_call3)/四楼有响应 TR1=0;stop();in_call3=0;up_call3=0;if(nf=3&&gf=5)vKeyProcess(ucKeyScan();check();while(nf=3) vKeyProcess(ucKeyScan();check();X=0;S=1;if(in_call3|up_call3)TR1=1;elseTR2=1; display(gf,disnum/10,disnum%10,nf);if(in_call3|up_call3) TR1=0;stop();in_call3=0;up_call3=0; TR1=0;TR2=0; /while(nf!=gf) vKeyProcess(ucKeyScan();check();X=0;S=1;TR1=1;display(gf,disnum/10,disnum%10,nf);TR1=0;stop();/下降程序void downer()X=1;TR0=1;flag=0;while(nf!=gf)vKeyProcess(ucKeyScan();check();S=0;X=1;display(gf,disnum/10,disnum%10,nf);if(nf=5&&gf=1) /5楼去1楼看2、3、4是否有顺路vKeyProcess(ucKeyScan();check();while(nf=5)vKeyProcess(ucKeyScan();check();if(in_call3|up_call3)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf); if(down_call3|in_call3)TR1=0;stop();down_call3=0; in_call3=0;while(nf=4)vKeyProcess(ucKeyScan();check();TR1=0;TR2=0;if(in_call2|up_call2) TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf);if(down_call2|in_call2) TR1=0;stop();down_call2=0;in_call2=0;while(nf=3)vKeyProcess(ucKeyScan();check();TR1=0;TR2=0;if(in_call1|up_call1)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf);if(down_call1|in_call1) TR1=0;stop();down_call1=0;in_call1=0;if(nf=5&&gf=2)/5楼到2楼过程中看3,4楼是否有顺路vKeyProcess(ucKeyScan();check();while(nf=5)vKeyProcess(ucKeyScan();check();if(in_call3|up_call3)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf); if(down_call3|in_call3) TR1=0;down_call3=0;in_call3=0;stop();while(nf=4)vKeyProcess(ucKeyScan();check();TR1=0;TR2=0;if(in_call2|up_call2)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf); if(down_call2|in_call2) TR1=0;down_call2=0;in_call2=0;stop();if(nf=5&&gf=3)vKeyProcess(ucKeyScan();check();S=0;X=1;while(nf=5)vKeyProcess(ucKeyScan();check();if(in_call3|up_call3)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf); if(down_call3|in_call3) TR1=0;down_call3=0;in_call3=0;stop();/电梯从四楼三楼向下运动if(nf=4&&gf=1)/4楼到1楼过程中看2楼3楼是否有顺路vKeyProcess(ucKeyScan();check();while(nf=4)vKeyProcess(ucKeyScan();check();if(in_call2|up_call2)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf); if(down_call2|in_call2) TR1=0;down_call2=0;in_call2=0;stop();while(nf=3)vKeyProcess(ucKeyScan();check();TR1=0;TR2=0;if(in_call1|up_call1)TR1=1;elseTR2=1;X=1;display(gf,disnum/10,disnum%10,nf);if(down_call1|in_call1)TR1=0;down_call1=0;in_call1=0;stop();if(nf=4&&gf=2)vKeyProcess(ucKeySca