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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3537|回復: 0
打印 上一主題 下一主題
收起左側

分時復用程序范本51單片機程序框架

[復制鏈接]
跳轉到指定樓層
樓主
ID:459510 發表于 2019-12-24 22:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      由于經常涉及到單片機開發,所以需要一個能夠跑多任務的程序框架,用操作系統有點兒浪費資源,用普通線程方式又不能執行多任務,所以采取分時復用的方式,來跑多任務。
      寫一個范本為以后開發服務。

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

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

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

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


  37. /**************************************************************************************
  38. * FunctionName : TimerInterrupt()
  39. * Description : 定時中斷服務函數
  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++)          // 逐個任務時間處理
  47.         {
  48.                 if (TaskComps[i].Timer)          // 時間不為0
  49.                 {
  50.                         TaskComps[i].Timer--;         // 減去一個節拍
  51.                         if (TaskComps[i].Timer == 0)       // 時間減完了
  52.                         {
  53.                                 TaskComps[i].Timer = TaskComps[i].ItvTime;       // 恢復計時器值,從新下一次
  54.                                 TaskComps[i].Run = 1;           // 任務可以運行
  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;       //看門狗定時器溢出時間計算公式: (12 * 32768 * PS) / FOSC (秒)
  68.                           //設置看門狗定時器分頻數為32,溢出時間如下:
  69.                           //11.0592M : 1.14s
  70.                           //18.432M  : 0.68s
  71.                           //20M      : 0.63s
  72.                                                                                                         //24M      : 0.52s
  73.         WDT_CONTR |= 0x20;      //啟動看門狗
  74. }
  75. /**************************************************************************************
  76. * FunctionName   : TaskProcess()
  77. * Description    : 任務處理
  78. * EntryParameter : None
  79. * ReturnValue    : None
  80. **************************************************************************************/
  81. void TaskProcess(void)
  82. {
  83.         uint8 i;
  84.         for (i=0; i<TASK_MAX; i++)           // 逐個任務時間處理
  85.         {
  86.                 if (TaskComps[i].Run)           // 時間不為0
  87.                 {
  88.                         TaskComps[i].TaskHook();         // 運行任務
  89.                         TaskComps[i].Run = 0;          // 標志清0
  90.                 }
  91.         }   
  92. }
復制代碼
  1. #include "common.h"

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

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

  27. }
  28. /**************************************************************************************
  29. * FunctionName   : TaskKeySanInit()
  30. * Description    : 掃描任務初始化
  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    : 掃描任務
  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配合第二次掃描有效,這樣實現了去抖動
  58.                 {
  59.                         key_time++;             //有鍵按下后執行一次掃描函數,該變量加1
  60.                         keydown_data=key_tem;   //按鍵值賦予keydown_data
  61.                                        
  62.                         if( (mode==0)&&(key_time>1) )//key_time>1按鍵值無效,這就是單按,如果mode為1就為連按
  63.                                 keydown_data=0;
  64.     }
  65.           else                             //去抖動      
  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;               //要清零,不然下次執行掃描程序時按鍵的值跟上次按的值一樣,就沒有去抖動處理了
  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    : 掃描任務
  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    : 工作狀態顯示初始化
  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    : 工作狀態顯示
  115. * EntryParameter : None
  116. * ReturnValue    : None
  117. **************************************************************************************/
  118. void TaskDispStatus(void)
  119. {
  120.         DispStatusLed = ~DispStatusLed;
  121. }
  122. // 這里添加其他任務。。。。。。。。。
復制代碼


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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av一区 | 337p日本欧洲亚洲大胆 | 成人h动漫精品一区二区器材 | 久久不卡 | 日韩欧美大片在线观看 | 91毛片网 | 成人av片在线观看 | 精品二区 | 色本道 | 精品国产乱码久久久 | 精品一区视频 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 97超碰成人| 国产一级淫片a直接免费看 免费a网站 | 国产一区二区三区在线 | 久久香焦| 欧美情趣视频 | 国产精品免费在线 | 嫩草黄色影院 | 嫩呦国产一区二区三区av | 亚洲啪啪 | 欧美一区二区另类 | 国产成人免费网站 | 国产精品区二区三区日本 | 久久久久久久一区 | 国产99热| 成人不卡一区二区 | 久久久久精 | 国产视频三区 | 麻豆精品久久 | 国产免费一区二区三区免费视频 | 天天操网| www.中文字幕 | 日日噜噜噜夜夜爽爽狠狠视频97 | 日本黄色影片在线观看 | 完全免费在线视频 | 欧美日韩一区不卡 | 久久久久久久久久影视 | 久久777| 亚洲经典一区 | 国产综合久久 |