新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 程序的多任務和資源復用舉例

        程序的多任務和資源復用舉例

        作者: 時間:2012-07-04 來源:網絡 收藏

        程序的舉例

        有一臺機電設備,有兩個按鍵,控制設備的兩個不同部分。
        現要求:
         每個按鍵按下,相應控制程序運行。但兩個按鍵可以同時按下,就是說兩個控制程序可能
        需要同時運行。使用一個89C52,如何編寫程序?

        注:此程序不使用RTOS等操作系統(tǒng)。


        /*程序說明:
         一)產生波形可以使用中斷中計數來產生精確的波形。
           本答案中為更能體現程序的問題,采用主程序循環(huán)產生。
         二)請?zhí)貏e注意,題意是兩個程序在并發(fā)運行,實際按本答案可以擴展到N個不同任務同時運行,在此就不討論。
           (對大程序結構增加了很多其它的概念)
         三)因為在論壇上直接貼出,所以程序放在一個文件中。
           應該按Timer.c, Key.c, Const.h(存放常量定義),Task1, Task2, Answer.c存放
        */
        #include REG52.h>

        /*Timer*/
        bit fTimer0_2ms;  /*T0中斷產生的標志,準備傳遞給主循環(huán)*/
        bit fSYS_2ms;   /*系統(tǒng)T0中斷產生的標志,12M,主循環(huán)使用*/
        bit fSYS_20ms;   /*每20MS產生一次的消息*/

        #define INT2MSCOUNT   10           /*產生2MS所需要的時間次數*/
        unsigned char data mTimer_2msReg=INT2MSCOUNT;  /*產生2MS所需要的寄存器*/
        #define INT20MSCOUNT  10           /*產生20MS所需要的時間次數,在20MS基礎上*/
        unsigned char data mTimer_20msReg=INT20MSCOUNT; /*產生20MS所需要的寄存器,在20MS基礎上*/

        /*KEY*/
        unsigned char data mKey1SwapTask;  /***按鍵任務寄存器***/
        unsigned char data mKey2SwapTask;  /***按鍵任務寄存器***/
        sbit iKey1=P1^0;           /*按鍵的輸入口*/
        sbit iKey2=P1^1;

        bit fKey1;             /*為簡單化,沒使用隊列保存鍵值,使用標志*/
        bit fKey2;             /*為簡單化,沒使用隊列保存鍵值,使用標志*/


        /*Task1*/
        unsigned char data mTask1Id;    /*任務一的任務號*/
        unsigned char data mTask1_1HzReg;  /*1hz時間寄存器*/
        unsigned int data mTask1_2SReg;   /*2S時間寄存器*/
        sbit oTask1=P1^2;          /*輸出方波口*/

        /*Task2*/
        unsigned char data mTask2Id;    /*任務二的任務號*/
        unsigned char data mTask2_1p2HzReg; /*1.2hz時間寄存器*/
        sbit oTask2=P1^3;          /*輸出方波口*/

        /*---------------------------------------------------------------------------*/
        /*產生以1MS為基礎的系統(tǒng)定時信號,T0作為基準定時器*/

        /*************************************************
        定時器T0初始化0.2MS,12M
        *************************************************/
        void Timer0_Init()
        {
         TMOD|=0x2;      /*8位定時器*/

         TL0=TH0=~(200)+1;   /*12M*/

         TR0=1;
         ET0=1;
        }

        /*************************************************
        定時器0的中斷服務,產生fTimer0_2ms
        *************************************************/
        void timer0(void) interrupt 1 /*T0中斷*/
        {
         mTimer_2msReg--;
         if(mTimer_2msReg==0){
          mTimer_2msReg=INT2MSCOUNT; /*產生1MS所需要的寄存器*/
          fTimer0_2ms=1;
         }
        }

        /*************************************************
        控制消息fSYS_2ms
        *************************************************/
        void Timer0_MainLoop()
        {
         fSYS_2ms=0;
         fSYS_20ms=0;

         if(fTimer0_2ms){
          fTimer0_2ms=0;       /*接收中斷過來的時間標志,轉換為消息*/
          fSYS_2ms=1;         /*此消息在一周內有效,被外部程序復用*/
          /*產生20MS的消息*/
          mTimer_20msReg--;
          if(mTimer_20msReg==0){
            mTimer_20msReg=INT20MSCOUNT;  /*產生20MS所需要的寄存器,在20MS基礎上*/
            fSYS_20ms=1;
          }
         }
        }


        上一頁 1 2 3 下一頁

        關鍵詞: 多任務 資源復用

        評論


        相關推薦

        技術專區(qū)

        關閉
        主站蜘蛛池模板: 山东| 涿州市| 临泽县| 信丰县| 北安市| 吴堡县| 灵台县| 钟山县| 麟游县| 阿拉尔市| 抚顺县| 新野县| 云梦县| 乌鲁木齐县| 常宁市| 北碚区| 商河县| 潜山县| 石楼县| 吴桥县| 青海省| 来宾市| 绵阳市| 上犹县| 囊谦县| 忻城县| 高阳县| 城口县| 平陆县| 汤阴县| 崇礼县| 毕节市| 双鸭山市| 三亚市| 永胜县| 青龙| 常山县| 潜江市| 百色市| 阿坝县| 勐海县|