<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 利用單片機定時中斷實現(xiàn)軟定時器

          利用單片機定時中斷實現(xiàn)軟定時器

          作者: 時間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
          以下是代碼實現(xiàn)已經(jīng)測試并用到項目上課放心使用
          Author : 吾本杞人
          #include "reg52.h"
          #include "Intrins.h"
          #include "TypeDef.h"
          #include "CPUPin_Def.h"
          #include "VarDef.h"
          #define TIME_BASE_2MS 2
          #define TIME_BASE_500MS 250
          #define TIME_BASE_10MS 5
          #define F_OSC 110592 //定義這個是默認(rèn)按照11.0592MHZ的晶振算的TH0 TL0的值 方式1 16位定時器
          //注意這種寫法只能晶振翻倍的時候改這個宏才有用,
          //因為51單片機硬件不支持浮點運算 12/11.0592 = 1 向下取整了 跟11.0592的晶振值是一樣的
          // 如果支持浮點運算會有芯片內(nèi)部專門的的硬件浮點運算指令 這種寫法也不行 必須強轉(zhuǎn)類型
          //如 ( double)12/(double)11.0592 要把類型強轉(zhuǎn)成浮點數(shù)才行。
          //目前有 硬件支持浮點 有軟件浮點 就是說軟件也可以實現(xiàn)浮點數(shù)運算。比如編譯器看到特殊的代碼會把轉(zhuǎn)到
          //一個特殊的函數(shù)去處理。 51 STM32 單片機目前好像都不支持硬件浮點數(shù)
          void Timer0() interrupt 1 using 1
          {
          //采用靜態(tài)變量這里只會執(zhí)行一次,不管多少次中斷因為是靜態(tài)變量
          //但不能寫成
          //如果實際換成了是12MHZ晶振 就改成 F_OSC / 120000 因為TH0 TL0 是按照11.0592算的值
          static uchar TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);
          //如果11.0592的晶振 就1 如果是12.00MHZ 那這個值算出來說就是1.085xxxx 晶振跑的快了這個值要大點
          //就是直接改F_OSC 這個宏就行了。不用改其他的
          static uchar idata TimeBase500ms = TIME_BASE_500MS * (F_OSC / 110592);
          static uchar TimeBase10ms = TIME_BASE_10MS *(F_OSC / 110592);
          static unsigned char CountSignalDelay = 0;
          //以上只會執(zhí)行一次 static 定義聲明初始化
          uchar i;
          TH0=0xfc ; // 總定時1000微秒, 進入中斷需要12個周期, 所以實際定時1000 - 12 * 12 / F
          TL0=0x72 ;
          //這里 用工具算出來應(yīng)該是FC 66 FC72-FC66 = 12
          //讓裝載的數(shù)字少用12個周期 進入中斷因為進入中斷需要12周期加上去正好1ms
          _push_( SCONF ) ;
          if( --TimeBase2ms == 0 ){
          TimeBase2ms = TIME_BASE_2MS * (F_OSC / 110592);
          //0--3 是2毫秒為時基的定時器
          for( i = 0; i < 4; i++ )
          {
          if( TimerNo[ i ] != 0 ){
          if( --( TimerNo[ i ] ) == 0 ){//時間到
          fTimer |= 0x01 << i; //置為時間到
          }
          }
          }
          if( --TimeBase10ms == 0 )
          {
          TimeBase10ms = TIME_BASE_10MS * ( F_OSC / 110592 );
          ScanCopierSignal() ;//10毫秒掉一次函數(shù)
          }
          if( --TimeBase500ms == 0 )
          {
          TimeBase500ms = TIME_BASE_500MS * ( F_OSC / 110592 );
          //處理以500ms為時基的定時器
          for( i = 4; i < 8; i++ )
          {
          if( TimerNo[ i ] != 0 ){
          if( -- ( TimerNo[ i ] ) == 0 ) {
          fTimer |= 0x01 << i;
          }
          }
          _pop_(SCONF);
          }


          關(guān)鍵詞: 單片機定時中斷軟定時

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();