基于51单片机实现的电梯模型设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

电梯模型设计报告
学院:自动化学院
队名:xxx
队员:xxx
日期:2009.11.20
一、概述
电梯模型以51为核心处理器,步进电机为控制电机,用L298N 搭建驱动电机模块,结合光电传感器实现对电梯的上升,下降,准确平层各种运行方式的控制。

利用矩阵键盘、ISD1760语音芯片,数码管等各种功能模块实现电梯的扩展功能及人机交互功能。

二、方案论证
方案一:直流伺服电机+光电传感控制方式。

优点:直流电机速度可以平滑调节,自带编码盘可以记录电梯运行位移,速度调节范围大。

缺点:用编码盘测量位移误差较大,对CPU运算处理要求较高而且直流电机运行时带有一定惯性,对平层带来较大难度。

方案二:步进电机+光电传感控制。

优点:步进电机可以用脉冲方式控制轿厢位移,配合光电传感模块可以准确实现轿厢平层;步进电机为输入脉冲时,电机可以卡死不发生转动,使得电梯在楼层处安全停止,等待相应操作。

缺点:步进电机转速较慢,速度控制要通过该变脉冲频率来调节,控制电路要求较高。

由于本作品为电梯模型,速度要求不高,通过单片机可以方便输出电机所需脉冲,配合L298芯片可以实现对步进电机的完美控制,
所以我们选择方案二。

三、详细设计方案
1.楼层模型设计
电梯模型采用易于加工的木材,选用1.2米长的木板作为模拟楼层,底座用三角架固定,确保电梯运行过程不会出现模型摇动现象。

电梯轨道处拉两根铁丝作为电梯导轨,保障电梯的运动轨迹。

轿厢用纸盒模拟代替,盒子敞开一面,可以放入物品,模拟乘客进出电梯。

2.驱动电路模块
控制电机选用四相步进电机,步进角为1.8度。

步进电机可以通过直流斩波改变顺序控制电机正反传,51单片机的定时/计数器可以模拟输出4路直流斩波,通过步进电机驱动电路控制步进电机。

驱动电路以L298N驱动芯片为核心部件,L298N芯片的电平电压与51单片机兼容,驱动电压可达50V完全可以驱动电梯模型所用控制电机。

驱动电路如下图:
四个输出端分别接步进电机的四个脉冲输入端,通过定时计数器模拟输出的四路直流斩波控制L298N的输出端口,从而可以方便的控制步进电机。

电机的运转速度可以通过调节直流斩波的频率来控制。

同时,通过对脉冲个数的控制,也可以粗略了解轿厢运行的位移,配合光电模块,将使电梯平层更加便捷、准确。

3.光电传感模块
为了确保准确平层,每层楼都安装红外对管,用于检测轿厢是否运行至楼层,若检测到轿厢运行至目标楼层,则像CPU发出中断请求,执行电梯停止运行操作。

红外对管原理:红外对管由发射和接受两部分组成,发射的
红外线京轿厢反射后被接受管接受后,引起电平跳变CPU根据此信号做出相应命令。

电路原理图如下:
4.楼层按键设计
为了模拟乘客在轿厢内对电梯的控制,我们扩展了一个4*4的键盘,用于乘客选择楼层及轿厢内的一些控制按钮,考虑到实验的原因,控制键盘并未装在轿厢内部,而是引到模型外面,便于演示。

本模型用到两个4*4矩阵键盘,一个用于楼层级轿厢控制,另一个用于密码和其他设置,接口原理相同。

5.语音播放模块
本模型加入了语音播放功能,及时播放轿厢运行状况,所有录音内容均为小组设计,是本模型人机交互人性化设计一个重要部分。

语音播放模块以ISD1760语音芯片为核心, ISD1700系列芯片是华邦公司新推出的单片优质语音录放电路,该芯片提供多项新功能,包括内置专利的多信息管理系统,新信息提示。

语音芯片提前录入“欢迎乘坐长颈鹿电梯”、报告层数的语音数据,电梯平层后,CPU会输出脉冲控制芯片,喇叭发出欢迎语音和层数提示。

