《基于 51 单片机的模拟电梯模型设计.docx》由会员分享,可在线阅读,更多相关《基于 51 单片机的模拟电梯模型设计.docx(21页珍藏版)》请在工友文库上搜索。
1、第十二届智能控制设计大赛高级组之基于 51 单片机的模拟电梯模型队名: 队长: 队员: 队员: 专业:高分子材料成型及控制工程【简要说明】电梯间竖井模型高度为45cm。电梯轿厢模型通过滑轮悬挂并由电动机牵引,可在电梯井竖井模型的空间上下运动。电梯间竖井模型自下而上分成3层,每层间隔均为12cm。1、 设计要求1. 1基本要求:(1) 利用超声波测距传感器进行测距,实现电梯轿厢模型定高控制。(2) 当某层有呼叫时,显示呼叫信号,轿厢模型作相应的运动,并准确平层,平层误差小于等于1cm,平层结束时给出提示信号。(3) 完成基础人工电梯楼层显示界面(显示轿厢当前楼层编号和目前运动方向)。1.2拓展要
2、求:(1)增设模拟轿厢内表示乘客目标层数的按钮,轿厢模型将按照电梯模型运行规则作相应的运动; (2) 当有多层呼叫时,轿厢模型将按运行规则作相应的运动,并依次在呼叫的楼层停留;(3)快、中、慢三种电梯运行速度并且不受载重影响;(4)其他创新功能。二. 系统的硬件设计与实现2.1电路设计原理图1.单片机电路2. 按键矩阵电路2.2系统硬件概述本电路是由 STC89C52 单片机为控制核心,具有操作简单的优点。步进电机,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响。超声波测距模块,超声波模块精度能到1cm。显示屏LCD1602,蜂鸣器,矩阵按键。2.3 主要单元电路的
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 显示模块的设计在本计算器当中,16
4、02液晶显示当前的输入的数据和计算得出的数据。1602液晶具有如下的特性:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。2.3.3 按键调整系统矩阵按键与外部中断按键。我们在使用按键的时候有这样一种使用经验,当需要多个按键的时候,如果做成独立按键会大量占用IO口,因此我们引入了矩阵按键。矩阵按键
5、具有高效利用IO口的作用,在需要使用多个按键的场合十分地节省有限的单片机IO口资源。我们使用2 X 4的矩阵按键,其中有外部1楼向上键,外部2楼向下键,外部2楼向上键,3楼向下键,速度变化键,内部1楼键,内部2楼键,内部3楼键。键盘电路3、 系统的软件设计楼层显示电路STC89C52复位电路电机控制电路时钟电路电机状态显示四、作品功能实现5、 设计总结设计上,考虑到需要一个比较大的电梯模型,我们放弃的使用泡沫类模型材料,使用了质地比较好的木材,一方面可以提供负重,使绳子拉直且不随意抖动。另一方面,木材的质量会更加的好,能够支持起来,不容易损坏。我们将电路板等放置于模型的下方,让拉动电梯的绳子越
6、过顶部的横条,通过电机的旋转带动电梯向上向下运行。我们还加入了,多层楼呼叫识别,使电梯能够相应多层楼,顺路停下。我们使用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 /P0Uchar code motor_array0=0x01,0x03,0x02,0x06,0x04,
7、0x0c,0x08,0x09;/uchar code motor_array1=0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09; uchar UP; uchar DOWN;uchar stop_1; uchar stop_2; uchar movement=0; uchar moving=0; uchar velocity_rank=1; uchar velocity=14;uchar position;uchar position_stop;uchar floor_1; uchar floor_2; uchar floor_21;uchar floor_22;
8、 uchar floor_3; sbit TX=P20;/TRIG 16sbit RX=P21;/ECH0 17uint time=0; unsigned long distance; bit flag=0; sbit led_1=P25; sbit led_2=P26;sbit led_3=P27;sbit bee=P04;uchar digit_up;uchar digit_down;uchar digit_bee;uchar digit_led=0;uchar flag_led;/*LCD*/uchar code lcd1=Position:Floor 1;uchar code lcd2
9、=Position:Floor 2; uchar code lcd3=Position:Floor 3; uchar code lcdup= UP ; uchar code lcddown= DOWN ; uchar code lcdstop= STOP ;sbit RS=P26;sbit RW=P25;sbit E=P27;uchar code smgduan17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delayms(uint del) /1msuint i,j
10、;for(i=0;idel;i+) for(j=0;j=168;j+);void lcd_wcom(uchar com) RS=0;RW=0;P0=com;delayms(2);E=1;delayms(2);E=0;void lcd_wdat(uchar dat) RS=1;RW=0;P0=dat;delayms(2);E=1;delayms(2);E=0;void lcd_init()delayms(15);lcd_wcom(0x38);delayms(15);lcd_wcom(0x38);delayms(15);lcd_wcom(0x38);lcd_wcom(0x08);lcd_wcom(
11、0x0c);lcd_wcom(0x06);lcd_wcom(0x01);void lcd_1(uchar a)uchar m;lcd_wcom(0x80);for(m=0;m16;m+)lcd_wdat(am);delayms(1);void lcd_2(uchar a)uchar n;lcd_wcom(0x80+0x40);for(n=0;n0;c-) for(b=38;b0;b-) for(a=130;a0;a-);void delay40ms() /40ms unsigned char a,b,c; for(c=37;c0;c-) for(b=154;b0;b-) for(a=2;a0;
12、a-);void motor_Up()uchar b;uchar x;x+;if(x=velocity)motor_step=motor_array0b&0x0f;b+;if (b8)b=0;x=0;void motor_Down() uchar b;uchar x;x+;if(x=velocity)motor_step=motor_array1b&0x0f;b+;if (b8)b=0;x=0;void Key2X4() char a=0;key=0x0f;if(key!=0x0f)delay10ms();if(key!=0x0f)key=0X0F;switch(key)case(0X07):
13、KeyValue=0;keyboard=0;break;case(0X0b):KeyValue=1;keyboard=1;break;case(0X0d): KeyValue=2;keyboard=2;break;case(0X0e):KeyValue=3;keyboard=3;break;key=0X30;switch(key)case(0X20):KeyValue=KeyValue+4;keyboard=keyboard+4;break;case(0X10):KeyValue=KeyValue;keyboard=keyboard;break;while(a3)velocity_rank=1
14、;keyboard=8;break;switch(velocity_rank)case 1:velocity=14;case 2:velocity=10;case 3:velocity=6;if(flag_led=1) digit_led+; if(digit_led=30) led_1=1; led_2=1; led_3=1; digit_led=0; flag_led=0; void startmodule() TX=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _no
15、p_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();TX=0;while(!RX);TR1=1; while(RX);TR1=0;void conut() time=TH1*256+TL1; TH1=0; TL1=0; distance=(time*1.72)*10; if(distance=70000)|flag=1) flag=0; delay40ms();void TimeInit() TMOD=0x11; TH0=0xff; TL0=
16、0x9c; ET0=1; TR0=1; TH1=0; TL1=0; ET1=1; EA=1; void position_()if(distance=3000&distance=13000&distance=23000)position=3;lcd_1(lcd3);void positionStop() if(distance=3000&distance=12000&distance=22000&distance=10000) digit_bee=0; bee=1; if(stop_2!=0) digit_up+; if(digit_up=20000) UP=1; stop_1=stop_2;
17、 stop_2=0; movement=1; digit_up=0; if(DOWN=1) motor_Down(); if(position_stop=stop_1) DOWN=0; movement=0; stop_1=0; bee=0; else digit_bee+; if(digit_bee=10000) digit_bee=0; bee=1; if(stop_2!=0) digit_down+; if(digit_down=20000) DOWN=1; stop_1=stop_2; stop_2=0; movement=2; digit_down=0; TH0 = 0xff; TL0 = 0x9c; void time0() interrupt 3 flag=1;