久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3642|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

分時(shí)復(fù)用程序范本51單片機(jī)程序框架

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:459510 發(fā)表于 2019-12-24 22:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      由于經(jīng)常涉及到單片機(jī)開發(fā),所以需要一個(gè)能夠跑多任務(wù)的程序框架,用操作系統(tǒng)有點(diǎn)兒浪費(fèi)資源,用普通線程方式又不能執(zhí)行多任務(wù),所以采取分時(shí)復(fù)用的方式,來(lái)跑多任務(wù)。
      寫一個(gè)范本為以后開發(fā)服務(wù)。

單片機(jī)源程序如下:
  1. #include "common.h"
  2. /**************************************************************************************
  3. * Variable definition                           
  4. **************************************************************************************/
  5. static TASK_COMPONENTS TaskComps[] =
  6. {
  7.     {0, 60, 60, TaskDisplay},            // 顯示時(shí)鐘
  8.     {0, 20, 20, TaskKeySan},               // 按鍵掃描
  9.     {0, 500, 500, TaskDispStatus},            // 顯示工作狀態(tài)
  10.                 {0, 0, 0, TaskKeyProcess},               // 按鍵處理任務(wù)
  11.      // 這里添加你的任務(wù)。。。。
  12. };

  13. void main(void)
  14. {
  15.         WDT_Config();                        //初始化看門狗
  16.         TaskInit();                                //任務(wù)端口資源初始化
  17.         Timer0Init();                        //系統(tǒng)時(shí)間片管理器初始化

  18.         while(1)
  19.         {
  20.                 WDT_CLR();                        //喂狗
  21.                 TaskProcess();        //任務(wù)處理函數(shù)
  22.                 if(keyup_data!=0)        //有按鍵按下需要進(jìn)行處理
  23.                         TaskComps[3].Run = 1;
  24.         }
  25. }

  26. void Timer0Init(void)                //1毫秒@24.000MHz
  27. {
  28.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  29.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  30.         TL0 = 0x30;                //設(shè)置定時(shí)初值
  31.         TH0 = 0xF8;                //設(shè)置定時(shí)初值
  32.         TF0 = 0;                //清除TF0標(biāo)志
  33.         TR0 = 1;                //定時(shí)器0開始計(jì)時(shí)
  34.         ET0 = 1;                //開啟定時(shí)器0中斷
  35.         EA = 1;
  36. }


  37. /**************************************************************************************
  38. * FunctionName : TimerInterrupt()
  39. * Description : 定時(shí)中斷服務(wù)函數(shù)
  40. * EntryParameter : None
  41. * ReturnValue : None
  42. **************************************************************************************/
  43. void Timer0_Interrupt() interrupt 1
  44. {
  45.         uint8 i;
  46.         for (i=0; i<TASK_NUM; i++)          // 逐個(gè)任務(wù)時(shí)間處理
  47.         {
  48.                 if (TaskComps[i].Timer)          // 時(shí)間不為0
  49.                 {
  50.                         TaskComps[i].Timer--;         // 減去一個(gè)節(jié)拍
  51.                         if (TaskComps[i].Timer == 0)       // 時(shí)間減完了
  52.                         {
  53.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復(fù)計(jì)時(shí)器值,從新下一次
  54.                                 TaskComps[i].Run = 1;           // 任務(wù)可以運(yùn)行
  55.                         }
  56.                 }
  57.         }
  58. }
  59. /**************************************************************************************
  60. * FunctionName   : WDT_Config()
  61. * Description    : 看門狗配置
  62. * EntryParameter : None
  63. * ReturnValue    : None
  64. **************************************************************************************/
  65. void WDT_Config(void)
  66. {
  67.         WDT_CONTR = 0x04;       //看門狗定時(shí)器溢出時(shí)間計(jì)算公式: (12 * 32768 * PS) / FOSC (秒)
  68.                           //設(shè)置看門狗定時(shí)器分頻數(shù)為32,溢出時(shí)間如下:
  69.                           //11.0592M : 1.14s
  70.                           //18.432M  : 0.68s
  71.                           //20M      : 0.63s
  72.                                                                                                         //24M      : 0.52s
  73.         WDT_CONTR |= 0x20;      //啟動(dòng)看門狗
  74. }
  75. /**************************************************************************************
  76. * FunctionName   : TaskProcess()
  77. * Description    : 任務(wù)處理
  78. * EntryParameter : None
  79. * ReturnValue    : None
  80. **************************************************************************************/
  81. void TaskProcess(void)
  82. {
  83.         uint8 i;
  84.         for (i=0; i<TASK_MAX; i++)           // 逐個(gè)任務(wù)時(shí)間處理
  85.         {
  86.                 if (TaskComps[i].Run)           // 時(shí)間不為0
  87.                 {
  88.                         TaskComps[i].TaskHook();         // 運(yùn)行任務(wù)
  89.                         TaskComps[i].Run = 0;          // 標(biāo)志清0
  90.                 }
  91.         }   
  92. }
