基于51單片機(jī)的多層電梯(1-16層)運(yùn)行系統(tǒng)仿真設(shè)計(jì)_層數(shù)可改
仿真圖proteus 8.9
程序編譯器:keil 4/5
編程語言:C語言
設(shè)計(jì)編號(hào):S0027
視頻演示
基于51單片機(jī)的多層電梯(1-16層)運(yùn)行系統(tǒng)仿真設(shè)計(jì)演示視頻
主要功能:
結(jié)合實(shí)際情況,基于51單片機(jī)設(shè)計(jì)一個(gè)多層電梯單片機(jī)控制系統(tǒng)。該系統(tǒng)應(yīng)滿足的功能要求為:
1-16層電梯運(yùn)行控制,轎內(nèi)外呼叫,運(yùn)行狀態(tài)顯示。獨(dú)立鍵盤、LED顯示樓層、指示燈。
1.通電后,系統(tǒng)默認(rèn)電梯停在一層。
2.按下不同的按鍵電梯可以到達(dá)不同的樓層,如果電梯在上行,下面的樓層有呼叫電梯會(huì)繼續(xù)上行,直到上行完了才會(huì)下行。同樣如果電梯在下行,上面的樓層有呼叫 電梯會(huì)繼續(xù)上行 ,直到下行完了才會(huì)上行。
3.如需上行,請按下所要到達(dá)樓層的上行呼叫按鈕,電梯顯示開始上行,所經(jīng)樓層號(hào)用數(shù)碼管進(jìn)行顯示,到達(dá),樓層號(hào)持續(xù)顯示。
4.當(dāng)轎廂停留在中間樓層時(shí),可實(shí)現(xiàn)上或下行呼叫,行進(jìn)方向按呼叫順序進(jìn)行。
5.由LED箭頭指示電梯是上行和下行的方向。
6.硬件軟件可以兼容2-16層電梯,如果需要做8層10層電梯,可以用改設(shè)計(jì)快速修改。
主要硬件設(shè)備:51單片機(jī)、74HC595位移緩存器、數(shù)碼管顯示、按鍵、NSL-32SR3、電機(jī)。
資料下載鏈接(可點(diǎn)擊):
【騰訊文檔】S0027 網(wǎng)盤鏈接
以下為本設(shè)計(jì)資料展示圖:
仿真
電梯停在一樓
按下電梯完按鈕16樓,上行指示燈電路,電梯電機(jī)開始工作。此時(shí)顯示欄會(huì)顯示經(jīng)過的樓層。
到達(dá)16層后,按下電梯完按鈕1樓,下行指示燈電路,電梯電機(jī)開始工作。此時(shí)顯示欄會(huì)顯示經(jīng)過的樓層。
程序:
//系統(tǒng)初使化
void SYSYEM_INIT(void)
{
u8 i;
ElevState.CurrentFloor=1;
ElevState.Direction=UP; //初使化方向?yàn)橄蛏?
ElevState.FloorTimerCount=0; //定時(shí)器版計(jì)時(shí)清0
ElevState.FreeFlag=TRUE; //初使化為空閑狀態(tài)
ElevState.ElevRunning=FALSE; //運(yùn)行標(biāo)志置FALSE 表示暫停運(yùn)行
Uart.RX_COUNT=0; //串口接收計(jì)數(shù)清0
for(i=0;i<=MaxFloor;i++)
{
ElevState.FloorCallTable[i]=Null; //初使化呼叫列表為Null
}
DOOR_Close; //關(guān)門
}
void EXTI0_IRQHandler(void) interrupt 0 //樓層傳感器中斷
{
#if (USE_MODE==1)
ElevState.ArriveFlag=TRUE;//觸發(fā)中斷后表示到達(dá)樓層,讓到達(dá)樓層標(biāo)志置TRUE
#endif
}
void EXTI1_IRQHandler(void) interrupt 2 //矩陣按鍵中斷
{
KeyDatHandle(KeyScan()); //把KeyScan()按鍵掃描函數(shù)返回的按鍵值帶入到KeyDatHandle()處理按鍵
}
void TIM0_IRQHandler(void) interrupt 1 //定時(shí)模擬電梯上升和下降
{
TH0=(65536-50000)/256;//定時(shí)50ms
TL0=(65536-50000)%256;//定時(shí)50ms
TimerCount++;
if(TimerCount==20) //1秒
{
TimerCount=0;
Timer_Second++;
}
if(DelNullCheck()==FALSE) ElevState.FloorTimerCount++; //非空閑狀態(tài)計(jì)時(shí)累加
else ElevState.FloorTimerCount=0; //空閑狀態(tài)計(jì)時(shí)清0
}
void Uart_IRQHandler(void) interrupt 4 //用于電梯之間的通信
{
if(RI==1) //判斷是否為接收中斷(串口中斷分為發(fā)送中斷和接收中斷,均用同一個(gè)中斷服務(wù)函數(shù)入口)
{
RI = 0; //清除RI接收中斷標(biāo)志
Uart.RX_BUFF[Uart.RX_COUNT++]=SBUF;
if(Uart.RX_COUNT==Uart_RX_LEN) Uart.RX_COUNT=0;
}
}
void main(void) //主函數(shù)
{
u8 SendTick1S=0;
SYSYEM_INIT();
EXTI0_Init();
EXTI1_Init();
TIMER0_Init();
UART_Config(9600);
Uart_SendStr("Welcome to use elevator program rn");
while(1)
{
KeyPort_Y=0x00; //不可刪除
FloorCallCheck();
Elevator();
if(SendTick1S!=Timer_Second)
{
SendTick1S=Timer_Second;
Uart_SendBytes((u8*)(&ElevState),sizeof(ElevState));
}
}
}
資料清單(提供資料清單所有文件):
資料下載鏈接見文章開頭