标题:
单片机操作系统源码,可以完成基本的电梯功能
[打印本页]
作者:
ADWUDI
时间:
2019-3-9 10:28
标题:
单片机操作系统源码,可以完成基本的电梯功能
此电梯完成了基本的逻辑功能
0.png
(4.83 KB, 下载次数: 40)
下载附件
2019-3-11 00:07 上传
单片机源程序如下:
#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}}; //建立任务列表
static u8 taskID = 0;
static u8 process_status = 0;
u8 now_lift = 1; //当前电梯所在楼层
sbit BEEP = P0^7;
static void Task_Clear(u8 taskid) //清除任务表中的指定任务
{
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) //清除任务表
{
Task_Clear(0);
Task_Clear(1);
Task_Clear(2);
Task_Clear(3);
}
void Check_Task_Table(void) //查询任务表
{
LED_display(now_lift);
while(task_buff[taskID].now_dir == 0); //等待任务发生
}
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) //如果当前电梯空闲
{
if(lift_id >= now_lift)
{
task_buff[taskID].now_dir = 1; //创建新任务
task_buff[taskID].lift_buff[lift_id - 1] = 1;
task_buff[taskID].max_lift = lift_id;
}
else
{
task_buff[taskID].now_dir = 2; //创建新任务
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) //如果向上运行
{
if(lift_id >= now_lift) //如果人在电梯之上
{
task_buff[taskID].lift_buff[lift_id - 1] = 1; //在当前任务中添加
if(lift_id > task_buff[taskID].max_lift)
{
task_buff[taskID].max_lift = lift_id;
}
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 2; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
}
else if(task_buff[taskID].now_dir == 2) //如果向下运行
{
if(lift_id <= now_lift) //如果人在电梯之下
{
task_buff[taskID].lift_buff[lift_id - 1] = 1; //在当前任务中添加
if(lift_id < task_buff[taskID].min_lift)
{
task_buff[taskID].min_lift = lift_id;
}
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 1; //创建新任务
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; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 1; //创建新任务
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; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 1; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
}
}
}
else if(in_out == 0) //如果人在里面按按键
{
if(task_buff[taskID].now_dir == 0) //如果当前电梯空闲
{
if(lift_id >= now_lift)
{
task_buff[taskID].now_dir = 1; //创建新任务
task_buff[taskID].lift_buff[lift_id - 1] = 1;
task_buff[taskID].max_lift = lift_id;
}
else
{
task_buff[taskID].now_dir = 2; //创建新任务
task_buff[taskID].lift_buff[lift_id - 1] = 1;
task_buff[taskID].min_lift = lift_id;
}
}
else if(task_buff[taskID].now_dir == 1) //如果当前运行方向向上
{
if(lift_id > now_lift) //如果要去的楼层在当前楼层之上
{
task_buff[taskID].lift_buff[lift_id - 1] = 1; //在当前任务中添加
if(lift_id > task_buff[taskID].max_lift)
{
task_buff[taskID].max_lift = lift_id;
}
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 2; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
}
else if(task_buff[taskID].now_dir == 2) //如果当前运行方向向下
{
if(lift_id < now_lift) //如果要去的楼层在当前楼层之下
{
task_buff[taskID].lift_buff[lift_id - 1] = 1; //在当前任务中添加
if(lift_id < task_buff[taskID].min_lift)
{
task_buff[taskID].min_lift = lift_id;
}
}
else
{
task_buff[(taskID + 1) % 4].now_dir = 1; //创建新任务
task_buff[(taskID + 1) % 4].lift_buff[lift_id - 1] = 1;
}
}
}
}
void Update_Task_Table(void) //更新任务列表
{
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) //当前任务需向上
{
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) //当前任务需向下
{
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); //电梯不动
LED_UP_OFF;
}
else //5s时间到
{
if(now_lift >= task_buff[taskID].max_lift) //如果已经到达当前任务的最高层
{
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); //电梯不动
LED_UP_OFF;
}
else
{
if(now_lift <= task_buff[taskID].min_lift) //如果已经到达当前任务的最低层
{
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); //清除刚才完成的任务
taskID = (taskID + 1) % 4; //指向下一个任务
}
break;
}
}
}
复制代码
#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(); //清除任务表
while(1)
{
Check_Task_Table(); //查询任务表
Task_Init(); //任务初始化
Task_Process(); //执行任务
}
}
复制代码
所有资料51hei提供下载:
电梯.zip
(79.41 KB, 下载次数: 12)
2019-3-9 10:28 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-3-11 00:09
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1