ISD电特性及应用电路如下:
ISD1700电特性:
.工作电压:2.4V-5.5V,,最高不能超过6V
.静态电流:0.5 - 1 μA
.工作电流:20mA
电路图如下:
语音变化信号由15脚输出,采用简单的三极管电流放大电路,接入小喇叭,实现语音输出。

小喇叭参数:8欧,0.5W。

6.电源切换部分
考虑到紧急停电情况,用电池作为备用电源,停电时用继电器切换至备用电源,在备用电源供电情况下,控制轿厢运行到附近楼层,若检测到不是短时停电,则控制电梯在备用电源供电下运行。

电路原理图如下:
7.负载控制部分
本模型采用光电方式控制额定负载,输出电压信号经AD转换为0-255之间的数字信号输入CPU。

单片机将输入值的大小与设定额定
值比较,若超过额定值,则发出报警音,同时像电机控制CPU发送超载信号,电机控制CPU停止运行。

若要改变额定负载值,可以用相应按键设置,改变程序中存储的额定负载值即可。

8.中央处理器部分
本作品使用3片51单片机配合使用来控制整个系统,单片机之间通过通信达到信息传递。

单片机接口原理图(主要功能CPU)如下:
主控CPU;
电机控制CPU:
功能扩展CPU:
四、调试过程
各个模块均可以独立正常运行,通过单片机系统总线将各个模块连接起来,实现了预期结果。

