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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)的簡(jiǎn)介——定時(shí)器、計(jì)數(shù)器

          51單片機(jī)的簡(jiǎn)介——定時(shí)器、計(jì)數(shù)器

          作者: 時(shí)間:2016-11-24 來源:網(wǎng)絡(luò) 收藏
          8051有兩個(gè)16位的定時(shí)器/計(jì)數(shù)器T0、T1,8052還有第三個(gè)定時(shí)器/計(jì)數(shù)器T2,通過內(nèi)部編程都可以設(shè)定為內(nèi)部定時(shí)器和外部計(jì)數(shù)器。
          1、方式寄存器TMOD
          特殊功能寄存器TMOD是TO、T1的工作方式寄存器,其格式如下:
          TMOD低四位為T0方式字段,高四位為T1方式字段。復(fù)位時(shí)TMOD的所有位置0。
          (1)工作方式選擇位M1、M0
          定時(shí)器/計(jì)數(shù)器有四種工作方式,它們由M1、M0的取值決定,對(duì)應(yīng)關(guān)系如下圖:
          (2) 方式選擇位C/T
          C/T=0為定時(shí)器方式,以fosc(晶振頻率)的12分頻作為計(jì)數(shù)信號(hào),即每個(gè)機(jī)器周期定時(shí)器加1。
          C/T=1為計(jì)數(shù)器方式,以外部引腳(T0為P3.4,T1為P3.5)上輸入的脈沖為輸入信號(hào),當(dāng)外部信號(hào)發(fā)生負(fù)跳變時(shí)加1,外部事件計(jì)數(shù)的最高頻率為fosc的1/24。
          (3) 門控位GATE
          當(dāng)GATE=1時(shí),由外部中斷引腳INT0、INT1和內(nèi)部TR0、TR1位來啟動(dòng)定時(shí)器。當(dāng)INT0為高電平且TR0置位時(shí),啟動(dòng)定時(shí)器T0。定時(shí)器T1的啟動(dòng)同T0。
          當(dāng)GATE=0時(shí),僅由TR0和TR1置位來啟動(dòng)定時(shí)器T0和T1。
          2、控制寄存器TCON
          特殊功能寄存器TCON的高4位存放著定時(shí)器的運(yùn)行控制和溢出標(biāo)志,低4位存放外部中斷的觸發(fā)方式控制位和鎖存外部中斷請(qǐng)求源。TCON的格式如下:
          (1)定時(shí)器T0的運(yùn)行控制位TR0
          TR0由軟件置位或者清0。當(dāng)門控位GATE=0時(shí),TO計(jì)數(shù)器僅由TR0控制,TR0=1啟動(dòng)計(jì)數(shù),TR0=0時(shí)停止。當(dāng)門控位GATE=1時(shí),T0計(jì)數(shù)器由INT0和TR0共同控制,當(dāng)INT0=1且TR0=1時(shí)啟動(dòng)T0計(jì)數(shù)器。
          (2)定時(shí)器T0溢出標(biāo)志位TF0
          當(dāng)T0溢出時(shí)TF0=1,并向CPU申請(qǐng)中斷,CPU響應(yīng)中斷后由硬件將TF0清0,也可以由軟件查詢方式將TF0清0。
          (3)定時(shí)器T1的運(yùn)行控制位TR1
          功能同TR0。
          (4)定時(shí)器T1溢出標(biāo)志為TF1
          功能同TF1。
          (5)外部中斷源1(INT1、P3.3)中斷請(qǐng)求標(biāo)志IE1
          IE1=1時(shí)外部中斷源1正在向CPU請(qǐng)求中斷,當(dāng)CPU響應(yīng)該中斷時(shí)由硬件將IE1清0(下降沿觸發(fā)方式)。
          (6)外部中斷源1觸發(fā)方式選擇位IT1
          IT1=0時(shí)外部中斷源1選擇電平觸發(fā)方式,當(dāng)輸入低電平時(shí)置位IE1;IT1=1時(shí)外部中斷源1選擇下降沿觸發(fā)方式,當(dāng)中斷源由高電平變低電平時(shí)置位IE1,向CPU請(qǐng)求中斷。
          (7)外部中斷源0(INT0、P3.2)中斷請(qǐng)求標(biāo)志IE0
          功能類同IE1。
          (8)外部中斷源0觸發(fā)方式選擇位IT0
          功能類同IT1。
          3、定時(shí)器工作方式
          如上所述,定時(shí)器有4種工作方式,它們由TMOD寄存器中的M1、M0兩位決定。注意:只有T0才有工作方式3。
          (1)工作方式0
          當(dāng)TMOD寄存器中的M1、M0為00時(shí),定時(shí)器工作在方式0。下圖以定時(shí)器T1來示例說明:
          計(jì)數(shù)時(shí),TL1的低5位溢出后向TH1進(jìn)位,TH1溢出后將TF1置位,并向CPU發(fā)出中斷請(qǐng)求。注意:在方式0時(shí),TL1只用到了低5位,高3位內(nèi)容不定不能使用,控制邏輯計(jì)數(shù)的允許/禁止并不改變計(jì)數(shù)值。
          (2)工作方式1
          當(dāng)TMOD寄存器中M1、M0的值為01時(shí),定時(shí)器工作于方式1。工作方式1和工作方式0的唯一區(qū)別在于,工作方式1可以實(shí)現(xiàn)16位計(jì)數(shù),其它都和工作方式0相同。如果以定時(shí)器T1為例來圖示講解,可如下:
          (3)工作方式2
          當(dāng)TMOD寄存器的M1、M0位值為10時(shí),定時(shí)器工作于工作方式2。方式2為自動(dòng)恢復(fù)初值的8位計(jì)數(shù)器,TL1作為8位計(jì)數(shù)寄存器,TH1作為8位計(jì)數(shù)常數(shù)寄存器,當(dāng)TL1溢出時(shí),一方面將TF1置位,并向CPU發(fā)出中斷請(qǐng)求,另一方面將預(yù)設(shè)在TH1中的常數(shù)重新裝入TL1,繼續(xù)計(jì)數(shù)。重新裝入不會(huì)影響TH1的內(nèi)容。其結(jié)構(gòu)簡(jiǎn)圖如下:

          在方式2中通過改變TH1的值可以改變計(jì)數(shù)次數(shù)。
          (4)工作方式3
          方式3只適用于T0,此時(shí)T1停止計(jì)數(shù)。
          4、定時(shí)器/計(jì)數(shù)器溢出率的計(jì)算
          定時(shí)器/計(jì)數(shù)器在工作之前必須先設(shè)定計(jì)數(shù)初始值Ta。初值計(jì)數(shù)公式如下:
          在給定時(shí)間t后,求初值的公式如下:
          5、總結(jié)
          對(duì)定時(shí)器/計(jì)數(shù)器編程的步驟如下:
          a、寫TMOD,設(shè)定工作方式、定時(shí)/計(jì)數(shù)方式、啟動(dòng)哪個(gè)定時(shí)器(開啟相應(yīng)的門控位GATE);
          b、將初值寫入對(duì)于寄存器;
          c、定時(shí)器中斷開或關(guān);
          d、啟動(dòng)定時(shí)器,即向TCON寫入數(shù)據(jù)。


          評(píng)論


          相關(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); })();