标题:
单片机8*8点阵做的电梯 ,附带程序和Proteus仿真
[打印本页]
作者:
洛晟
时间:
2019-6-5 16:01
标题:
单片机8*8点阵做的电梯 ,附带程序和Proteus仿真
用点阵做的电梯 ,附带程序和仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
电梯.png
(75.56 KB, 下载次数: 43)
下载附件
2019-6-5 16:01 上传
0.png
(7.3 KB, 下载次数: 44)
下载附件
2019-6-6 04:45 上传
单片机源程序如下:
#include <regx52.h>
#define uchar unsigned char
#define uint unsigned int
extern void disp3216();
extern uchar key_get();
/* 电梯控制与传感器信号I/O */
sbit s1=P1^6;sbit s2=P1^7;sbit s3=P3^7;
sbit mk1=P3^4;sbit mk2=P3^5;
#define dtSTOP {s1=1;s2=1;}
#define dtUP {s1=0;s2=1;}
#define dtDOWN {s1=1;s2=0;}
sbit dF1=P2^0;sbit dF2=P2^1;sbit dF3=P2^2;sbit dF4=P2^3;
sbit dF5=P2^4;sbit dF6=P2^5;sbit dF7=P2^6;sbit dF8=P2^7;
#define fSTOP 0
#define fUP 1
#define fDOWN 2
uchar dir; //电梯方向,0=停,1=上行,2=下行
uchar LCount; //楼层计数
#define kOUT 0x01 /*请求出门*/
#define kUP 0x08 /*请求上行*/
#define kDOWN 0x40 /*请求下行*/
extern uchar dispBuf[3]; //显存
uchar dat[8]={0,0,0,0,0,0,0,0}; //对应8~1楼,标志数据
uchar c,t10,s,min,hor; //时钟与定时
//判断是否上行
bit UpOk(){
switch(LCount){
case 1:if(dat[6]&(kOUT|kUP|kDOWN))return 1;
case 2:if(dat[5]&(kOUT|kUP|kDOWN))return 1;
case 3:if(dat[4]&(kOUT|kUP|kDOWN))return 1;
case 4:if(dat[3]&(kOUT|kUP|kDOWN))return 1;
case 5:if(dat[2]&(kOUT|kUP|kDOWN))return 1;
case 6:if(dat[1]&(kOUT|kUP|kDOWN))return 1;
case 7:if(dat[0]&(kOUT|kDOWN))return 1;
case 8:return 0;
}
return 0;
}
//判断是否下行
bit DownOk(){
switch(LCount){
case 8:if(dat[1]&(kOUT|kUP|kDOWN))return 1;
case 7:if(dat[2]&(kOUT|kUP|kDOWN))return 1;
case 6:if(dat[3]&(kOUT|kUP|kDOWN))return 1;
case 5:if(dat[4]&(kOUT|kUP|kDOWN))return 1;
case 4:if(dat[5]&(kOUT|kUP|kDOWN))return 1;
case 3:if(dat[6]&(kOUT|kUP|kDOWN))return 1;
case 2:if(dat[7]&(kOUT|kUP))return 1;
case 1:return 0;
}
return 0;
}
//电梯到达某层时,判断是否停下开门
//入口:LCount当前到达层号
//条件:梯内有出或梯外有“顺向”进,则开门。
km(){
bit b=0; uchar i;
if(LCount==1)dir=fUP; //最下层,方向改向上
else if(LCount==8)dir=fDOWN; //最上层,方向改向下
//梯内有人出
if(kOUT==(dat[8-LCount]&kOUT)){
dat[8-LCount]&=(~kOUT);b=1;
if(dir==fUP&&!UpOk())dat[8-LCount]&=(~kDOWN);
if(dir==fDOWN&&!DownOk())dat[8-LCount]&=(~kUP);
}
//上行时,看梯外有无人上行
if(dir==fUP&&kUP==(dat[8-LCount]&kUP)&&LCount!=8){
dat[8-LCount]&=(~kUP);
if(!UpOk())dat[8-LCount]&=(~kDOWN);
b=1;
}
//下行时,看梯外有无人下行
if(dir==fDOWN&&kDOWN==(dat[8-LCount]&kDOWN)&&LCount!=1){
dat[8-LCount]&=(~kDOWN);
if(!DownOk())dat[8-LCount]&=(~kUP);
b=1;
}
//到达底层或顶层,清空梯内按键信息
if(LCount==1||LCount==8){
for(i=1;i<7;i++)dat[i]&=(~kOUT);
}
if(b){dtSTOP;s3=0;t10=100;}
}
void main(){
uchar k;
bit bkey;
dir=fUP;
c=t10=s=0;
min=0;hor=12;
TMOD=0x01;
EA=ET0=TR0=1;
//检测电梯所在楼层
sta:
if (dF1==0)LCount=dispBuf[1]=1;
else if (dF2==0)LCount=dispBuf[1]=2;
else if (dF3==0)LCount=dispBuf[1]=3;
else if (dF4==0)LCount=dispBuf[1]=4;
else if (dF5==0)LCount=dispBuf[1]=5;
else if (dF6==0)LCount=dispBuf[1]=6;
else if (dF7==0)LCount=dispBuf[1]=7;
else if (dF8==0)LCount=dispBuf[1]=8;
else {dir=fDOWN;s2=0;goto sta;} //若电梯位于两楼之间,令其下行
s1=s2=1; //电梯停止
while(1){
if(!bkey)k=key_get(),bkey=1;
if((LCount!=(k&0x0F))||s3){
if(k>0&&k<9)dat[8-k]^=kOUT; //出电梯键
else if(k>10&&k<18)dat[18-k]|=kUP; //上行键
else if(k>21&&k<29)dat[28-k]|=kDOWN; //下行键
k=0;
}
if(!key_get())bkey=0;
//楼层到达信号,diapBuf[1]为楼号显示缓存
if(dF1==0)dispBuf[1]=1;
else if(dF2==0)dispBuf[1]=2;
else if(dF3==0)dispBuf[1]=3;
else if(dF4==0)dispBuf[1]=4;
else if(dF5==0)dispBuf[1]=5;
else if(dF6==0)dispBuf[1]=6;
else if(dF7==0)dispBuf[1]=7;
else if(dF8==0)dispBuf[1]=8;
//到达某层,判断是否需要开门,开门后定时自动关门。
if(LCount!=dispBuf[1]){ //如果是新楼层
LCount=dispBuf[1]; //更新楼号
km(); //开门?
}
if(dir==fUP&&mk1==0&&s3==1){//是否继续上行?
if(UpOk()){dtUP;} //上行
else {dir=fDOWN;if(P2!=0xff)dtSTOP;km();}//不上,反转
}else if(dir==fDOWN&&mk1==0&&s3==1){//是否继续下行?
if(DownOk()){dtDOWN;}
else {dir=fUP;if(P2!=0xff)dtSTOP;km();}
}
//静止状态下,本层是否有请求?
if(mk1==0&&s3==1&&s1==1&&s2==1){
if (0!=(dat[8-LCount]&kOUT)){
s3=0;t10=100;
dat[8-LCount]&=(~kOUT);
}
if(0!=(dat[8-LCount]&kUP)&&dir==fUP){
dat[8-LCount]&=(~kUP);
s3=0;t10=100;
}
if(0!=(dat[8-LCount]&kDOWN)&&dir==fDOWN){
dat[8-LCount]&=(~kDOWN);
s3=0;t10=100;
}
}
//定时到,关门
if(t10==0)s3=1;
//电梯门“开/关”好显示
if(mk1==0&&mk2==1)dispBuf[2]=14;
else if(mk1==1&&mk2==0)dispBuf[2]=13;
else dispBuf[2]=15;
//电梯“上行/下行”符号
if(s1==0&&s2==1)dispBuf[0]=10;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
(电梯仿真及程序).rar
(58.09 KB, 下载次数: 146)
2019-6-5 16:00 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qq892697678
时间:
2019-6-19 13:02
谢谢大佬
作者:
小天鹅洗衣机里
时间:
2019-6-19 15:03
非常不错额
作者:
qq892697678
时间:
2019-6-20 11:28
非常不错额
作者:
keshezy
时间:
2019-11-14 15:20
谢谢大佬,正好用到了这个
作者:
lslsls
时间:
2019-11-14 19:36
厉害厉害大佬,很有帮助
作者:
cheng555
时间:
2019-11-14 21:22
这是高手啊
作者:
木瓜不知
时间:
2019-12-13 13:55
请问有大佬有另外一个芯片的代码吗
作者:
songxia8013
时间:
2020-2-23 09:29
高手,不错的设计,就是程序只有一部分,缺一个单片机的程序。
作者:
夏一
时间:
2020-2-23 16:27
高手在民间,真乃神人也,这5分花的太值了
作者:
夏一
时间:
2020-2-23 18:03
怎么设置时间?
作者:
dawangsun
时间:
2020-2-23 19:38
看不懂,理解消化一下
作者:
y123chiang
时间:
2020-2-25 20:35
另一種電梯模擬,謝謝分享
作者:
john0317
时间:
2020-3-16 12:25
有没有全部的程序?
作者:
aayon1979
时间:
2020-7-28 12:08
资料不完整,缺少另外一个芯片的源程序
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1