五、程序流程图
电机控制CPU:
功能扩展CPU:
六、程序清单
主控制CPU:
#include<reg52.h>
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
/*******函数声明********/
void init();//初始化?
void keyscan();//键盘扫描
void delay1ms(unsigned int count);//延时程序
void runto(unsigned int lou);//电梯运行程序void show();
//code unsigned char LedTab[]=
//{
// 0xc0, 0xf9, 0xa4, 0xb0,
// 0x99, 0x92, 0x82, 0xf8,
// 0x80, 0x90, 0x88, 0x83,
// 0xc6, 0xa1 ,0x86 ,0x8e, 0xff
//};/*数码管十六进制编码表*/
code unsigned char LedTab[]=
{
0xff, 0x7e, 0xbe, 0xde, 0xee,
0xed, 0x77, 0x7b, 0x7d,
0xbd, 0xdd, 0xbb, 0xdb,
0xeb, 0xb7 ,0xd7 ,0xe7
};/*数码管十六进制编码表**
/******变量声明********/
static int fangxiang=1,weizhi=0,mudi,shijian=3000;//电梯的状态,位置
static unsigned int shang[6]={0,0,0,0,0,0},
xia[6]={0,0,0,0,0,0},
led[17];//各层的信息,“1”表示有人按键
int m,n,k,temp;
unsigned char text;
void main()
{
init();
P1=0x0f;
while(1)
{
while(P0_1==0)
{
EA=0;
}
while(P0_0==0)
{
EA=0;
}
while((P0_0==1)&&(P0_1==1))
{
EA=1;
show();
if(fangxiang==1)//从当前位置向上检测,当检测到最近呼叫层时向CPU3发出目标信号
{
for(m=weizhi;m<6;m++)
if(shang[m]==1)
{
temp=1;
mudi=m;
SBUF=mudi;
//shang[m]=0;
goto A;
}
fangxiang=-1;//当向上没有检测到呼叫时,从6楼往下检测
for(m=5;m>=0;m--)
if(xia[m]==1)
{
temp=0;
mudi=m;
SBUF=mudi;
//xia[m]=0;
goto A;
}
fangxiang=1;//当向上没有检测到呼叫时从1楼网上检测
for(m=0;m<weizhi;m++)
if(shang[m]==1)
{
temp=1;
mudi=m;
SBUF=mudi;
//shang[m]=0;
goto A;
}
}
else if(fangxiang==-1)//从当前位置向上检测,当检测到最近呼叫层时向CPU3发出目标信
{
for(m=weizhi;m>=0;m--)
if(xia[m]==1)
{
temp=0;
mudi=m;
SBUF=mudi;
//xia[m]=0;
goto A;
}
fangxiang=1;
for(m=0;m<6;m++)
if(shang[m]==1)
{
temp=1;
mudi=m;
SBUF=mudi;
//shang[m]=0;
goto A;
}
fangxiang=-1;
for(m=5;m>weizhi;m--)
if(xia[m]==1)
{
temp=0;
mudi=m;
SBUF=mudi;
//xia[m]=0;
goto A;
}
}
A: show();
if(weizhi==mudi)//当到达目的层时注销呼叫标记
{
if(temp==1)
{
shang[mudi]=0;
led[mudi+6]=0;
led[mudi+11]=0;
}
else if(temp==0)
{
xia[mudi]=0;
led[mudi+1]=0;
led[mudi+11]=0;
}
delay1ms(shijian) ;
}
}
}
}
/****程序初始化*****/
void init()
{
EA=1;//开总中断
EX0=1;//开处部中断0
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
ET0=1;//开计时器0
TR0=1;//开机计时
TMOD=0x21;//设置定时器1为工作方式2 TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
ES=1;
}
/*外部中断0 */
void into0() interrupt 0 using 0
{
shijian+=2000;
if(shijian>=8000)
shijian=3000;
}
/*计时器0*/
void timer0() interrupt 1 using 1
{
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
show();
keyscan();
}
/*计时器1*/
void timer1() interrupt 3 using 3 {
}
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
text=SBUF;
weizhi=text;
}
if(TI==1)
{
TI=0;
}
}
void show()
{
unsigned int r;
for(r=0;r<=16;r++)
{
if(led[r]==1)
P1=LedTab[r];
}
}
/*延时程序*/
void delay1ms(unsigned int count) {
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++)
;
}
/*键盘扫描*/
void keyscan()
{
int temp;
show();
P2=0xfe;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:shang[0]=1;led[6]=1;
break;
case 0xde:{if(fangxiang==1)
shang[3]=1;
else xia[3]=1;
led[14]=1;}
break;
case 0xbe:{if(fangxiang==1)
shang[4]=1;
else xia[4]=1;
led[15]=1;}
break;
case 0x7e:{if(fangxiang==1)
shang[5]=1;
else xia[5]=1;
led[16]=1;}
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:{if(fangxiang==1)
shang[0]=1;
else xia[0]=1;
led[11]=1;}
break;
case 0xdd:{if(fangxiang==1)
shang[1]=1;
else xia[1]=1;
led[12]=1;}
break;
case 0xbd:{if(fangxiang==1)
shang[2]=1;
else xia[2]=1;
led[13]=1;}
break;
case 0x7d:xia[5]=1;led[5]=1;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xeb:shang[1]=1;led[7]=1;
break;
case 0xdb:shang[2]=1;led[8]=1;
break;
case 0xbb:shang[3]=1;led[9]=1;
break;
case 0x7b:shang[4]=1;led[10]=1;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xe7:xia[1]=1;led[1]=1;
break;
case 0xd7:xia[2]=1;led[2]=1;
break;
case 0xb7:xia[3]=1;led[3]=1;
break;
case 0x77:xia[4]=1;led[4]=1;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
}
}
}
}
电机控制CPU:
#include<reg52.h>
sbit P0_0=P0^0;
sbit P0_1=P0^1;
sbit P0_2=P0^2;
sbit P0_3=P0^3;
sbit P0_4=P0^4;
sbit P0_5=P0^5;
sbit P0_6=P0^6;
sbit P0_7=P0^7;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_4=P2^4;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
static int step_n,fangxiang=1,k=1,mudi=3,weizhi=0;//K=1时电机运行unsigned char text,temp;//中间变量,存放通信口收到的信息
void init();
void step();//电机运行程序
void play(int count);
void delay1ms(unsigned int count);//延时程序
void check();//红外扫描
int shudu=5,yuyin;
code unsigned char m_ucLedTab[]=
{
0x7e,0xc4,0x54,0x72,0x51,0x41
};/*数码管十六进制编码表*/
void main()
{
init();
delay1ms(100);
play(1);
delay1ms(300);
while(1)
{
while(k==3)//停电时的乘序
{
if((P0_0==1)&&(P0_1==1))
k=0;
temp=P0;
temp=temp&0xfc;
while(temp==0xfc)
{
temp=P0;
temp=temp&0xfc;
step();
delay1ms(8);
}
P1=m_ucLedTab[weizhi];
check();
mudi=weizhi;
}
while(k!=3)//正常模式下电梯的运作
{
if(k==1)
step();//电机单步运行
if(P0_0==0)//断电信号
k=3;
while(P0_1==0);//超载信号
delay1ms(5);
if(k!=3)
{
check();
P1=m_ucLedTab[weizhi];
if(weizhi<mudi)
{
k=1;
fangxiang=1;
yuyin=0;
}
else if(weizhi>mudi)
{
k=1;
fangxiang=-1;
yuyin=0;
}
else if(weizhi==mudi)
{
k=0;
if(yuyin==0)
play(weizhi+2);
delay1ms(50);
yuyin++;
}
P1=m_ucLedTab[weizhi];
}
}
}
}
void play(int count)//语音播放程序
{
int b;
P3_5=0;
delay1ms(40);
P3_5=1;
for(b=0;b<=count;b++)
{ P3_6=0;
delay1ms(200);
P3_6=1;
delay1ms(200);
}
P3_7=0;
delay1ms(50);
P3_7=1;
}
void into() interrupt 0
{
}
void time1() interrupt 1
{
{
TH0=(65535-5500)/256;
TL0=(65535-5500)%256;
}
}
void ser() interrupt 4
{
if(RI==1)
{
RI=0;
text=SBUF;
if((text<6)&&(text>=0))
mudi=text;
}
if(TI==1)
{
TI=0;
}
}
void init()
{
TMOD=0X20;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
TH1=0xfd;//设置波特率
TL1=0xfd;
TR1=1;
REN=1;//允许接收
SM0=0;
SM1=1;//设置通信方式1
ES=1;//开通信中断
//ET0=1;
//EX0=1;//开外部中断0
//EX1=1;
//IT0=1;//跳边缘触发
//IT1=1;
//TR0=0;
}
/****红外传感器的扫描***/ void check()
{
P0=0xff;
if(P0_2==0)
{
weizhi=0;
SBUF=0;
}
if(P0_3==0)
{
weizhi=1;
SBUF=1;
}
if(P0_4==0)
{
weizhi=2;
SBUF=2;
}
if(P0_5==0)
{
weizhi=3;
SBUF=3;
}
if(P0_6==0)
{
weizhi=4;
SBUF=4;
}
if(P0_7==0)
{
weizhi=5;
SBUF=5;
}
{
}
}
/*****电机运行程序*****/ void step()
{
switch(step_n)
{
case 0:
{
P2=0x8f;
}
break;
case 1:
{
P2=0x1f;
}
break;
case 2:
{
P2=0x4f;
}
break;
case 3:
{
P2=0x2f;
}
break;
}
if(fangxiang==1)
{
step_n++;
if(step_n>3)
step_n=0;
}
else if(fangxiang==-1)
{
step_n--;
if(step_n<0)
step_n=3;
}
}
void delay1ms(unsigned int count) {
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<130;j++)
;
}
扩展功能CPU:
#include<reg52.h>
#include<EEPROM.H>
#define LED7_STATUS P0/*数码管状态引脚(0为有效,1为无效)*/
sbit LED7A_STATUS= P1^3;/*数码管第一位控制引脚(0为有效,1为无效)*/ sbit LED7B_STATUS = P1^4;/*数码管第二位控制引脚(0为有效,1为无效)*/ sbit LED7C_STATUS = P1^5;/*数码管第三位控制引脚(0为有效,1为无效)*/ sbit LED7D_STATUS = P1^2;/*数码管第四位控制引脚(0为有效,1为无效)*/ sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit SPK = P3^7;
sbit AD_CLK = P1^0;/*AD转换时钟端*/
sbit AD_SDA = P1^2;/*AD转换数据端*/
unsigned char frq;
/*******函数声明*******/
void init();//程序初始化
void keyscan();//键盘扫描
void delay1ms(unsigned int count);//延时程序
void Led7Scan();//数码管显示程序
unsigned char AD_Read();
/*******变量声明******/
code unsigned char m_ucLedTab[]=
{
0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90,
0x88, 0x83, 0xC6, 0xa1 ,0x86 ,0x8e, 0xff
};/*数码管十六进制编码表*/
unsigned char temp;//中间变量
static unsigned int cod[4],k=0,mima=0,a=1;//密码
int num[16]={16,16,16,16};//数码管显示缓冲数
int n,m,mode=0;//中间变量
unsigned char AD_Buf;/*AD转换存储*/
int huanjing=160,zhongliang[5]={999,30,80};
int caozai=19999;
/*****函数内容****/
void main()
{
init();
for(n=0;n<4;n++)
num[n]=cod[n];
while(1)
{
Led7Scan();
while(mode==0)//超载模式
{
unsigned char AD_Buf;
AD_Buf=AD_Read();//读取AD传来的数据
delay1ms(500);
while((huanjing-AD_Buf)>caozai)
{
P1=0xc3;
P0=((P0>>1)|(P0<<7));
keyscan();
for(n=0;n<60;n++)
{
frq++;
delay1ms(1);
a=0;
}
P3_1=0;
}
keyscan();
}
while(mode==1)
{
Led7Scan();
{
while(k<4)
{
keyscan();//输入4个数
}
if(mima==0)
{
if(k==4)
{
for(n=0;n<4;n++)
{
if(cod[n]!=num[n])//判断密码是否正确
a=0;
}
if(a==0)//输入的密码错误
{
for(n=0;n<4;n++)
num[n]=16;
TR0=0;
P0=0xfe;
while(a==0)
{
P1=0xc3;
P0=((P0>>1)|(P0<<7));
keyscan();
for(n=0;n<60;n++)
{
frq++;
delay1ms(1);
}
}
}
else
{
mima=1;//密码正确
P3_0=0;
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
num[n]=cod[n];
}
delay1ms(150);
for(n=0;n<4;n++)
{
num[n]=16;
}
delay1ms(150);
}
num[3]=AT24C02ReadByte(5);
num[3]++;
AT24C02WriteByte(5,num[3]);
}
}
}
else if(mima==1)
{
for(n=0;n<4;n++)
{
cod[n]=num[n];
AT24C02WriteByte(n,cod[n]);
delay1ms(5);
}
}
}
mode=0;
}
}
}
void init()
{
unsigned int i;
for(i=0;i<4;i++)
{
cod[i]=AT24C02ReadByte(i);
delay1ms(5);
}
EA=1;
EA=1;//开总中断
EX0=1;//开处部中断0
TH0=(65535-20000)/256;
TL0=(65535-20000)%256;
ET0=1;//开计时器0
TR0=1;//开机计时
TMOD=0x11;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
ET1=1;
TR1=1;
}
void timer0() interrupt 1
{
{ Led7Scan();
TH0=0xec;/*重新设置T0定时值*/
TL0=0x78;
//Led7Scan();
}
}
void timer1() interrupt 3
{
if(a==0)
{ TH1 = 0xfe;
TL1 = frq;
SPK = ~SPK;
}
}
/**************************************************************************** 名称: Led7Scan()
说明: 数码管动态扫描处理程序
参数: 无
返回: 无
*****************************************************************************/ void Led7Scan()
{
static unsigned char a=0;
switch(a)/*判断数码管动态扫描值*/
{
case 0:/*处理数码管第一位*/
LED7D_STATUS=1;/*设置数码管第四位为无效*/
LED7A_STATUS=0;/*设置数码管第一位位有效*/
break;
case 1:/*处理数码管第二位*/
LED7A_STATUS=1;/*设置数码管第一位为无效*/
LED7B_STATUS=0;/*设置数码管第二位位有效*/
break;
case 2:/*处理数码管第三位*/
LED7B_STATUS=1;/*设置数码管第二位为无效*/
LED7C_STATUS=0;/*设置数码管第三位位有效*/
break;
case 3:/*处理数码管第四位*/
LED7C_STATUS=1;/*设置数码管第三位为无效*/
LED7D_STATUS=0;/*设置数码管第四位位有效*/
break;
}
LED7_STATUS=m_ucLedTab[num[a]];/*将显示码送数码管状态引脚*/
a++;/*数码管动态扫描值加1,若该值4则置为0*/
if(a>3)
a=0;
}
unsigned char AD_Read()
{
unsigned char i,ADC;
AD_CLK=0;
AD_SDA=1;
ADC=0;
for(i=0;i<8;i++)
{
AD_CLK=1;
AD_CLK=1;
ADC<<=1;
if(AD_SDA==1)
{
ADC|=0x01;
}
else
{
ADC&=0xfe;
}
AD_CLK=0;
AD_CLK=0;
}
AD_CLK=0;
AD_SDA=0;
return(ADC);
}
/****延时程序*****/
void delay1ms(unsigned int count) {
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++)
;
}
/*******键盘扫描********/
void keyscan()
{
P2=0xfe;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xee:num[0]=10;
{
mode=1;
a=1;
k=0;
TR0=1;
SPK=1;
for(n=0;n<4;n++)
num[n]=16;
num[0]=10;
}
break;
case 0xde:
{mode=0;
for(n=0;n<4;n++)
num[n]=16;
}num[0]=11;//huanjing=AD_Read();
break;
case 0xbe:num[0]=12;mode=3;
break;
case 0x7e:num[0]=13;mode=4;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
Led7Scan();
}
}
}
P2=0xfd;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xed:{if(mode==1)
{ num[k]=1;
k++;}
if(mode==0)
{num[3]=1;caozai=zhongliang[0];}
}
break;
case 0xdd:{if(mode==1)
{ num[k]=4;
k++;}
}
break;
case 0xbd:{if(mode==1)
{ num[k]=7;
k++;}
}
break;
case 0x7d:{for(n=0;n<4;n++)
num[n]=16;
}
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
Led7Scan();
}
}
}
P2=0xfb;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xeb:{if(mode==1)
{ num[k]=2;
k++;}
if(mode==0)
{num[3]=2;caozai=zhongliang[1];}
}
break;
case 0xdb:{if(mode==1)
{ num[k]=5;
k++;}
}
break;
case 0xbb:{if(mode==1)
{ num[k]=8;
k++;}
}
break;
case 0x7b:{if(mode==1)
{ num[k]=0;
k++;}
}
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
Led7Scan();
}
}
}
P2=0xf7;
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
delay1ms(5);
temp=P2;
temp=temp&0xf0;
while(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case 0xe7:{if(mode==1)
{ num[k]=3;
k++;}
if(mode==0)
{num[3]=3;caozai=zhongliang[2];}
}
break;
case 0xd7:{if(mode==1)
{ num[k]=6;
k++;}
}
break;
case 0xb7:{if(mode==1)
{ num[k]=9;
k++;}
}
break;
case 0x77:num[k]=16;
break;
}
while(temp!=0xf0)
{
temp=P2;
temp=temp&0xf0;
Led7Scan();
}
}
}
}
七、总结
经过调试安装,本模型在实现基本功能的基础上,实现简单数控设置负载,语音播放提示,密码控制,紧急停电时电源切换、楼层停止时间设置,不同楼层间不同速度运行等多项扩展功能。

