国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

查看: 6195|回復(fù): 9
打印 上一主題 下一主題

系統(tǒng)定時(shí)簡(jiǎn)易封裝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2009-6-24 22:14:32 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)鍵詞: 封裝 , 系統(tǒng)
裸奔的時(shí)候,
因?yàn)樵谝粋(gè)子任務(wù)當(dāng)中,
為提高效率,不能傻等,
需要系統(tǒng)定時(shí)的情況很多,
處理起來(lái)比較麻煩,
如果對(duì)系統(tǒng)定時(shí)器進(jìn)行簡(jiǎn)單的封裝,
就會(huì)比較方便,

下面的就是我寫(xiě)的一個(gè)用系統(tǒng)定時(shí)器封裝后處理閃爍燈的例子:

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 時(shí)鐘,10ms定時(shí)
    t0InitValue = 256-(20000/128);    /*256-100=156us,定時(shí)10ms = 20000 step/128 = 156.25*/
    TMR0 = t0InitValue;
   
    T0IF = 0;
    T0IE = 1;                        //開(kāi)中斷
}

////////////////初始化系統(tǒng)定時(shí)/////////////////////////////////
void InitSysTimer(void)
{
    unsigned char i;
    for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
    {
        sysTimer[i] = 0;
    }   
}

//////////////////////系統(tǒng)定時(shí)器計(jì)數(shù)/////////////////////////////
void CountSysTimer(void)
{
    unsigned char i;
    for(i = 0; i < MAX_SYSTIMER_COUNT; i++)
    {
        if(sysTimer[i] > 0)
            sysTimer[i]--;
    }   
}

////////////////////設(shè)置系統(tǒng)定時(shí)器/////////////////////////////////////////
unsigned char SetSysTimer(unsigned char id,unsigned short value)
{
    if(id < MAX_SYSTIMER_COUNT)
    {
        sysTimer[id] = value;
        return 1;
    }
    else
        return 0;   
}

/////////////////////獲取系統(tǒng)定時(shí)狀態(tài)////////////////////////////////////////
unsigned char GetSysTimer(unsigned char id)
{
    if(sysTimer[id] == 0)
        return 1;
    else
        return 0;
}                    

/////////////////系統(tǒng)初始化/////////////////////   
void InitSys(void)
{
    INTCON = 0;            //關(guān)閉總中斷,禁止外設(shè),timer0,外部,電平中斷,清除timer0,外部,電平中斷標(biāo)志
   
    ANSEL = 0;
    ANSELH = 0;            //所有IO都為數(shù)字口

    InitLedFlash();
   
    InitSysTimer();        //初始化系統(tǒng)定時(shí)器
    InitTimer0();        //初始化定時(shí)器0
    PEIE = 1;            //開(kāi)外設(shè)中斷
    GIE = 1;            //開(kāi)總中斷
}


///////////中斷函數(shù)//////////////
void interrupt ISR(void)
{
    if(T0IE && T0IF)
    {
        CountSysTimer();//系統(tǒng)定時(shí)器計(jì)數(shù)
        TMR0 = t0InitValue;
        T0IF = 0;
    }   
}


//////////////////主函數(shù)///////////////////////   
void main()
{
    OSCCON = 0x78;//時(shí)鐘8M,時(shí)鐘模式由配置字決定
    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
    }   
}
沙發(fā)
 樓主| 發(fā)表于 2009-6-24 22:16:47 | 只看該作者
帶proteus仿真的完整工程:

pic-basic.rar

56.99 KB, 下載積分: 積分 -1

板凳
發(fā)表于 2009-6-25 09:40:22 | 只看該作者
呵呵,采用狀態(tài)機(jī)就是避免死等
地板
 樓主| 發(fā)表于 2009-6-25 10:03:14 | 只看該作者
實(shí)際上狀態(tài)機(jī)的叫法過(guò)于玄乎,
就是一種任務(wù)分割而已,
就是把任務(wù)分割稱若干斷不可再分割的代碼段,
根據(jù)條件執(zhí)行這些代碼段.

實(shí)際上這種封裝帶來(lái)的好處是不死等延時(shí)處理的方便,
而不是代替任務(wù)分割這種方法.
地下室
發(fā)表于 2009-7-7 12:27:33 | 只看該作者
呵呵,寫(xiě)得不錯(cuò),如果用Bool變量作為布爾型值來(lái)處理,更省內(nèi)存.
6
 樓主| 發(fā)表于 2009-7-7 13:36:04 | 只看該作者
呵呵,
我覺(jué)得這種封裝真的很好用啊.

我寫(xiě)的那個(gè)" 基于PIC的I2C從動(dòng)模塊的鍵盤(pán),顯示例子",

鍵盤(pán)延時(shí)和數(shù)碼管顯示閃爍延時(shí)用起來(lái)很方便.
7
 樓主| 發(fā)表于 2009-7-7 13:38:47 | 只看該作者
用位結(jié)構(gòu)的省RAM,
但是多幾行代碼,
運(yùn)行速度降低了,

這個(gè)東西要在定時(shí)中斷里面不斷掃描,
還是快一點(diǎn)好
8
 樓主| 發(fā)表于 2009-7-7 14:08:15 | 只看該作者
要說(shuō)改進(jìn)可以把void CountSysTimer(void)采用宏定義的方法,
省去函數(shù)調(diào)用,
在定時(shí)器中斷里面運(yùn)行速度快一點(diǎn).
9
發(fā)表于 2009-7-7 20:33:52 | 只看該作者
嗯不錯(cuò),我也在一個(gè)產(chǎn)品中做了類似的工作
1、把所有的CPU空閑時(shí)間收集起來(lái)交給一個(gè)Idel函數(shù)來(lái)處理,如果以后要休眠就在這個(gè)函數(shù)內(nèi)部做就好了。
2、中斷采取類似DPC調(diào)用的方式處理幾個(gè)相關(guān)的工作
3、建立mini的MessageQuen
10
發(fā)表于 2010-7-26 10:23:01 | 只看該作者
太強(qiáng)了

本版積分規(guī)則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權(quán)所有   京ICP備16069177號(hào) | 京公網(wǎng)安備11010502021702
快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲国产精品久久久久 | 婷婷导航 | 一级一级一片免费高清 | 久久久青青 | 亚洲欧美激情综合首页 | 久久精品视频99精品视频150 | 国产vr一区二区在线观看 | 99在线视频免费 | 国产在线乱码在线视频 | 一区欧美 | 久久国产精品视频一区 | 99久久综合精品免费 | 日韩精品视频美在线精品视频 | 国产精品免费大片一区二区 | 成年美女黄网站色视频大全免费 | 91久久亚洲国产成人精品性色 | 黄色一级片黄色一级片 | 黄色免费的网站 | 榴莲草莓向日葵黄瓜丝瓜污 | 成人精品免费网站 | 婷婷尹人香蕉久久天堂 | 在线精品欧美日韩 | 女人18毛片特级一级免费视频 | 久久成人精品视频 | 日韩欧美中文字幕一区二区三区 | 杰罗德游戏在线观看完整版免费 | 韩国美女豪爽一级毛片 | 三级在线网站 | 丁香婷婷色 | 亚洲免费在线视频观看 | 人心蜈蚣2在线观看 | 热久久最新 | 国产在线一区二区三区 | 韩国一级在线观看 | 欧美另类hd | 又黄又www| 日韩精品免费一线在线观看 | 日本免费黄色网址 | 四虎国产精品永久免费网址 | 男人的天堂va | 国产高清在线观看视频手机版 |