资源描述
电梯模型设计报告
32
2020年4月19日
文档仅供参考
电梯模型设计报告
学院:自动化科学与工程学院
队名:酱油小分队
队员:谭斌冠 何健军 闫家炜
时间: -11-16
一、 概述
电梯模型以51单片机作为核心处理器,步进电机为控制电机,用ULN 电流驱动矩阵对步进电机进行驱动,结合光电传感器达到对电梯进行上、下和停止的动作,并确保平层精确度。利用独立键盘和数码管等更好地实现人机互动交流。
二、 方案论证
步进电机+光电传感控制
芯片工作电压5V,能够很好地与单片机配合工作。
队长,交给你了= =……
三、 详细设计反感
1、 楼层模型设计
楼层模型选用质地较轻、易于加工的轻型胶合板制作。整个箱体用木块进行加固,确保其稳定性。轿箱轨道采用两根钢丝(尼龙绳?),确保轿箱运行过程中不会出现晃动等情况。轿箱采用轻纸盒加木质配种职称,保证了运行的稳定。
2、 驱动电路模块
采用步进电机28BYJ48型四相八拍电机,电压为DC5V—DC12V。当对步进电机施加一系列连续不断的控制脉冲时,它能够连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度(一个步距角)。当通电状态的改变完成一个循环时,转子转过一个齿距。四相步进电机能够在不同的通电方式下运行。由于单片机接口信号不够大需要经过ULN 放大再连接到相应的电机接口 。
图片
(加图片)
3、 光电传感模块
电梯轿箱部分安装有红外对管的发射管,模型的每个楼层分别安装有接收管,以此确保平层准确。轿箱发出的红外线经楼层上的接受管接收后,引起电平变化,CPU以此信号来做出相应命令。
(图)
4、 楼层按键设计
为模拟乘客在轿箱内对电梯的控制,设计了有5个按键的独立键盘,分别对应1-5楼,基于实验原因,放置于模型外部。
每个楼层各有独立键盘来对轿箱进行呼叫。
5、 中央处理器部分
采用两个51单片机配合控制整个系统。分别为主控CPU、电机驱动CPU。CPU之间有通信。
主控CPU:(图)
驱动CPU:(图)
四、 调试过程
各模块工作正常,达到预期目标。
五、 程序流程图
(图)
六、 程序清单
主控CPU程序:
#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
#define shuma P0
sbit key1=P1^0;//前四个上行,后四个下行
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^3;
sbit key5=P1^4;
sbit key6=P1^5;
sbit key7=P1^6;
sbit key8=P1^7;
sbit key9=P2^0;//内部按键
sbit key10=P2^1;
sbit key11=P2^2;
sbit key12=P2^3;
sbit key13=P2^4;
sbit send1=P2^5;//连接接受单片机
sbit send2=P2^6;
sbit send3=P2^7;
sbit LEDA=P3^3;//红外对管,一次为一到五楼
sbit LEDB=P3^4;
sbit LEDC=P3^5;
sbit LEDD=P3^6;
sbit LEDE=P3^7;
unchar code table[] = {0xD7,0x32,0x92,0xD4,0x98};//楼层?
void keyscan1();
void keyscan2();
void neibu();
void judge1();
void judge2();
void redwai();
void duan();
int m;//记忆是否被呼叫过
int n;//记忆被呼叫的楼层
int b;//数码管
int x;//控制电机
int y1[5];//外部上行按键
int y2[5];//外部下行按键
int f[5];//内部按键
int s=0;//记忆是否有呼叫,采取s++,当有楼层呼叫时加1,到达该楼层时便减1
//int p=0;//记忆内部是否有呼叫
void delay(int i)
{
int j;
for(i;i>0;i--)
for(j=0;j<325;j++);//1.09ms
}
void keyscan1()//上行键盘扫描
{
P1=0xff;
if(key1==0)
{
delay(1);
if(key1==0)
{
y1[0]=1;
if(m)
{
n=1;
m=0;
}
while(!key1);
}
}
if(key2==0)
{
delay(1);
if(key2==0)
{
y1[1]=2;
if(m)
{
n=2;
m=0;
}
while(!key2);
}
}
if(key3==0)
{
delay(1);
if(key3==0)
{
y1[2]=3;
if(m)
{
n=3;
m=0;
}
while(!key3);
}
}
if(key4==0)
{
delay(1);
if(key4==0)
{
y1[3]=4;
if(m)
{
n=4;
m=0;
}
while(!key4);
}
}
}
void keyscan2()//下行键盘扫描
{
P1=0xff;
if(key5==0)
{
delay(1);
if(key5==0)
{
y2[1]=2;
if(m)
{
n=2;
m=0;
}
while(!key5);
}
}
if(key6==0)
{
delay(1);
if(key6==0)
{
y2[2]=3;
if(m)
{
n=3;
m=0;
}
while(!key6);
}
}
if(key7==0)
{
delay(1);
if(key7==0)
{
y2[3]=4;
if(m)
{
n=4;
m=0;
}
while(!key7);
}
}
if(key8==0)
{
delay(1);
if(key8==0)
{
y2[4]=5;
if(m)
{
n=5;
m=0;
}
while(!key8);
}
}
}
void neibu()
{
if(key9==0)
{
delay(1);
if(key9==0)
{
f[0]=1;
if(m)
{
n=1;
m=0;
}
while(!key9);
}
}
if(key10==0)
{
delay(1);
if(key10==0)
{
f[1]=2;
if(m)
{
n=2;
m=0;
}
while(!key10);
}
}
if(key11==0)
{
delay(1);
if(key11==0)
{
f[2]=3;
if(m)
{
n=3;
m=0;
}
while(!key11);
}
}
if(key12==0)
{
delay(1);
if(key12==0)
{
f[3]=4;
if(m)
{
n=4;
m=0;
}
while(!key12);
}
}
if(key13==0)
{
delay(1);
if(key13==0)
{
f[4]=5;
if(m)
{
n=5;
m=0;
}
while(!key13);
}
}
}
void motor1()
{
if(x==1)
{
send1=0;
delay(2);
send1=1;
}
if(x==2)
{
send2=0;
delay(2);
send2=1;
}
if(x==0)
{
send3=0;
delay(2);
send3=1;
}
}
void panduan()
{
int i;
s=0;
for(i=0;i<5;i++)
{
if(y1[i]!=0)
s++;
if(y2[i]!=0)
s++;
if(f[i]!=0)
s++;
}
}
void redwai()//红外对管
{
// LEDA=0;
// LEDB=0;
// LEDC=0;
// LEDD=0;
// LEDE=0;
if(LEDA==0)
{
b=1;
duan();
shuma=0x00;
shuma=table[0];
}
if(LEDB==0)
{
b=2;
duan();
shuma=0x00;
shuma=table[1];
}
if(LEDC==0)
{
b=3;
duan();
shuma=0x00;
shuma=table[2];
}
if(LEDD==0)
{
b=4;
duan();
shuma=0x00;
shuma=table[3];
}
if(LEDE==0)
{
b=5;
duan();
shuma=0x00;
shuma=table[4];
}
}
void main()
{
while(1)
{
if(s==0)//电梯停止,则重新激活
m=1;
keyscan1();
keyscan2();
neibu();
panduan();
redwai();
if(n!=0)//纯粹的只是为了开启电梯,电梯一动,它的历史使命就完成啦。
{
if(b<n)//轿厢在呼叫楼层下面,轿厢准备上行
x=1;
if(b==n)//轿厢正好在呼叫楼层,轿厢停止
// x=0;
m=1;
if(b>n)//轿厢在呼叫楼层上面,轿厢准备下行
x=2;
n=0;
}
motor1();
}
}
void duan()
{
if(x==1)
judge1();
if(x==2)
judge2();
}
void judge1()
{
int t=0;
while(t<4)
{
if((b==y1[t])||(b==f[t]))
{
if(y1[t]==b)
{
s--;
y1[t]=0;
}
if(f[t]==b)
{
s--;
f[t]=0;
}
send3=0;
delay(2);
send3=1;
}
t++;
}
if((b==y2[4])||(b==f[4]))
{
if(b==y2[4])
{
s--;
y2[4]=0;
}
if(f[4]==b)
{
s--;
f[4]=0;
}
send3=0;
delay(2);
send3=1;
}
if(s!=0)
{
if(b==5)
{
x=2;
}
else
{
x=1;
}
}
else
{
x=0;
}
}
void judge2()
{
int k=1;
if((b==y1[0])||(b==f[0]))
{
if(y1[0]==b)
{
s--;
y1[0]=0;
}
if(f[0]==b)
{
s--;
f[0]=0;
}
send3=0;
delay(2);
send3=1;
}
while(k<5)
{
if((b==y2[k])||(f[k])==b)
{
if(y2[k]==b)
{
s--;
y2[k]=0;
}
if(f[k]==b)
{
s--;
f[k]=0;
}
send3=0;
delay(2);
send3=1;
}
k++;
}
if(s!=0)
{
if(b==1)
{
x=1;
}
else
{
x=2;
}
}
else
{
x=0;
}
}、
电机控制CPU:
#include<reg52.h>
#define unchar unsigned char
#define unint unsigned int
unchar code table1[]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};//电梯正转
unchar code table2[]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};//电梯反转
sbit h=P2^0;
sbit j=P2^1;
sbit y=P2^2;
//sbit duan=P3^2;
#define motor P1
int a=0;
void delay(int i)
{
int j;
for(i;i>0;i--)
for(j=0;j<325;j++);//1.09ms
}
void clockwise()//正转,上行
{
int k;
k=0;
motor=0x00;
while(a==1)
{
motor=table1[k];
k++;
if(k>7)
k=0;
delay(1);//调整速率
if(h==0)
a=1;
if(j==0)
a=2;
if(y==0)
{
a=0;
delay(3000);
}
}
}
void anticlockwise()//逆转,下行
{
int k;
k=0;
motor=0x00;
while(a==2)
{
motor=table2[k];
k++;
if(k>7)
k=0;
delay(1);
if(h==0)
a=1;
if(j==0)
a=2;
if(y==0)
{
a=0;
delay(3000);
}
}
}
void main()
{
if(h==0)
a=1;
if(j==0)
a=2;
clockwise();
anticlockwise();
}
七、 元器件清单
STC89C51
2个
ULN
1个
5161BH数码管
6个
红外发射管
1个
红外接收管
5个
50K电位器
5个
500K电位器
1个
12M晶振
2个
LED灯
27个
按钮
14个
500欧电阻
15个
1K电阻
2个
4.7K电阻
4个
20μF电容
2个
22pF电容
4个
排针、电线、杜邦线
若干
28BYJ-48 5V步进电机
1个
展开阅读全文