欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
分時復用程序范本51單片機程序框架
[打印本頁]
作者:
rvanji2010
時間:
2019-12-24 22:01
標題:
分時復用程序范本51單片機程序框架
由于經常涉及到單片機開發,所以需要一個能夠跑多任務的程序框架,用操作系統有點兒浪費資源,用普通線程方式又不能執行多任務,所以采取分時復用的方式,來跑多任務。
寫一個范本為以后開發服務。
單片機源程序如下:
#include "common.h"
/**************************************************************************************
* Variable definition
**************************************************************************************/
static TASK_COMPONENTS TaskComps[] =
{
{0, 60, 60, TaskDisplay}, // 顯示時鐘
{0, 20, 20, TaskKeySan}, // 按鍵掃描
{0, 500, 500, TaskDispStatus}, // 顯示工作狀態
{0, 0, 0, TaskKeyProcess}, // 按鍵處理任務
// 這里添加你的任務。。。。
};
void main(void)
{
WDT_Config(); //初始化看門狗
TaskInit(); //任務端口資源初始化
Timer0Init(); //系統時間片管理器初始化
while(1)
{
WDT_CLR(); //喂狗
TaskProcess(); //任務處理函數
if(keyup_data!=0) //有按鍵按下需要進行處理
TaskComps[3].Run = 1;
}
}
void Timer0Init(void) //1毫秒@24.000MHz
{
AUXR &= 0x7F; //定時器時鐘12T模式
TMOD &= 0xF0; //設置定時器模式
TL0 = 0x30; //設置定時初值
TH0 = 0xF8; //設置定時初值
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
ET0 = 1; //開啟定時器0中斷
EA = 1;
}
/**************************************************************************************
* FunctionName : TimerInterrupt()
* Description : 定時中斷服務函數
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void Timer0_Interrupt() interrupt 1
{
uint8 i;
for (i=0; i<TASK_NUM; i++) // 逐個任務時間處理
{
if (TaskComps[i].Timer) // 時間不為0
{
TaskComps[i].Timer--; // 減去一個節拍
if (TaskComps[i].Timer == 0) // 時間減完了
{
TaskComps[i].Timer = TaskComps[i].ItvTime; // 恢復計時器值,從新下一次
TaskComps[i].Run = 1; // 任務可以運行
}
}
}
}
/**************************************************************************************
* FunctionName : WDT_Config()
* Description : 看門狗配置
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void WDT_Config(void)
{
WDT_CONTR = 0x04; //看門狗定時器溢出時間計算公式: (12 * 32768 * PS) / FOSC (秒)
//設置看門狗定時器分頻數為32,溢出時間如下:
//11.0592M : 1.14s
//18.432M : 0.68s
//20M : 0.63s
//24M : 0.52s
WDT_CONTR |= 0x20; //啟動看門狗
}
/**************************************************************************************
* FunctionName : TaskProcess()
* Description : 任務處理
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskProcess(void)
{
uint8 i;
for (i=0; i<TASK_MAX; i++) // 逐個任務時間處理
{
if (TaskComps[i].Run) // 時間不為0
{
TaskComps[i].TaskHook(); // 運行任務
TaskComps[i].Run = 0; // 標志清0
}
}
}
復制代碼
#include "common.h"
//按鍵掃描變量
uint8 keydown_data=0x00; //按鍵按下后就返回的值
uint8 keyup_data=0x00; //按鍵抬起返回值
uint16 key_time=0x00; //按鍵按下之后的時間計數,該值乘以掃描一次按鍵函數的時間就等于按鍵按下的時間
uint8 key_tem=0x00; //長按的按鍵值與按鍵掃描程序過渡變量
uint8 key_bak=0x00; //按鍵掃描程序過渡變量
/**************************************************************************************
* FunctionName : TaskInit()
* Description : 任務配置
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskInit(void)
{
TaskDispStatusInit();
TaskKeySanInit();
}
/**************************************************************************************
* FunctionName : TaskDisplay()
* Description : 顯示任務
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskDisplay(void)
{
}
/**************************************************************************************
* FunctionName : TaskKeySanInit()
* Description : 掃描任務初始化
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskKeySanInit(void)
{
P0M0 = 0;
P0M1 = 0;
P0 |= 0x0f;
}
/**************************************************************************************
* FunctionName : TaskKeySan()
* Description : 掃描任務
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskKeySan(void)
{
uint8 mode=0;
keyup_data=0; //鍵抬起后按鍵值一次有效
//----------------------------------------------------------------------------------
if(KEY2==0||KEY3==0) //有鍵正按下
{
if(KEY2==0) key_tem=1;
else if(KEY3==0) key_tem=2;
if (key_tem == key_bak) //有鍵按下后第一次掃描不處理,與else配合第二次掃描有效,這樣實現了去抖動
{
key_time++; //有鍵按下后執行一次掃描函數,該變量加1
keydown_data=key_tem; //按鍵值賦予keydown_data
if( (mode==0)&&(key_time>1) )//key_time>1按鍵值無效,這就是單按,如果mode為1就為連按
keydown_data=0;
}
else //去抖動
{
key_time=0;
key_bak=key_tem;
}
}
else //鍵抬起
{
if(key_time>2) //按鍵抬起后返回一次按鍵值
{
keyup_data=key_tem; //鍵抬起后按鍵值賦予keydown_data
}
key_bak=0; //要清零,不然下次執行掃描程序時按鍵的值跟上次按的值一樣,就沒有去抖動處理了
key_time=0;
keydown_data=0;
}
//-----------------------------------------------------------------------------------
if(KEY0 == 0);
if(KEY1 == 0);
}
/**************************************************************************************
* FunctionName : TaskKeyProcess()
* Description : 掃描任務
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskKeyProcess(void)
{
switch(keyup_data)
{
case 1:break;
case 2:break;
}
}
/**************************************************************************************
* FunctionName : TaskDispStatusInit()
* Description : 工作狀態顯示初始化
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskDispStatusInit(void)
{
P5M0 |= 0x20;
P5M1 = 0;
DispStatusLed = 1;
}
/**************************************************************************************
* FunctionName : TaskDispStatus()
* Description : 工作狀態顯示
* EntryParameter : None
* ReturnValue : None
**************************************************************************************/
void TaskDispStatus(void)
{
DispStatusLed = ~DispStatusLed;
}
// 這里添加其他任務。。。。。。。。。
復制代碼
所有資料51hei提供下載:
42 程序框架.rar
(168.62 KB, 下載次數: 72)
2019-12-24 22:00 上傳
點擊文件名下載附件
51分時復用程序框架
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1