八、参考资料:
1.《传感技术》,李春茂,科学技术文献出版社;
2.《实用语音与音效200例》,陈有卿,中国电力出版社;
3.《电梯技术基础》,叶安丽,中国电力出版社;
附:使用说明
1.电梯控制。

按键在1号板上,其中分为两个部分:第一部分,
轿厢外各楼层按钮,其中1楼只有向上呼叫按钮,6楼只有
向上呼叫按钮,其余各层都有上下呼叫按钮,电路板上以红
灯来表示;第二部分,轿厢内按钮,分别有1到6楼按钮,电
路板上以绿灯来表示。

当按下按钮之后,对应的灯会显示。

2.密码设置。

按键在独立扩展4*4矩阵键盘上操作,分别设有A、
B、C三个功能键以及3*3的密码以及数字输入。

A功能为
密码设置键,当电梯操作人员输入正确密码之后,数码管
显示操作人员使用的次数,并且电机停止工作,运动到最近
的楼层;B功能为数控负载人数功能,当超过此重量之后,
电梯会停止工作,并且会发出报警声。

C功能为扩张功能,
暂未启动。

3.每层停留时间功能。

其按钮在一号板上,当按下按钮的时候,
停留时间分别从3秒、5秒、8秒之间循环,并且对应的等
会亮。

.。

相关文档
最新文档