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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機定時器設置入門 (STC89C52RC)

          51單片機定時器設置入門 (STC89C52RC)

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
          51單片機定時器設置入門(STC89C52RC)

          STC單片機定時器設置

          STC單片機定時器的使用可以說非常簡單,只要掌握原理,有一點的C語言基礎就行了。要點有以下幾個:

          1. 一定要知道英文縮寫的原形,這樣寄存器的名字就不用記了。

          本文引用地址:http://www.ex-cimer.com/article/201611/318396.htm

          理解是最好的記憶方法。好的教材一定會給出所有英文縮寫的原形。

          2.盡量用形像的方法記憶

          比如TCON和TMOD兩個寄存器各位上的功能,教程一般有個圖表,你就在學習中不斷回憶那個圖表的形像


          TMOD:定時器/計數(shù)器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
            
          定時器/計數(shù)器模式控制寄存器TMOD是一個逐位定義的8位寄存器,但只能使用字節(jié)尋址,其字節(jié)地址為89H。
          其格式為:

          其中低四位定義定時器/計數(shù)器C/T0,高四位定義定時器/計數(shù)器C/T1,各位的說明:

          GATE——門控制。
          GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
          當INT0引腳為高電平時TR0置位,啟動定時器T0;
          當INT1引腳為高電平時TR1置位,啟動定時器T1。
          GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。

          C/T——功能選擇位
          C/T=0時為定時功能,C/T=1時為計數(shù)功能。
          置位時選擇計數(shù)功能,清零時選擇定時功能。

          M0、M1——方式選擇功能
          由于有2位,因此有4種工作方式:
          M1M0 工作方式 計數(shù)器模式 TMOD(設置定時器模式)
          0 0 方式0 13位計數(shù)器TMOD=0x00
          0 1 方式1 16位計數(shù)器TMOD=0x01
          1 0 方式2 自動重裝8位計數(shù)器 TMOD=0x02
          1 1 方式3 T0分為2個8位獨立計數(shù)器,T1為無中斷重裝8位計數(shù)器 TMOD=0x03
          單片機定時器0設置為工作方式1為TMOD=0x01

          這里我們一定要知道,TMOD的T是TIMER/COUNTER的意思,MOD是MODE的意思。至于每位上的功能,你只要記住圖表,并知道每個英文縮寫的原型就可以了。
          在程序中用到TMOD時,先立即回憶圖表,并根據(jù)縮寫的單詞原形理出每位的意義,如果意義不是很清楚,就查下手冊,幾次下來,TMOD的圖表就已經(jīng)在腦子里了。

          8位 GATE位,本身是門的意思。
          7位 C/TCounter/Timer
          6位 M1Mode 1
          5位 M0Mode 0


          TCON: 定時器/計數(shù)器控制寄存器(TIMER/COUNTER CONTROL REGISTER)

          TMOD分成2段,TCON控制更加精細,分成四段,在本文中只要用到高四段。

          TF0(TF1)——計數(shù)溢出標志位,當計數(shù)器計數(shù)溢出時,該位置1。
          TR0(TR1)——定時器運行控制位
          當TR0(TR1)=0 停止定時器/計數(shù)器工作
          當TR0(TR1)=1 啟動定時器/計數(shù)器工作
          IE0(IE1)——外中斷請求標志位

          當CPU采樣到P3.2(P3.3)出現(xiàn)有效中斷請求時,此位由硬件置1。在中斷響應完成后轉(zhuǎn)向中斷服務時,再由硬件自動清0。

          IT0(IT1)——外中斷請求信號方式控制位
          當IT0(IT1)=1 脈沖方式(后沿負跳有效)
          當IT0(IT1)=0 電平方式(低電平有效)此位由軟件置1或清0。
          TF0(TF1)——計數(shù)溢出標志位

          當計數(shù)器產(chǎn)生計數(shù)溢出時,此位由硬件置1。當轉(zhuǎn)向中斷服務時,再有硬件自動清0。計數(shù)溢出的標志位的使用有兩種情況:采用中斷方式時,作中斷請求標志位來使用;采用查詢方式時,作查詢狀態(tài)位來使用。

          注意記憶方法,理解單詞原形,就絕對不會把TF和TR搞混。TF的F也就是溢出OverFlow的F。國外有個著名的IT知識問答社區(qū),網(wǎng)址就http://stackoverflow.com/
          TR的R就是運行Run。默認是0不運行,當然要置1才運行。


          STC單片機STC89C52RC定時器延時時間的計算

          延時時間要根據(jù)晶振頻率計算,不同板子可能有所不同。

          時鐘周期:
          1/時鐘源,在我現(xiàn)在這塊板子上,晶振頻率是11.0592M,也就是時鐘周期是1/11059200秒

          機器周期:
          一般51單片機是12個時鐘周期,我的板子也就是 12/11059200秒

          單次定時最長時間:
          如果是16位的計數(shù)器,16位最大值是65535,共可計數(shù)65536次?;镜某?shù)一定要記住,還要記住8位最大值是255,共可計數(shù)256次,還要記住8位上每位代表的數(shù)值。
          12 * 65536/11059200 = 0.0711 s,也就是,71 ms內(nèi)的定時可以單次定時就完成。如果定時時間超過71 ms,就要循環(huán)了。

          一次定時需要幾次機器周期:
          計算公式:定時秒數(shù)/機器周期
          比如我要定時1秒, 1/(12/11059200)= 921600次,16位計數(shù)器最大可計數(shù)65536次,921600次早就益出了。我們可以每次定時10 ms,循環(huán)100次就可以定時1秒了,1 s縮小100百倍就是10 ms, 也就是每次需要計數(shù)9216次。

          確實計數(shù)器初始值:
          定時10 ms時,如果計數(shù)器從0開始計數(shù),我們就不知道什么時候到了9216次。所以應該計數(shù)了9216次,16位計數(shù)器最多計數(shù)95536次,然后就溢出,一溢出TCON的TF位就會置1,我們只要經(jīng)常檢測TF位就可以知道什么時候完成10ms的定時了。
          計算公式:計數(shù)器初始值=最大計數(shù)次數(shù) - 需要計數(shù)次數(shù)
          如果定時10 ms,計數(shù)器的初始值就是65536 - 9216

          計算計數(shù)器的高位和低位:
          16位的計數(shù)器,也就是兩個8位組成,8位的最大計數(shù)次數(shù)是256。所以:
          計數(shù)器高位 = 初始值/256
          計數(shù)器低位 = 初始值%256



          評論


          技術專區(qū)

          關閉
          看屁屁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); })();