基于 51 单片机的模拟电梯模型设计.docx
第十二届智能控制设计大赛高级组之 基于 51 单片机的模拟电梯模型 队名 队长 队员 队员 专业高分子材料成型及控制工程 【简要说明】 电梯间竖井模型高度为45cm。电梯轿厢模型通过滑轮悬挂并由电动机牵引,可在电梯井竖井模型的空间上下运动。电梯间竖井模型自下而上分成3层,每层间隔均为12cm。 1、 设计要求 1. 1基本要求 (1) 利用超声波测距传感器进行测距,实现电梯轿厢模型定高控制。 (2) 当某层有呼叫时,显示呼叫信号,轿厢模型作相应的运动,并准确平层,平层误差小于等于1cm,平层结束时给出提示信号。 (3) 完成基础人工电梯楼层显示界面(显示轿厢当前楼层编号和目前运动方向)。 1.2拓展要求 (1)增设模拟轿厢内表示乘客目标层数的按钮,轿厢模型将按照电梯模型运行规则作相应的运动; (2) 当有多层呼叫时,轿厢模型将按运行规则作相应的运动,并依次在呼叫的楼层停留; (3)快、中、慢三种电梯运行速度并且不受载重影响; (4)其他创新功能。 二. 系统的硬件设计与实现 2.1电路设计原理图 1.单片机电路 2. 按键矩阵电路 2.2系统硬件概述 本电路是由 STC89C52 单片机为控制核心,具有操作简单的优点。步进电机,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。超声波测距模块,超声波模块精度能到1cm。 显示屏LCD1602,蜂鸣器,矩阵按键。 2.3 主要单元电路的设计 2.3.1 单片机主控制模块的设计 STC89C52单片机为40引脚双列直插芯片,有四个I/O口P0、P1、P2、P3。MCS-51单片机共有4个 8 位的 I/O 口(P0、P1、P2、P3),每一条 I/O 线都能独立地作输出或输入。 单片机的最小系统如下图所示 ,18引脚和19引脚接时钟电路,XTAL1 接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入 ,XTAL2 接外部晶振和微调电容的另一端 , 在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。 2.3.2 显示模块的设计 在本计算器当中,1602液晶显示当前的输入的数据和计算得出的数据。 1602液晶具有如下的特性 显示质量高 由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 数字式接口 液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 功耗低 相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。 2.3.3 按键调整系统 矩阵按键与外部中断按键。我们在使用按键的时候有这样一种使用经验,当需要多个按键的时候,如果做成独立按键会大量占用IO口,因此我们引入了矩阵按键。 矩阵按键具有高效利用IO口的作用,在需要使用多个按键的场合十分地节省有限的单片机IO口资源。 我们使用2 X 4的矩阵按键,其中有外部1楼向上键,外部2楼向下键,外部2楼向上键,3楼向下键,速度变化键,内部1楼键,内部2楼键,内部3楼键。 键盘电路 3、 系统的软件设计 楼层显示电路 STC89C52 复位电路 电机控制电路 时钟电路 电机状态显示 四、作品功能实现 5、 设计总结 设计上,考虑到需要一个比较大的电梯模型,我们放弃的使用泡沫类模型材料,使用了质地比较好的木材,一方面可以提供负重,使绳子拉直且不随意抖动。另一方面,木材的质量会更加的好,能够支持起来,不容易损坏。我们将电路板等放置于模型的下方,让拉动电梯的绳子越过顶部的横条,通过电机的旋转带动电梯向上向下运行。我们还加入了,多层楼呼叫识别,使电梯能够相应多层楼,顺路停下。我们使用lcd1602液晶显示器来显示更多的电梯运行信息。 六、附录 附录 代码 include “reg52.h“ include “intrins.h“ define uchar unsigned char define uint unsigned int define key P3 uchar KeyValue; uchar keyboard; define motor_step P1 //P0 Uchar code motor_array0[]{0 x01,0 x03,0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09};//˳ʱÕë uchar code motor_array1[]{0 x08,0 x0c,0 x04,0 x06,0 x02,0 x03,0 x01,0 x09}; uchar UP; uchar DOWN; uchar stop_1; uchar stop_2; uchar movement0; uchar moving0; uchar velocity_rank1; uchar velocity14; uchar position; uchar position_stop; uchar floor_1; uchar floor_2; uchar floor_21; uchar floor_22; uchar floor_3; sbit TXP20;//TRIG 16 sbit RXP21;//ECH0 17 uint time0; unsigned long distance; bit flag0; sbit led_1P25; sbit led_2P26; sbit led_3P27; sbit beeP04; uchar digit_up; uchar digit_down; uchar digit_bee; uchar digit_led0; uchar flag_led; /**********************LCD****************************/ uchar code lcd1[]“PositionFloor 1“; uchar code lcd2[]“PositionFloor 2“; uchar code lcd3[]“PositionFloor 3“; uchar code lcdup[]“ UP “; uchar code lcddown[]“ DOWN “; uchar code lcdstop[]“ STOP “; sbit RSP26; sbit RWP25; sbit EP27; uchar code smgduan[17]{0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07, 0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71}; void delaymsuint del //1ms { uint i,j; fori0;i0;b-- fora130;a0;a--; } void delay40ms //40ms { unsigned char a,b,c; forc37;c0;c-- forb154;b0;b-- fora2;a0;a--; } void motor_Up{ uchar b; uchar x; x; ifxvelocity { motor_stepmotor_array0[b] b; if b8 b0; x0; } } void motor_Down { uchar b; uchar x; x; ifxvelocity { motor_stepmotor_array1[b] b; if b8 b0; x0; } } void Key2X4 { char a0; key0 x0f; ifkey0 x0f{ delay10ms; ifkey0 x0f{ key0X0F; switchkey { case0X07KeyValue0;keyboard0;break; case0X0bKeyValue1;keyboard1;break; case0X0d KeyValue2;keyboard2;break; case0X0eKeyValue3;keyboard3;break; } key0X30; switchkey { case0X20KeyValueKeyValue4;keyboardkeyboard4;break; case0X10KeyValueKeyValue;keyboardkeyboard;break; } whilea3 velocity_rank1; keyboard8; } break; } switchvelocity_rank { case 1velocity14; case 2velocity10; case 3velocity6; } } } ifflag_led1 { digit_led; ifdigit_led30 { led_11; led_21; led_31; digit_led0; flag_led0; } } } void startmodule { TX1; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; _nop_; TX0; whileRX; TR11; whileRX; TR10; } void conut { timeTH1*256TL1; TH10; TL10; distancetime*1.72*10; ifdistance70000||flag1 { flag0; } delay40ms; } void TimeInit { TMOD0 x11; TH00 xff; TL00 x9c; ET01; TR01; TH10; TL10; ET11; EA1; } void position_{ ifdistance3000 lcd_1lcd3; } } void positionStop { ifdistance3000 bee1; } ifstop_20 { digit_up; ifdigit_up20000 { UP1; stop_1stop_2; stop_20; movement1; digit_up0; } } } ifDOWN1 { motor_Down; ifposition_stopstop_1 { DOWN0; movement0; stop_10; bee0; } } else { digit_bee; ifdigit_bee10000 { digit_bee0; bee1; } ifstop_20 { digit_down; ifdigit_down20000 { DOWN1; stop_1stop_2; stop_20; movement2; digit_down0; } } } TH0 0 xff; ¯ TL0 0 x9c; } void time0 interrupt 3 { flag1; }