久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機單系統電梯程序與Proteus仿真圖設計
[打印本頁]
作者:
渾水摸魚660
時間:
2023-6-16 08:47
標題:
51單片機單系統電梯程序與Proteus仿真圖設計
這是我一個星期完成的電梯設計,內含上下行電梯、電梯緊急停止、內部故障報警系統等內容。
內部包含電路設計圖(含注釋),電路源代碼等,請大家多多指教。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(154.91 KB, 下載次數: 31)
下載附件
2023-6-16 13:46 上傳
單片機源程序如下:
#include <REG51.H>
#include <INTRINS.H>
unsigned char ucMotorDrvPuls;
unsigned char FORREV=1;
unsigned char STOPCUR=0;
unsigned char CURFLR=1;
unsigned char count=0;
#define UCTIMES 8
#define OUTPUT P2
#define COUNT 8
sbit UP1=P3^4;
sbit DOWN2=P3^3;
sbit UP2=P3^2;
sbit DOWN3=P3^1;
sbit UP3=P3^0;
sbit DOWN4=P1^7;
sbit FLOOR1=P1^0;
sbit FLOOR2=P1^1;
sbit FLOOR3=P1^2;
sbit FLOOR4=P1^3;
sbit START=P1^4;
sbit STOP=P1^5;
sbit ALARM=P1^6;
sbit alarmBit=P0^4;
sbit upLight=P0^5;
sbit downLight=P0^6;
void time(unsigned int ucMs);
void outPress();
unsigned char inPress();
unsigned char elevator();
void storeUP(unsigned char);
void storeDOWN(unsigned char);
void time (unsigned int ucMs);
void initLights(void);
void setFloor(int floor);
void setUpLight();
void setDownLight();
void setStopLight();
void setAlarmLight();
void setAlarmLight();
void offAlarmLight();
int alarmSwitch=1;
unsigned char UP_req[5]={0,0,0,0,0};
unsigned char DOWN_req[5]={0,0,0,0,0};
void position(void)
{
OUTPUT=0x01|(P2&0xf0);time(200);
OUTPUT=0x02|(P2&0xf0);time(200);
OUTPUT=0x04|(P2&0xf0);time(200);
OUTPUT=0x08|(P2&0xf0);time(200);
ucMotorDrvPuls=0x11;
OUTPUT=0x01|(P2&0xf0);
}
void main(void)
{
time(100);
initLights();
position();
ucMotorDrvPuls=0x11;
OUTPUT=0x00|(P2&0xf0);
setFloor(CURFLR);
setUpLight();
time(100);
while(1)// 主循環
{
outPress();//按下電梯外按鈕
while(STOPCUR==1)
{
outPress();
inPress();
}
if(inPress()) //按下電梯內樓層按鈕
{
while(START) //等待啟動按鍵按下
{
outPress();
inPress();
}
}
while(1) //電機運轉循環
{
if(UP_req[1]==0&&UP_req[2]==0&&UP_req[3]==0&&
DOWN_req[2]==0&&DOWN_req[3]==0&&DOWN_req[4]==0)
{
break;
}
if(FORREV) //上
{
setUpLight(); //上行燈亮
if(STOPCUR==1){break;}
if(elevator()) //往上到達某一層
{
if(CURFLR==4) {setDownLight();break;} //到達四層
}
OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0);
ucMotorDrvPuls=_crol_(ucMotorDrvPuls,1);
}
if(!FORREV) //下
{
setDownLight(); //下行燈亮
if(STOPCUR==1){break;}
if(elevator()) //往下到達某一層
{
if(CURFLR==1){setUpLight();break;}//到達一樓
}
OUTPUT=(ucMotorDrvPuls&0x0f)|(P2&0xf0);
ucMotorDrvPuls=_cror_(ucMotorDrvPuls,1);
}
outPress(); //按下電梯外按鈕
//if(inPress()) //按下電梯內樓層按鈕
//{
//while(START) //等待啟動按鍵按下
//{
// outPress();
inPress(); //電梯運行時,內部按鈕按下,無需按啟動按鈕
//}
//}
time(380-UCTIMES*16);
} //end while-電機運轉循環
OUTPUT=0x00|(P2&0xf0); //電機停止
}//end while-主循環
}
//按下電梯外按鈕
void outPress()
{
//FORREV=1;
if(!UP1) //1樓上
{
storeUP(1);
if(CURFLR>1&&STOPCUR==1)
{
FORREV=0; //向下運行
STOPCUR=0;
}
if(CURFLR==1)
{
STOPCUR=1;//電梯停留在當前層
}
}
if(!UP2) //2樓上
{
storeUP(2);
if(CURFLR>2&&STOPCUR==1) //電梯在二樓以上
{
FORREV=0;
STOPCUR=0;
}
if(CURFLR<2&&STOPCUR==1)
{
FORREV=1;
STOPCUR=0;
}
if(CURFLR==2)
{
STOPCUR=1;
}
}
if(!UP3) //3樓上
{
storeUP(3);
if(CURFLR>3&&STOPCUR==1) //電梯在三樓以上
{
FORREV=0;
STOPCUR=0;
}
if(CURFLR<3&&STOPCUR==1)
{
FORREV=1;
STOPCUR=0;
}
if(CURFLR==3)
{
STOPCUR=1;
}
}
if(!DOWN2) //2樓下
{
storeDOWN(2);
if(CURFLR>2&&STOPCUR==1)//電梯在二樓以上
{
FORREV=0;
STOPCUR=0;
}
if(CURFLR<2&&STOPCUR==1)
{
FORREV=1;
STOPCUR=0;
}
if(CURFLR==2)
{
STOPCUR=1;
}
}
if(!DOWN3)//3樓下
{
storeDOWN(3);
if(CURFLR>3&&STOPCUR==1)//電梯在三樓以上
{
FORREV=0;
STOPCUR=0;
}
if(CURFLR<3&&STOPCUR==1)
{
FORREV=1;
STOPCUR=0;
}
if(CURFLR==3)
{
STOPCUR=1;
}
}
if(!DOWN4)//4樓下
{
storeDOWN(4);
if(CURFLR<4&&STOPCUR==1)
{
FORREV=1;
STOPCUR=0;
}
if(CURFLR==4)
{
STOPCUR=1;
}
}
}
//按下電梯內樓層按鈕
unsigned char inPress()
{
int i;
int flag=0;
if(!FLOOR1)
{
if(1<CURFLR)
{
STOPCUR=0;
UP_req[1]=1;
}
if(1==CURFLR)
{
STOPCUR=1;
}
return 1;
}
if(!FLOOR2)
{
if(2>CURFLR)//請求層大于當前層
{
UP_req[2]=1;
STOPCUR=0;
}
if(2<CURFLR)
{
DOWN_req[2]=1;
STOPCUR=0;
}
if(2==CURFLR)
{
STOPCUR=1;
}
return 1;
}
if(!FLOOR3)
{
if(3>CURFLR)//請求層大于當前層
{
UP_req[3]=1;
STOPCUR=0;
}
if(3<CURFLR)
{
DOWN_req[3]=1;
STOPCUR=0;
}
if(3==CURFLR)
{
STOPCUR=1;
}
return 1;
}
if(!FLOOR4)
{
if(4>CURFLR)
{
DOWN_req[4]=1;
STOPCUR=0;
}
if(4==CURFLR)
{
STOPCUR=1;
}
return 1;
}
if(!START)
{
STOPCUR=0;
return 1;
}
if(!STOP)//緊急停止
{
while(START)//不響應其他按鈕
{
//亮燈
setStopLight();
}
return 1;
}
if(!ALARM)
{
//while(START)
//{
//亮燈
setAlarmLight();
//time(800);
//燈滅
//offAlarmLight();
//}
return 1;
}
if(FORREV==1)
{
//請求上行而進去電梯內選擇的是下層
for(i=CURFLR+1;i<4;i++)
{
if(UP_req[i]==1||DOWN_req[i]==1){flag=1;}
}
if(flag==0)//上層沒有請求
{
FORREV=0;
}
}
if(FORREV==0)
{
//請求下行而進去電梯內選擇的是上層
for(i=CURFLR-1;i>=1;i--)
{
if(UP_req[i]==1||DOWN_req[i]==1){flag=1;}
}
if(flag==0)//
{
FORREV=1;
}
}
return 0;
}
unsigned char elevator()
{
count++;
if (count==COUNT)
{
if(FORREV==1)
{
CURFLR++;
setUpLight();//上行燈亮
if(CURFLR==2)//到達二樓
{
count=0;
setFloor(2);//顯示數字
if(UP_req[2]==1)//二樓有上行請求,優先處理
{
setUpLight();
UP_req[2]=0;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
return 1;
}
if(DOWN_req[2]==1&&UP_req[3]==0&&DOWN_req[3]==0
&&DOWN_req[4]==0)//二樓有下請求,上面兩層沒有請求,不再往上
{
setDownLight();
DOWN_req[2]=0;
STOPCUR=1;
OUTPUT=0x00|(P2&0xf0);//電機停止
FORREV=0;
return 1;
}
}
if(CURFLR==3)//到達三樓
{
setFloor(3);//顯示數字
count=0;
if(UP_req[3]==1)//三樓有上行請求,優先處理
{
setUpLight();
UP_req[3]=0;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
return 1;
}
if(DOWN_req[3]==1&&UP_req[4]==0)//三樓有下請求,四樓沒有請求,不再往上
{
setDownLight();
FORREV=0;
DOWN_req[3]=0;
STOPCUR=1;
OUTPUT=0x00|(P2&0xf0);//電機停止
return 1;
}
}
if(CURFLR==4)//到達四樓
{
setFloor(4);//顯示數字
setDownLight();
count=0;
if(DOWN_req[4]==1)//四樓有上行請求,四樓的請求只用向下的情況
{
DOWN_req[4]=0;
FORREV=0;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
}
}
}
else//判斷下行是否到達請求層,下行請求優先處理
{
CURFLR--;
setDownLight();//下行燈亮
if(CURFLR==1)//到達一樓
{
setFloor(1);//顯示數字
count=0;
if(UP_req[1]==1)//一樓沒有請求,一樓的請求只有向上的情況
{
setUpLight();
UP_req[1]=0;
FORREV=1;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
}
}
if(CURFLR==2)//到達二樓
{
setFloor(2);//顯示數字
count=0;
if(DOWN_req[2]==1)//二樓有下行請求,優先處理
{
setDownLight();
DOWN_req[2]=0;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
return 1;
}
if(UP_req[2]==1&&UP_req[1]==0)//一樓無請求,不再往下
{
setUpLight();
FORREV=1;
UP_req[2]=0;
STOPCUR=1;
OUTPUT=0x00|(P2&0xf0);//電機停止
}
}
if(CURFLR==3)//到達三樓
{
setFloor(3);//顯示數字
count=0;
if(DOWN_req[3]==1)//三樓有下行請求,優先處理
{
setDownLight();
DOWN_req[3]=0;
OUTPUT=0x00|(P2&0xf0);//電機停止
STOPCUR=1;
return 1;
}
if(UP_req[1]==0&&DOWN_req[2]==0&&UP_req[2]==0&&UP_req[3]==1)
{
setUpLight();
FORREV=1;
UP_req[3]=0;
STOPCUR=1;
OUTPUT=0x00|(P2&0xf0);//電機停止
}
}
}//end if-FORREV
return 1;
}
else
{
return 0;
}//end if-count
}
void storeUP(unsigned char x)
{
UP_req[x]=1;
}
void storeDOWN(unsigned char x)
{
DOWN_req[x]=1;
}
void initLights()
{
P0=0x11;
}
//設置樓層顯示
void setFloor(int floor)
{
switch(floor)
{
case 1:
{
P0&=0xf0;//清零
P0|=0x01;break;
}
case 2:
{
P0&=0xf0;//清零
P0|=0x02;break;
}
case 3:
{
P0&=0xf0;//清零
P0|=0x03;break;
}
case 4:
{
P0&=0xf0;//清零
P0|=0x04;break;
}
default:
{
P0=0x06;break;
}
}
}
//設置電梯向上運行燈
void setUpLight()
{
upLight=1;
downLight=0;
}
//設置電梯向下運行燈
void setDownLight()
{
upLight=0;
downLight=1;
}
//設置電梯停止運行燈
void setStopLight()
{
upLight=0;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
Keil代碼與Proteus8.13仿真下載:
仿真程序.7z
(101.02 KB, 下載次數: 47)
2023-6-16 13:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
lanxichang
時間:
2023-7-13 19:20
到了怎么下車? 開門?
作者:
lanxichang
時間:
2023-7-13 19:24
下樓梯下不來,是不是還沒寫完功能啊?不太會用
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久成人国产精品
|
午夜免费小视频
|
日韩午夜
|
请别相信他免费喜剧电影在线观看
|
性高湖久久久久久久久3小时
|
成人精品视频在线观看
|
精品美女
|
国产一区久久精品
|
国产成人99久久亚洲综合精品
|
亚洲一区视频在线
|
亚洲精品乱码久久久久久9色
|
久久小视频
|
国产美女视频黄a视频免费 国产精品福利视频
|
欧美成人精品二区三区99精品
|
日韩综合一区
|
成人在线中文字幕
|
国产乱码精品一区二区三区忘忧草
|
国产成人精品午夜视频免费
|
精品电影
|
毛片网在线观看
|
成人毛片在线视频
|
国产三级日本三级
|
日韩在线观看网站
|
亚洲一区二区三区乱码aⅴ 四虎在线视频
|
午夜精品久久久久久久久久久久久
|
亚洲成av人片在线观看无码
|
午夜日韩视频
|
99免费在线观看视频
|
久久久久久久亚洲精品
|
黄色一级电影免费观看
|
亚洲欧美中文日韩在线v日本
|
仙人掌旅馆在线观看
|
成人福利在线
|
免费黄色av
|
在线观看国产
|
国产精品日韩欧美一区二区三区
|
日本不卡视频在线播放
|
天天操夜夜骑
|
国产高清视频一区
|
毛片免费在线
|
麻豆hd
|