IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 【51单片机】 -> 正文阅读

[嵌入式]【51单片机】

#include <reg51.h> ?????????????//51 单片机头文件

#define GPIO0_CONCTRON P0 ?????????????// 定义 IO

#define GPIO1_CONCTRON P1

#define GPIO2_CONCTRON P2

#define GPIO3_CONCTRON P3

#define true 1

#define flase 0

#define MaxTask 3? ?????????????// 总任务数

#define Task_one 0? ?????????????// 任务 0

#define Task_two 1? ?????????????// 任务 1

#define Task_three 2? ?????????????// 任务 2

#define Task_one_Period 100? ?????????????// 任务 0 的挂起周期 // 也就是说 它过了这个时间再运行

#define Task_two_Period 4000? ?????????????// 任务 0 的挂起周期

#define Task_three_Period 70? ?????????????// 任务 0 的挂起周期

int count = 0;

typedef struct? ?????????????// 结构体

{

unsigned int wTaskPeriod; ??????????????// 运行周期

unsigned int wTaskCount; ?????????????// 运行周期计数器

unsigned int wEvent; ?????????????// 任务信号

}OSTCB;

OSTCB OS_TCB[MaxTask];

void OS_Create_Task(unsigned int mTaskPro,unsigned int mTaskPreiod) ?????????????// 创建任务第一个参数 任务 ID 号 第二个参数 任务运行周期

{

OS_TCB[mTaskPro].wTaskPeriod= mTaskPreiod;???????????? ?// 把任务运行周期加载到 ?TCB 结构体

}

void OS_Event_Post(unsigned char mTask,unsigned int mEvent)???????????? // 任务信号邮箱

{

OS_TCB[mTask].wEvent =( 1<<mEvent);

}

void OS_Updata_Task(void)???????????? // 任务加载

{

int mTemp;

for(mTemp = 0;mTemp < MaxTask;mTemp ++)???????????? ?// 查询三个任务,

{

OS_TCB[mTemp].wTaskCount ++;

if(OS_TCB[mTemp].wTaskCount == OS_TCB[mTemp].wTaskPeriod)???????????? // 如果运行周期计数器 = 运行周期 则任务发送信号量 说明改任务要运行了

{

OS_TCB[mTemp].wTaskCount = 0;

OS_Event_Post(mTemp,mTemp);???????????? // 第一个参数任务 ID 号 第二个参数 任务信号量

}

}

}

void OS_Task_Int(void)???????????? // 任务初始化

{

unsigned char mTemp;

for(mTemp = 0;mTemp < MaxTask;mTemp ++)

{

OS_TCB[mTemp].wTaskPeriod = 0;

OS_TCB[mTemp].wTaskCount = 0;

OS_TCB[mTemp].wEvent = 0;

}

}

unsigned int OS_Event_Pend(unsigned char mTask)??????????? ?// 发送任务邮箱

{

unsigned int mTaskEvent;??????????? // 发送这个任务的信号量

mTaskEvent = OS_TCB[mTask].wEvent;

OS_TCB[mTask].wEvent &=~mTaskEvent;??????????? ?// 运行完后就清这个任务的信号量

return mTaskEvent;

}

void Int_Hardware(void)??????????? //51 单片机复位

{

GPIO0_CONCTRON = 0xff;

GPIO1_CONCTRON = 0x01;

GPIO2_CONCTRON = 0xff;

GPIO3_CONCTRON = 0xff;

}

void Task1(void)??????????? // 任务 1 运行函数

{

unsigned int GetEvent;

while(1)

{

GetEvent = OS_Event_Pend(Task_one);

if(GetEvent == 0)

{

return;

}

if(GetEvent &(1<<Task_one))

{

GPIO0_CONCTRON = ~GPIO0_CONCTRON;

}

}

}

void Task2(void)??????????? // 任务 2 行函数

{

unsigned int GetEvent;

while(1)

{

GetEvent = OS_Event_Pend(Task_two);

if(GetEvent == 0)

{

return;

}

if(GetEvent & (1<<Task_two))

{

GPIO1_CONCTRON = ~GPIO1_CONCTRON;

}

}

}

void Task3(void)????????? ?// 任务 3 行函数

{

unsigned int GetEvent;????????? ?// 获取信号量

while(1)

{

GetEvent = OS_Event_Pend(Task_three);????????? // 查任务是否运行完 返回信号量

if(GetEvent == 0)????????? // 如任务运行完成任务挂起,等待下次运行

{

return;

}

if(GetEvent & (1<<Task_three))????????? // 有任务在运行,就运行这个任务

{

GPIO2_CONCTRON = ~GPIO2_CONCTRON;????????? // 单片机 IO 取反

}

}

}

void OS_start(void)????????? // 任务开始

{

while(1)

{

Task1();

Task2();

Task3();

}

}

void main(void)

{

IE = 0x82;????????? // 开中断

TMOD = 0x01;

TH0 = (65536-1)/256;

TL0 = (65536-1)%256;

TR0 = 1;????????? ?// 开定时器

Int_Hardware();????????? ?// 硬件复位

OS_Task_Int();????????? // 任务初始化

while(1)

{

OS_Create_Task(Task_one,Task_one_Period);????????? ?// 在 TCB 结构体里任务加载下面 3 个任务

OS_Create_Task(Task_two,Task_two_Period);

OS_Create_Task(Task_three,Task_three_Period);

OS_start();

}

}

void inter(void) interrupt 1 ??????????// 任务毫秒 查循一次进行任务调度

{

TH0 = (65536-1)/256;

TL0 = (65536-1)%256;

OS_Updata_Task();????????? // 任务查询,更新 和 发送

}

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 11:22:14  更:2021-08-03 11:22:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:46:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码