日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【单片机】C51中的定时/计数器介绍

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【单片机】C51中的定时/计数器介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

C51定時器和計數(shù)器

開發(fā)板:普中51-單核-A2;
仿真軟件:proteus;
開發(fā)環(huán)境:Keil4;
參考資料:開發(fā)板所附視頻;
如有錯誤,感謝指正。如有侵權請聯(lián)系博主。


定時器原理

與CPU時序有關的知識

  • 振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩周期);
  • 狀態(tài)周期:2個振蕩周期為1個狀態(tài)周期,用S表示。振蕩周期又稱為S周期或時鐘周期;
  • 機器周期:1個機器周期含有6個狀態(tài)周期等于12個震蕩周期;
  • 指令周期:完成1條指令所占用的全部時間,它以機器周期為單位;

T機器周期=6?T狀態(tài)周期=12?T振蕩周期T_{機器周期} = 6*T_{狀態(tài)周期} = 12*T_{振蕩周期}T?=6?T態(tài)?=12?T?

若振蕩周期為12MHz,那么T振蕩周期=1/12usT_{振蕩周期} = 1/12usT?=1/12usT機器周期=12?T振蕩周期=1usT_{機器周期} = 12*T_{振蕩周期}=1usT?=12?T?=1us。指令周期通常是14us1~4us1?4us.

  • 51單片機有兩組定時器/計數(shù)器。既可以定時,又可以計數(shù)。
  • 定時器/計數(shù)器和單片機的CPU是相互獨立的,定時器/計數(shù)器工作的過程是自動完成的,不需要CPU參與。
  • 51單片機中的定時器/計數(shù)器是根據(jù)機器內(nèi)部的始終或者外部的脈沖信號對寄存器中的數(shù)據(jù)加1.
  • 有了定時器/計數(shù)器之后,可以增加單片機的效率,一些簡單重復加1的工作可以交給定時器/計數(shù)器處理。CPU去處理一些復雜的事情,同時可以實現(xiàn)精確的定時作用。

定時器/計數(shù)器的工作原理

定時器/計數(shù)器實質是一個加1計數(shù)器。隨著計數(shù)器的輸入脈沖進行自加1,即每來一個脈沖,計數(shù)器就自動加1,當計數(shù)器全部為1時,再輸入一個脈沖就是計數(shù)器回零。且計數(shù)器的溢出使響應的中斷標志位置1,向CPU發(fā)出中斷請求(定時器/計數(shù)器中斷允許時)。

如果定時器/計數(shù)器工作于定時模式,則表示定時時間已到;如果工作于計數(shù)模式,則表示計數(shù)值已滿。

由溢出時計數(shù)器的值減去計數(shù)初值是加1計數(shù)器的計數(shù)值。

51單片機定時器結構

定時器/計數(shù)器的實質是加1計數(shù)器(16位),由高8位和低8位兩個寄存器THx和TLx組成。

  • TMOD是定時器/計數(shù)器的工作方式寄存器,用以確定工作方式和功能;
  • TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志。

TMOD工作方式寄存器

TMOD低四位用于T0,高四位用于T1。

位76543210
字節(jié)地址:89H89H89HGATEGATEGATEC/T ̄C/\overline{T}C/TM1M1M1M0M0M0GATEGATEGATEC/T ̄C/\overline{T}C/TM1M1M1M0M0M0TMODTMODTMOD
  • GATEGATEGATE:門控位,用于控制定時器的啟動是否受外部中斷源信號的影響
    • GATE=0GATE=0GATE=0時,只要軟件使TCON種的TR0或TR1為1,就可以啟動定時器/計數(shù)器;
    • GATE=1GATE=1GATE=1時,要用軟件TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時器/計數(shù)器工作,即此時定時器的啟動工作加上了INT0/INT1引腳為高電平這一條件。
  • C/T ̄C/\overline{T}C/T:定時/計數(shù)器模式選擇位
  • C/T ̄=0C/\overline{T}=0C/T=0,為定時模式;
  • C/T ̄=1C/\overline{T}=1C/T=1,為計數(shù)模式;
  • M1M0M1M0M1M0,工作方式設置位,有4種工作方式,經(jīng)常使用方式1和方式2
M1M0M1M0M1M0工作方式說明
00方式013位定時/計數(shù)器
01方式116位定時/計數(shù)器
10方式28位自動重裝定時/計數(shù)器
11方式3T0分成兩個獨立的8位定時/計數(shù)器,T1此方式停止計數(shù)

TCON控制寄存器

TCON低四位控制外部中斷,TCON高4位控制定時/計數(shù)器的啟動和中斷的申請。

