模拟电梯控制模拟电梯控制.docx
《模拟电梯控制模拟电梯控制.docx》由会员分享,可在线阅读,更多相关《模拟电梯控制模拟电梯控制.docx(11页珍藏版)》请在冰豆网上搜索。
模拟电梯控制模拟电梯控制
单片机课程设计
专业:
人工智能与控制技术
班级:
0691201
姓名:
邸宝鑫
指导教师:
王文仲、孟祥莲、孙平
哈尔滨工业大学华德应用技术学院
2007年12月XX日
姓名:
邸宝鑫
班级:
0691201
学号:
18
课题编号:
11
课题名称:
模拟电梯
基本功能:
模拟电梯的基本工作
点阵模拟电梯开关门动作
数码管显示轿厢所在层数
按键为呼叫按钮
LED显示呼叫层数
扩展功能:
成绩:
评审老师:
一、需求分析:
随着生活水平的提高,电梯在生活中的使用也变得广泛。
该设计可应用在四层楼中。
通过扩展可应用在更高的楼上,为生活节省时间带来方便。
二、硬件设计方案
硬件所用器件:
器件名称
型号
数量
功能说明
单片机
AT89C51
1
核心控制部分
芯片
DM74LS08N
2
与门
点阵
8*8
1
显示开关门
数码管
共阳
1
显示所在层数
电池盒
4节1.5V
1
提供工作电压
二极管
4红1绿1黄
6
提示灯
按键
普通
8
电梯呼叫
晶振
12MHz
1
时钟控制信号
电阻
470Ω
16
限流电阻
电阻
4.7KΩ
8
上拉电阻
电阻
100Ω
1
限流电阻
瓷片电容
30pf
1
配合晶振工作
电解电容
33mf
1
提供复位时间常数
AT89C51芯片简介:
AT89系列单片机是ATMEL公司最早推出,也是功能最简单的一个系列,该系列都是内含Flash程序存储器的MCS-51兼容单片机,AT89C51就是其中一款可在线编程ISPFlash单片机。
AT89C51具有价格便宜、性能优良、可在线编程等特点。
其具体性能参数如下:
兼容MCS-51内核单片机;4KB可在线编程Flash存储器,可有效擦除/读写1000次;工作电压范围4.0~5.5V;完全静态工作:
0Hz~33MHz;ROM三级加密模式;128*8bit内置RAM;32位可控I/O引脚;2个16位的时钟源;5个中断源;全双工UART串行接口;低功耗工作模式;看门狗计时器;两个数据指针;快速编程特性。
三、软件设计方案
主要算法:
呼叫标志变量MB
轿厢在所在层变量DQ
判断是否开门算法
(mb&dq1)==dq1
判断是否上升算法
(!
down)&&(dq1<((0x10-dq1)&mb))
判断是否下降算法
(!
up)&&((mb=0))
四、调试
硬件调试:
在硬件设计时考虑到本程序点阵只涉及开门关门不用考虑其他功能这样我们只控制哪一列亮或灭就可以了,所以我们把所有的行线都直接接到电源上,用单片机直接给地就可以控制了。
按键设计考虑到所有人的呼叫都要得到相应不能漏掉呼叫,所以我们把按键通过与门都接到INT0上,用中断判断按键的按
下。
软件调试
把电梯的所有呼叫都用一个变量的低四位表示(如:
一层、二层、三层都有呼叫则标志位为:
00000111),当前所在层也用一个变量的低四位表示(如:
当前在四层则标志为:
00001000)通过我们共同研究的算法模拟电梯的基本运行方式。
五、心得体会
在这次课程设计调试过程中,提示灯无法正确工作,始终保持常量状态,经过仔细查询程序错误,并进行及时修改,完成了提示灯工作任务。
还有焊点不导通问题,有时候调试修改,会把其中焊点或导线端碰掉。
用万用表进行排查,找出不导通的焊点区域,进行重新焊接。
在不层呼叫的时候也出现过错误,有的时候是忽略了某层呼叫,有的时候程序跑飞,在通过修改单片机引脚进行了修改。
通过这次课程设计,使我对单片机应用范围了解了更多,特别是在生活中有那么多广泛的应用。
希望以后有机会能设计出自己思想的单片机。
附录1:
(程序代码)
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitP3_0=P3^0;
sbitP3_1=P3^1;
sbitP3_2=P3^2;
sbitP3_4=P3^4;
sbitP3_5=P3^5;
sbitP3_3=P3^3;
sbitP3_7=P3^7;
ucharmb=0,up=0,down=0,mbz=1,dq1=1;
voiddelay()
{
uintx,i;
for(i=0;i<6;i++)
for(x=0;x<15000;x++);
}
voidkm()
{
mbz=0;
P0=0x18;
delay();
P0=0x3c;
delay();
P0=0x7e;
delay();
P0=0xff;
}
voidgm()
{
mbz=1;
P0=0x7e;
delay();
P0=0x3c;
delay();
P0=0x18;
delay();
P0=0x00;
}
voidss()
{
dq1=dq1<<1;
P3_0=1;
P3_1=0;
delay();
delay();
switch(dq1)
{
case0x01:
{P2=0x9f;break;}
case0x02:
{P2=0x25;break;}
case0x04:
{P2=0x0d;break;}
case0x08:
{P2=0x99;break;}
}
}
voidxj()
{
dq1=dq1>>1;
P3_0=0;
P3_1=1;
delay();
delay();
switch(dq1)
{
case0x01:
{P2=0x9f;break;}
case0x02:
{P2=0x25;break;}
case0x04:
{P2=0x0d;break;}
case0x08:
{P2=0x99;break;}
}
}
voidanjian()interrupt0
{
ucharjz;
jz=P1;
if((jz&0x10)==0)
{
mb=mb|0x01;
P3_4=0;
}
if((jz&0x20)==0)
{
mb=mb|0x02;
P3_5=0;
}
if((jz&0x40)==0)
{
mb=mb|0x04;
P3_3=0;
}
if((jz&0x80)==0)
{
mb=mb|0x08;
P3_7=0;
}
if((jz&0x01)==0)
mb=mb|0x01;
if((jz&0x02)==0)
mb=mb|0x02;
if((jz&0x04)==0)
mb=mb|0x04;
if((jz&0x08)==0)
mb=mb|0x08;
}
voidmain()
{
P0=0x00;
EX0=1;
IT0=0;
P1=0xff;
P3_2=1;
EA=1;
P2=0x9f;
if(mb!
=0)
while
(1)
{
if((mb&dq1)==dq1)
{
delay();
delay();
delay();
km();
delay();
delay();
delay();
gm();
P3_0=1;
P3_1=1;
switch(dq1)
{
case0x01:
{mb=mb&0xfe;P3_4=1;}break;
case0x02:
{mb=mb&0xfd;P3_5=1;}break;
case0x04:
{mb=mb&0xfb;P3_3=1;}break;
case0x08:
{mb=mb&0xf7;P3_7=1;}break;
}
}
if((!
down)&&(dq1<((0x10-dq1)&mb)))
{
up=1;
ss();
switch(dq1)
{
case0x01:
{if((mb&0xfe)==0){up=0;break;}}
case0x02:
{if((mb&0xfc)==0){up=0;break;}}
case0x04:
{if((mb&0xf8)==0){up=0;break;}}
case0x08:
{up=0;break;}
}
}
if((!
up)&&((mb=0)))
{
down=1;
xj();
switch(dq1)
{
case0x01:
{if((mb&0xf7)==0){down=0;break;}}
case0x02:
{if((mb&0xf3)==0){down=0;break;}}
case0x04:
{if((mb&0xf1)==0){down=0;break;}}
case0x08:
{down=0;break;}
}
}
}
}