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