復(fù)制代碼
  1. #include "common.h"

  2. //按鍵掃描變量
  3. uint8          keydown_data=0x00;    //按鍵按下后就返回的值
  4. uint8          keyup_data=0x00;      //按鍵抬起返回值
  5. uint16  key_time=0x00;       //按鍵按下之后的時(shí)間計(jì)數(shù),該值乘以掃描一次按鍵函數(shù)的時(shí)間就等于按鍵按下的時(shí)間
  6. uint8         key_tem=0x00;         //長(zhǎng)按的按鍵值與按鍵掃描程序過(guò)渡變量
  7. uint8          key_bak=0x00;         //按鍵掃描程序過(guò)渡變量

  8. /**************************************************************************************
  9. * FunctionName   : TaskInit()
  10. * Description    : 任務(wù)配置
  11. * EntryParameter : None
  12. * ReturnValue    : None
  13. **************************************************************************************/
  14. void TaskInit(void)
  15. {
  16.         TaskDispStatusInit();
  17.         TaskKeySanInit();
  18. }
  19. /**************************************************************************************
  20. * FunctionName   : TaskDisplay()
  21. * Description    : 顯示任務(wù)
  22. * EntryParameter : None
  23. * ReturnValue    : None
  24. **************************************************************************************/
  25. void TaskDisplay(void)
  26. {

  27. }
  28. /**************************************************************************************
  29. * FunctionName   : TaskKeySanInit()
  30. * Description    : 掃描任務(wù)初始化
  31. * EntryParameter : None
  32. * ReturnValue    : None
  33. **************************************************************************************/
  34. void TaskKeySanInit(void)
  35. {
  36.         P0M0 = 0;
  37.         P0M1 = 0;
  38.        
  39.         P0 |= 0x0f;
  40. }
  41. /**************************************************************************************
  42. * FunctionName   : TaskKeySan()
  43. * Description    : 掃描任務(wù)
  44. * EntryParameter : None
  45. * ReturnValue    : None
  46. **************************************************************************************/
  47. void TaskKeySan(void)
  48. {
  49.         uint8        mode=0;
  50.         keyup_data=0;         //鍵抬起后按鍵值一次有效
  51.         //----------------------------------------------------------------------------------
  52.         if(KEY2==0||KEY3==0)   //有鍵正按下
  53.         {
  54.                 if(KEY2==0) key_tem=1;
  55.                 else if(KEY3==0) key_tem=2;
  56.                
  57.                 if (key_tem == key_bak)      //有鍵按下后第一次掃描不處理,與else配合第二次掃描有效,這樣實(shí)現(xiàn)了去抖動(dòng)
  58.                 {
  59.                         key_time++;             //有鍵按下后執(zhí)行一次掃描函數(shù),該變量加1
  60.                         keydown_data=key_tem;   //按鍵值賦予keydown_data
  61.                                        
  62.                         if( (mode==0)&&(key_time>1) )//key_time>1按鍵值無(wú)效,這就是單按,如果mode為1就為連按
  63.                                 keydown_data=0;
  64.     }
  65.           else                             //去抖動(dòng)      
  66.           {
  67.                   key_time=0;
  68.                   key_bak=key_tem;
  69.           }
  70.         }
  71.         else       //鍵抬起
  72.         {
  73.           if(key_time>2)            //按鍵抬起后返回一次按鍵值
  74.           {
  75.                   keyup_data=key_tem;  //鍵抬起后按鍵值賦予keydown_data   
  76.           }
  77.                 key_bak=0;               //要清零,不然下次執(zhí)行掃描程序時(shí)按鍵的值跟上次按的值一樣,就沒(méi)有去抖動(dòng)處理了
  78.           key_time=0;
  79.                 keydown_data=0;               
  80.         }
  81.         //-----------------------------------------------------------------------------------
  82.         if(KEY0 == 0);
  83.         if(KEY1 == 0);
  84. }
  85. /**************************************************************************************
  86. * FunctionName   : TaskKeyProcess()
  87. * Description    : 掃描任務(wù)
  88. * EntryParameter : None
  89. * ReturnValue    : None
  90. **************************************************************************************/
  91. void TaskKeyProcess(void)
  92. {
  93.         switch(keyup_data)
  94.         {
  95.                 case 1:break;
  96.                 case 2:break;
  97.         }
  98. }
  99. /**************************************************************************************
  100. * FunctionName   : TaskDispStatusInit()
  101. * Description    : 工作狀態(tài)顯示初始化
  102. * EntryParameter : None
  103. * ReturnValue    : None
  104. **************************************************************************************/
  105. void TaskDispStatusInit(void)
  106. {
  107.         P5M0 |= 0x20;
  108.         P5M1 = 0;
  109.        
  110.         DispStatusLed = 1;
  111. }
  112. /**************************************************************************************
  113. * FunctionName   : TaskDispStatus()
  114. * Description    : 工作狀態(tài)顯示
  115. * EntryParameter : None
  116. * ReturnValue    : None
  117. **************************************************************************************/
  118. void TaskDispStatus(void)
  119. {
  120.         DispStatusLed = ~DispStatusLed;
  121. }
  122. // 這里添加其他任務(wù)。。。。。。。。。
