国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品
電子工程網
標題:
系統定時簡易封裝
[打印本頁]
作者:
machunshui
時間:
2009-6-24 22:14
標題:
系統定時簡易封裝
裸奔的時候,
因為在一個子任務當中,
為提高效率,不能傻等,
需要系統定時的情況很多,
處理起來比較麻煩,
如果對系統定時器進行簡單的封裝,
就會比較方便,
下面的就是我寫的一個用系統定時器封裝后處理閃爍燈的例子:
main.h:
#ifndef _MAIN_H
#define _MAIN_H
#include
#define MAX_SYSTIMER_COUNT 6
extern unsigned short sysTimer[MAX_SYSTIMER_COUNT];
unsigned char SetSysTimer(unsigned char id,unsigned short value);
unsigned char GetSysTimer(unsigned char id);
#endif
main.c:
#include "main.h"
#include "led.h"
__CONFIG(INTIO & WDTDIS & PWRTEN & MCLREN & CP & CPD & BOREN & IESODIS & FCMEN & LVPDIS & DEBUGEN & WP0 & BORV21 );
unsigned char t0InitValue;
unsigned short sysTimer[MAX_SYSTIMER_COUNT];
////////////初始化timer0//////////////////////
void InitTimer0(void)
{
OPTION = 0x06; //1:128分頻
//8M 時鐘,10ms定時
t0InitValue = 256-(20000/128); /*256-100=156us,定時10ms = 20000 step/128 = 156.25*/
TMR0 = t0InitValue;
T0IF = 0;
T0IE = 1; //開中斷
}
////////////////初始化系統定時/////////////////////////////////
void InitSysTimer(void)
{
unsigned char i;
for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
{
sysTimer[i] = 0;
}
}
//////////////////////系統定時器計數/////////////////////////////
void CountSysTimer(void)
{
unsigned char i;
for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
{
if(sysTimer[i] > 0)
sysTimer[i]--;
}
}
////////////////////設置系統定時器/////////////////////////////////////////
unsigned char SetSysTimer(unsigned char id,unsigned short value)
{
if(id < MAX_SYSTIMER_COUNT)
{
sysTimer[id] = value;
return 1;
}
else
return 0;
}
/////////////////////獲取系統定時狀態////////////////////////////////////////
unsigned char GetSysTimer(unsigned char id)
{
if(sysTimer[id] == 0)
return 1;
else
return 0;
}
/////////////////系統初始化/////////////////////
void InitSys(void)
{
INTCON = 0; //關閉總中斷,禁止外設,timer0,外部,電平中斷,清除timer0,外部,電平中斷標志
ANSEL = 0;
ANSELH = 0; //所有IO都為數字口
InitLedFlash();
InitSysTimer(); //初始化系統定時器
InitTimer0(); //初始化定時器0
PEIE = 1; //開外設中斷
GIE = 1; //開總中斷
}
///////////中斷函數//////////////
void interrupt ISR(void)
{
if(T0IE && T0IF)
{
CountSysTimer();//系統定時器計數
TMR0 = t0InitValue;
T0IF = 0;
}
}
//////////////////主函數///////////////////////
void main()
{
OSCCON = 0x78;//時鐘8M,時鐘模式由配置字決定
InitSys();
while(1)
{
FlashLed();
}
}
led.c:
#include "main.h"
#include "led.h"
void InitLedFlash(void)
{
TRISD0 = 0;//輸出
}
void FlashLed()
{
if(GetSysTimer(0))
{
RD0 ^= 1;
SetSysTimer(0,100);//100*10ms = 1s
}
}
作者:
machunshui
時間:
2009-6-24 22:16
帶proteus仿真的完整工程:
pic-basic.rar
2009-6-24 22:16 上傳
點擊文件名下載附件
下載積分: 積分 -1
56.99 KB, 下載積分: 積分 -1
作者:
sz_kd
時間:
2009-6-25 09:40
呵呵,采用狀態機就是避免死等
作者:
machunshui
時間:
2009-6-25 10:03
實際上狀態機的叫法過于玄乎,
就是一種任務分割而已,
就是把任務分割稱若干斷不可再分割的代碼段,
根據條件執行這些代碼段.
實際上這種封裝帶來的好處是不死等延時處理的方便,
而不是代替任務分割這種方法.
作者:
古道熱腸
時間:
2009-7-7 12:27
呵呵,寫得不錯,如果用Bool變量作為布爾型值來處理,更省內存.
作者:
machunshui
時間:
2009-7-7 13:36
呵呵,
我覺得這種封裝真的很好用啊.
我寫的那個" 基于PIC的I2C從動模塊的鍵盤,顯示例子",
鍵盤延時和數碼管顯示閃爍延時用起來很方便.
作者:
machunshui
時間:
2009-7-7 13:38
用位結構的省RAM,
但是多幾行代碼,
運行速度降低了,
這個東西要在定時中斷里面不斷掃描,
還是快一點好
作者:
machunshui
時間:
2009-7-7 14:08
要說改進可以把void CountSysTimer(void)采用宏定義的方法,
省去函數調用,
在定時器中斷里面運行速度快一點.
作者:
McuPlayer
時間:
2009-7-7 20:33
嗯不錯,我也在一個產品中做了類似的工作
1、把所有的CPU空閑時間收集起來交給一個Idel函數來處理,如果以后要休眠就在這個函數內部做就好了。
2、中斷采取類似DPC調用的方式處理幾個相關的工作
3、建立mini的MessageQuen
作者:
gfd
時間:
2010-7-26 10:23
太強了
歡迎光臨 電子工程網 (http://m.qingdxww.cn/)
Powered by Discuz! X3.4
主站蜘蛛池模板:
亚洲成AV人片一区二区不卡
|
国产在线精品一区二区在线看
|
国产午夜理论片YY8840Y
|
麻豆一区二区三区蜜桃免费
|
天天影视色欲 影视
|
色视频免费国产观看
|
亚洲人人为我我为人人
|
日本妈妈黄色片
|
欧美一区二区亚洲
|
婷婷深爱五月
|
天天视频色版
|
四虎影院观看视频在线观看
|
一个综合色最更新快
|
东北真实仑乱
|
麻豆COMCN
|
夜色成人网
|
欧美性精品人妖
|
天天看天天射天天碰
|
亚洲精品永久免费
|
blacked黑人战小美女
|
久久精品天天爽夜夜爽
|
亚洲 自拍 欧洲 视频二区
|
亚洲二区在线播放
|
人人爱人人插
|
亚洲国产高清在线
|
亚洲精品一区二区三区在线播放
|
国产精品久久久久一区二区三区
|
沈阳熟女露脸对白视频
|
欧美久久综合性欧美
|
熟女毛片
|
午夜影视在线
|
99久久做夜夜爱天天做精品
|
免费在线视频成人
|
欧美剧情v网站在线看
|
一级a性色生活片久久毛片
|
亚洲天堂影院
|
一个人看的www视频在线观看视频
|
精品亚洲麻豆1区2区3区
|
野花社区视频WWW高清
|
亚洲国产九九精品一区二区
|
深夜视频在线
|