位76543210
字節(jié)地址:88H88H88HTF1TR1TF0TR0IE1IT1IE0IT0TCON
  • TF1(TCON.7):T1溢出中斷請求標志位,T1計數(shù)溢出時由硬件自動置為1,CPU響應中斷后TF1由硬件自動清0.T1工作時,CPU可隨時查詢TF1的狀態(tài),可以用TF1作為查詢測試的標志。TF1也可以用軟件置1或清0,同硬件置1或清0效果一樣。
  • TR1(TCON.6):T1運行控制位,軟件置1或清0,軟件可控制定時/計數(shù)器的啟動于停止
    • TR1=1,T1開始工作;
    • TR1=0,T1停止工作;
  • TF0:與TF1類似
  • TR0:與TR1類似

定時/計數(shù)器的工作方式

方式0

方式0為13位計數(shù),由TL的低5位和TH的8位組成。

定時器模式時:N=t/TcyN=t/T_{cy}N=t/Tcy?;定時器的初值可以采用計數(shù)個數(shù)直接取補法獲得;

計數(shù)初值計算公式:X=213?NX=2^{13}-NX=213?N,計數(shù)模式時,技術脈沖是T0引腳上的外部脈沖。

GATE決定是否由外部中斷源信號觸發(fā)。

方式1

方式1為16位計數(shù),由TL的8位和TH的8位組成。

計數(shù)初值計算公式:X=216?NX=2^{16}-NX=216?N。

方式2

方式2為自動重裝初值的8位計數(shù)方式。計數(shù)初值計算公式:X=28?NX=2^{8}-NX=28?N。

適合用于精確的脈沖信號發(fā)生器。

方式3

方式3只適用于定時/計數(shù)器T0,定時器T1處于方式3相當于TR=0,停止計數(shù)。

方式3將T0分為兩個獨立的8位計數(shù)器TL0和TH0。

使用定時器

初始化程序應該完成如下

  • 對TMOD賦值,確定T0和T1的工作方式;
  • 計算初值,并將其寫入TH0、TL0或TH1、TL1。
  • 中斷方式時,需要對總中斷EA置1,開放定時器中斷;
  • 使TR0或TR1置位,啟動定時/計數(shù)器定時或計數(shù)。

計數(shù)器初值計算

定時1ms的初值計算:1ms/1us=10001ms/1us=10001ms/1us=1000,即累計1000個數(shù),初值 = 65535-1000+1(實際上計數(shù)器計數(shù)到65536時才溢出,所以加1)。

1us1us1us是假設晶振頻率是12MHz,那么機器周期就為1us1us1us。

示例

/* 使用定時器0實現(xiàn)LED間隔一秒亮-滅 精確時間 */ #include "reg52.h"typedef unsigned char u8; typedef unsigned int u16;sbit LED=P2^0; // D1// 定時器0初始化 void Timer0Init() {// 1. TMOD賦值,確定T0和T1的工作方式// M1M0=01表示使用方式1,// C/T=0表示使用定時模式,// GATE=0表示僅使用TCON控制TMOD |= 0x01; // 置M0=1// 2. 計算初值,定時1ms, 65535-1000+1TH0 = 0xFC;TL0 = 0x18; // 3. 開啟中斷ET0=1; // 中斷允許位置1EA=1; // 打開總中斷//4. 打開定時功能TR0=1; }void Timer1Init() {// 1. TMOD賦值,確定T0和T1的工作方式// M1M0=01表示使用方式1,// C/T=0表示使用定時模式,// GATE=0表示僅使用TCON控制TMOD |= 0x10; // 置M0=1// 2. 計算初值,定時1ms, 65535-1000+1TH1 = 0xFC;TL1 = 0x18; // 3. 開啟中斷ET1=1; // 中斷允許位置1EA=1; // 打開總中斷//4. 打開定時功能TR1=1; }void main() {Timer1Init();while(1); }// 定時器0中斷函數(shù) void Timer0() interrupt 1 {static u16 i=0;// 重新裝載初值TH0 TL0TH0 = 0xFC;TL0 = 0x18;i++;if(i==1000) // 表示1s了{i=0; // 清零iLED = ~LED;} }// 定時器1中斷函數(shù) void Timer1() interrupt 3 {static u16 i=0;// 重新裝載初值TH1 TL1TH1 = 0xFC;TL1 = 0x18;i++;if(i==1000) // 表示已經(jīng)1s{i=0; // 清零iLED = ~LED;} }

結果顯示:

總結

以上是生活随笔為你收集整理的【单片机】C51中的定时/计数器介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。