復(fù)制代碼


所有資料51hei提供下載:
42 程序框架.rar (168.62 KB, 下載次數(shù): 72)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线播放第一页 | 中文字幕在线第一页 | 日本在线看片 | 国产精品一区二区精品 | 久久91av | 九九热在线观看视频 | 久久之精品 | 国产免费av网 | 日韩精品一区二区三区中文字幕 | 亚洲精品aⅴ| 久久久久久色 | 成人午夜激情 | 福利精品| 综合激情av| 四虎影视免费在线 | 久久三级av | 国产激情一区二区三区 | 精品欧美一区二区三区精品久久 | 欧美成人二区 | 精品欧美乱码久久久久久1区2区 | 国产激情一区二区三区 | 欧美日韩激情 | 日韩av在线一区二区 | 国产激情网 | 欧美福利 | 黄色精品 | 99视频精品| 性高朝久久久久久久3小时 av一区二区三区四区 | 日本亚洲精品成人欧美一区 | 97人澡人人添人人爽欧美 | 欧美一级欧美三级在线观看 | 天天躁人人躁人人躁狂躁 | 日韩成人影院在线观看 | 亚洲 精品 综合 精品 自拍 | 久久国产精品99久久久久久丝袜 | 日韩中文字幕第一页 | 国产精品区二区三区日本 | 国产精品久久在线 | 国产成人免费在线 | 欧美在线视频观看 | 亚洲视频在线播放 |