|
此電梯完成了基本的邏輯功能
單片機(jī)源程序如下:
- #include "task.h"
- typedef enum
- {
- judge = 0,
- up_open_door = 1,
- uping = 2,
- up_lift = 3,
- down_open_door = 4,
- downing = 5,
- down_lift = 6,
- finish = 7
- }_up_Typedef_t;
- static _up_Typedef_t up_status = judge;
- _task_Typedef_t task_buff[4] = {0,0,0,{0}}; //建立任務(wù)列表
- static u8 taskID = 0;
- static u8 process_status = 0;
- u8 now_lift = 1; //當(dāng)前電梯所在樓層
- sbit BEEP = P0^7;
- static void Task_Clear(u8 taskid) //清除任務(wù)表中的指定任務(wù)
- {
- task_buff[taskid].now_dir = 0;
- task_buff[taskid].max_lift = 1;
- task_buff[taskid].min_lift = 4;
- task_buff[taskid].lift_buff[0] = 0;
- task_buff[taskid].lift_buff[1] = 0;
- task_buff[taskid].lift_buff[2] = 0;
- task_buff[taskid].lift_buff[3] = 0;
- }
- void Task_Table_Clear(void) //清除任務(wù)表
- {
- Task_Clear(0);
- Task_Clear(1);
- Task_Clear(2);
- Task_Clear(3);
- }
- void Check_Task_Table(void) //查詢(xún)?nèi)蝿?wù)表
- {
- LED_display(now_lift);
- while(task_buff[taskID].now_dir == 0); //等待任務(wù)發(fā)生
- }
- void Task_Init(void)
- {
- process_status = 1;
- up_status = judge;
- }
- void Task_Creat(u8 dir,u8 lift_id,u8 in_out) //in_out:0,里面按鍵,1外面按鍵
- {
- if(in_out == 1) //外面按鍵
- {
- if(task_buff[taskID].now_dir == 0) //如果當(dāng)前電梯空閑
- {
- if(lift_id >= now_lift)
- {
- task_buff[taskID].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[taskID].lift_buff[lift_id - 1] = 1;
- task_buff[taskID].max_lift = lift_id;
- }
- else
- {
- task_buff[taskID].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[taskID].lift_buff[lift_id - 1] = 1;
- task_buff[taskID].min_lift = lift_id;
- }
- }
- else if(dir == task_buff[taskID].now_dir) //如果順路
- {
- if(task_buff[taskID].now_dir == 1) //如果向上運(yùn)行
- {
- if(lift_id >= now_lift) //如果人在電梯之上
- {
- task_buff[taskID].lift_buff[lift_id - 1] = 1; //在當(dāng)前任務(wù)中添加
- if(lift_id > task_buff[taskID].max_lift)
- {
- task_buff[taskID].max_lift = lift_id;
- }
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- else if(task_buff[taskID].now_dir == 2) //如果向下運(yùn)行
- {
- if(lift_id <= now_lift) //如果人在電梯之下
- {
- task_buff[taskID].lift_buff[lift_id - 1] = 1; //在當(dāng)前任務(wù)中添加
- if(lift_id < task_buff[taskID].min_lift)
- {
- task_buff[taskID].min_lift = lift_id;
- }
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- }
- else
- {
- if(dir == 1) //如果人想向上
- {
- if(task_buff[taskID].min_lift > lift_id)
- {
- task_buff[(taskID + 1) % 4].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- else if(dir == 2) //如果人想向下
- {
- if(task_buff[taskID].max_lift > lift_id)
- {
- task_buff[(taskID + 1) % 4].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- }
- }
- else if(in_out == 0) //如果人在里面按按鍵
- {
- if(task_buff[taskID].now_dir == 0) //如果當(dāng)前電梯空閑
- {
- if(lift_id >= now_lift)
- {
- task_buff[taskID].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[taskID].lift_buff[lift_id - 1] = 1;
- task_buff[taskID].max_lift = lift_id;
- }
- else
- {
- task_buff[taskID].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[taskID].lift_buff[lift_id - 1] = 1;
- task_buff[taskID].min_lift = lift_id;
- }
- }
- else if(task_buff[taskID].now_dir == 1) //如果當(dāng)前運(yùn)行方向向上
- {
- if(lift_id > now_lift) //如果要去的樓層在當(dāng)前樓層之上
- {
- task_buff[taskID].lift_buff[lift_id - 1] = 1; //在當(dāng)前任務(wù)中添加
- if(lift_id > task_buff[taskID].max_lift)
- {
- task_buff[taskID].max_lift = lift_id;
- }
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 2; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- else if(task_buff[taskID].now_dir == 2) //如果當(dāng)前運(yùn)行方向向下
- {
- if(lift_id < now_lift) //如果要去的樓層在當(dāng)前樓層之下
- {
- task_buff[taskID].lift_buff[lift_id - 1] = 1; //在當(dāng)前任務(wù)中添加
- if(lift_id < task_buff[taskID].min_lift)
- {
- task_buff[taskID].min_lift = lift_id;
- }
- }
- else
- {
- task_buff[(taskID + 1) % 4].now_dir = 1; //創(chuàng)建新任務(wù)
- task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
- }
- }
- }
- }
- void Update_Task_Table(void) //更新任務(wù)列表
- {
- switch(gKey_Value)
- {
- case IN_FLOOR_1: //如果在一樓
- {
- gKey_Value = 0;
- Task_Creat(0,1,0);
- }
- break;
- case IN_FLOOR_2:
- {
- gKey_Value = 0;
- Task_Creat(0,2,0);
- }
- break;
- case IN_FLOOR_3:
- {
- gKey_Value = 0;
- Task_Creat(0,3,0);
- }
- break;
- case IN_FLOOR_4:
- {
- gKey_Value = 0;
- Task_Creat(0,4,0);
- }
- break;
- case OPEN_DOOR:
- {
- gKey_Value = 0;
-
- }
- break;
- case CLOSE_DOOR:
- {
- gKey_Value = 0;
- }
- break;
- case OUT_FLOOR_DOWN_2:
- {
- gKey_Value = 0;
- Task_Creat(2,2,1);
- }
- break;
- case OUT_FLOOR_UP_2:
- {
- gKey_Value = 0;
- Task_Creat(1,2,1);
- }
- break;
- case OUT_FLOOR_1:
- {
- gKey_Value = 0;
- Task_Creat(1,1,1);
- }
- break;
- case OUT_FLOOR_4:
- {
- gKey_Value = 0;
- Task_Creat(2,4,1);
- }
- break;
- case OUT_FLOOR_DOWN_3:
- {
- gKey_Value = 0;
- Task_Creat(2,3,1);
- }
- break;
- case OUT_FLOOR_UP_3:
- {
- gKey_Value = 0;
- Task_Creat(1,3,1);
- }
- break;
- case WRINGING:
- {
- gKey_Value = 0;
- BEEP = 0;
- }
- break;
- }
- }
- void Task_Process(void)
- {
- while(process_status)
- {
- switch(up_status)
- {
- case judge:
- {
- if(task_buff[taskID].now_dir == 1) //當(dāng)前任務(wù)需向上
- {
- if(task_buff[taskID].lift_buff[now_lift - 1] == 1) //本層需上人
- {
- up_status = up_open_door;
- time_count = 0;
- }
- else //本層不需上人
- {
- up_status = uping;
- time_count = 0;
- }
- }
- else if(task_buff[taskID].now_dir == 2) //當(dāng)前任務(wù)需向下
- {
- if(task_buff[taskID].lift_buff[now_lift - 1] == 1) //本層需上人
- {
- up_status = down_open_door;
- time_count = 0;
- }
- else //本層不需上人
- {
- up_status = downing;
- time_count = 0;
- }
- }
- LED_display(now_lift);
- }
- break;
- case up_open_door:
- {
- if(time_count < 3000)
- {
- Motor_Status(0); //電梯不動(dòng)
- LED_UP_OFF;
- }
- else //5s時(shí)間到
- {
- if(now_lift >= task_buff[taskID].max_lift) //如果已經(jīng)到達(dá)當(dāng)前任務(wù)的最高層
- {
- up_status = finish;
- }
- else
- {
- up_status = uping;
- time_count = 0;
- }
- }
- }
- break;
- case uping:
- {
- if(time_count < 2000)
- {
- Motor_Status(1); //向上
- LED_UP_ON;
- }
- else
- {
- up_status = up_lift;
- }
- }
- break;
- case up_lift:
- {
- if(now_lift < 4)
- {
- now_lift++;
- LED_display(now_lift);
- if(task_buff[taskID].lift_buff[now_lift - 1] == 0) //如果不需上人
- {
- up_status = uping;
- time_count = 0;
- }
- else
- {
- up_status = up_open_door;
- time_count = 0;
- }
- }
- }
- break;
- case down_open_door:
- {
- if(time_count < 3000)
- {
- Motor_Status(0); //電梯不動(dòng)
- LED_UP_OFF;
- }
- else
- {
- if(now_lift <= task_buff[taskID].min_lift) //如果已經(jīng)到達(dá)當(dāng)前任務(wù)的最低層
- {
- up_status = finish;
- }
- else
- {
- up_status = downing;
- time_count = 0;
- }
- }
- }
- break;
- case downing:
- {
- if(time_count < 2000)
- {
- Motor_Status(2); //向下
- LED_DOWN_ON;
- }
- else
- {
- up_status = down_lift;
- }
- }
- break;
- case down_lift:
- {
- if(now_lift > 1)
- {
- now_lift--;
- LED_display(now_lift);
- if(task_buff[taskID].lift_buff[now_lift - 1] == 0) //如果不需上人
- {
- up_status = downing;
- time_count = 0;
- }
- else
- {
- up_status = down_open_door;
- time_count = 0;
- }
- }
- }
- break;
- case finish:
- {
- process_status = 0;
- Task_Clear(taskID); //清除剛才完成的任務(wù)
- taskID = (taskID + 1) % 4; //指向下一個(gè)任務(wù)
- }
- break;
- }
- }
- }
復(fù)制代碼
- #include <reg52.h>
- #include "main.h"
- #include "display.h"
- #include "delay.h"
- #include "key.h"
- #include "motor.h"
- #include "task.h"
- u16 time_count = 0;
- int main(void)
- {
- delay_init();
- Task_Table_Clear(); //清除任務(wù)表
-
- while(1)
- {
- Check_Task_Table(); //查詢(xún)?nèi)蝿?wù)表
- Task_Init(); //任務(wù)初始化
- Task_Process(); //執(zhí)行任務(wù)
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
電梯.zip
(79.41 KB, 下載次數(shù): 12)
2019-3-9 10:28 上傳
點(diǎn)擊文件名下載附件
|
|