做公益做的好的的網站上海外貿網站seo
51單片機-(定時/計數器)
了解CPU時序、特殊功能寄存器和定時/計數器工作原理,以定時器0實現每次間隔一秒亮燈一秒的實驗為例理解定時/計數器的編程實現。
1.CPU時序
1.1.四個周期
- 振蕩周期:為單片機提供定時信號的振蕩源的周期(晶振周期或外加振蕩周期)
- 狀態(tài)周期:2個振蕩周期為1個狀態(tài)周期,用S表示。振蕩周期又稱S周期或時鐘周期。
- 機器周期:1個機器周期含6個狀態(tài)周期,12個振蕩周期。
- 指令周期:完成1條指令所占用的全部時間,它以機器周期為單位。
例如:外接晶振為12MHz時,51單片機相關周期的具體值為:
振蕩周期=1/12us;
狀態(tài)周期=1/6us;
機器周期=1us;
指令周期=1~4us;
1.2.相關概念
- 51單片機有兩組定時器/計數器,因為既可以定時,又可以計數,故稱之為定時器/計數器。
- 定時器/計數器和單片機的CPU是相互獨立的。定時器/計數器工作的過程是自動完成的,不需要CPU的參與。
- 51單片機中的定時器/計數器是根據機器內部的時鐘或者是外部的脈沖信號對寄存器中的數據加1。
- 有了定時器/計數器之后,可以增加單片機的效率,一些簡單的重復加1的工作可以交給定時器/計數器處理。CPU轉而處理一些復雜的事情。同時可以實現精確定時作用。
1.3.定時/計數器的工作原理
定時/計數器實質上是一個加1計數器。它隨著計數器的輸入脈沖進行自加1,也就是每來一個脈沖,計數器就自動加1,,當加到計數器為全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使相應的中斷標志位置1,向CPU發(fā)出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作于定時模式,則表示定時時間已到;如果工作于計數模式,則表示計數值已滿。
可見,由溢出時計數器的值減去計數初值才是加1計數器的計數值。
2.定時器
2.1.定時器結構
定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器THx和TLx組成。TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能;
TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志。
2.2.特殊功能寄存器
2.2.1.控制寄存器TCON
TCON的低4位用于控制外部中斷,已在前面中斷系統中介紹。TCON的高4位用于控
制定時/計數器的啟動和中斷申請。其格式如下:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節(jié)地址:88H | TF1 | TR1 | TF0 | TR0 |
- TF1(TCON.7):T1溢出中斷請求標志位。T1計數溢出時由硬件自動置TF1為1。CPU響應中斷后TF1由硬件自動清0。T1工作時,CPU可隨時查詢TF1的狀態(tài)。所以,TF1可用作查詢測試的標志。TF1也可以用軟件置1或清0,同硬件置1或清0的效果一樣。
- TR1(TCON.6):T1運行控制位。TR1置1時,T1開始工作;TR1置0時,T1停止工作。TR1由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。
- TF0(TCON.5):T0溢出中斷請求標志位,其功能與TF1類同。
- TR0(TCON.4):T0運行控制位,其功能與TR1類同。
2.2.2.工作方式寄存器TMOD
工作方式寄存器TMOD用于設置定時/計數器的工作方式,低四位用于T0,高四位用于T1。其格式如下:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字節(jié)地址:89H | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
-
GATE是門控位:
GATE=0時,用于控制定時器的啟動是否受外部中斷源信號的影響。只要用軟件使TCON中的TR0或TR1為1,就可以啟動定時/計數器工作;
GATA=1時,要用軟件使TR0或TR1為1,同時外部中斷引腳INT0/1也為高電平時,才能啟動定時/計數器工作。即此時定時器的啟動條件,加上了INT0/1引腳為高電平這一條件。 -
C/T :定時/計數模式選擇位。
C/T =0為定時模式;T上面有一杠代表=0時為定時
C/T =1為計數模式。C上面沒有一杠代表=1時為計數 -
M1M0:工作方式設置位。定時/計數器有四種工作方式。
M1M0 | 工作方式 | 說明 |
---|---|---|
00 | 方式 0 | 13位定時/計數器 |
01 | 方式 1 | 16位定時/計數器 |
10 | 方式 2 | 8位自動重裝定時/計數器 |
11 | 方式 3 | T0分成兩個獨立的 8 位定時/計數器;T1 此方式停止計數 |
- 方式0
方式0為13位計數,由TL0的低5位(高3位未用)和TH0的8位組成。TL0的低5位溢出時向TH0進位,TH0溢出時,置位TCON中的TF0標志,向CPU發(fā)出中斷請求。
定時器模式時有:N=t/ Tcy
計數初值計算的公式為:X=213-N。
定時器的初值還可以采用計數個數直接取補法獲得。
計數模式時,計數脈沖是T0引腳上的外部脈沖。
門控位GATE具有特殊的作用。當GATE=0時,經反相后使或門輸出為1,此時僅由TR0控制與門的開啟,與門輸出1時,控制開關接通,計數開始;當GATE=1時,由外中斷引腳信號控制或門的輸出,此時控制與門的開啟由外中斷引腳信號和TR0共同控制。當TR0=1時,外中斷引腳信號引腳的高電平啟動計數,外中斷引腳信號引腳的低電平停止計數。這種方式常用來測量外中斷引腳上正脈沖的寬度。
- 方式1
方式1的計數位數是16位,由TL0作為低8位,TH0作為高8位,組成了16位加1計數器 。
計數個數與計數初值的關系為:X=216-N - 方式2
方式2為自動重裝初值的8位計數方式。
計數個數與計數初值的關系為:X=28-N
工作方式2特別適合于用作較精確的脈沖信號發(fā)生器。 - 方式3
方式3只適用于定時/計數器T0,定時器T1處于方式3時相當于TR1=0,停止計數。
工作方式3將T0分成為兩個獨立的8位計數器TL0和TH0 。
2.3.使用定時器步驟
- 1.對TMOD賦值,以確定T0和T1的工作方式。
- 2.計算初值,并將其寫入TH0、TL0或TH1、TL1。
- 3.中斷方式時,則對EA賦值,開放定時器中斷。
- 4.使TR0或TR1置位,啟動定時/計數器定時或計數。
2.4.計數器初值的計算
- 機器周期也就是CPU完成一個基本操作所需要的時間。
- 機器周期=1/單片機的時鐘頻率。
- 51單片機內部時鐘頻率是外部時鐘的12分頻。也就是說當外部晶振的頻率輸入到單片機里面的時候要進行12分頻。比如說你用的是12MHZ的晶振,那么單片機內部的時鐘頻率就是12/12MHZ,當你使用12MHZ的外部晶振的時候。機器周期=1/1M=1us。
- 我們定時1ms的初值是多少呢,1ms/1us=1000。也就是要計數1000個數,初值=65535-1000+1(因為實際上計數器計數到65536才溢出)=64536=FC18H
3.定時器中斷編程樣例
3.1.聲明和定義
3.2.定時器0來設置1毫秒定時
1.使用定時器0也就是要設置TMOD低八位,GATE=0,C/T=0,工作方式1所以M1M0=01
2.計算初值
方式1對應計算公式 :X=216-N;
也可以通過51初值設定軟件快速生成;下載軟件,被當成病毒時自行在安全中心允許并找回。
TH0=0XFC; //給定時器賦初值,定時1ms
TL0=0X18;
加上定時器0中斷允許、總中斷和開啟定時器的函數代碼:
void Timer0Init()
{TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。TH0=0XFC; //給定時器賦初值,定時1msTL0=0X18; ET0=1;//打開定時器0中斷允許EA=1;//打開總中斷TR0=1;//打開定時器
}
想要每隔一秒就亮一秒LED,在定時1ms后還需要繼續(xù)賦初值再定時,累加1000后剛好1秒。中斷函數中斷號為1。
void Timer0() interrupt 1
{static u16 i;TH0=0XFC; //重新裝載初值,定時1msTL0=0X18;i++;if(i==1000)//累加1000次得到一秒{i=0;led=~led; }
}
完整代碼如下:
#include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器
typedef unsigned int u16; //對數據類型進行聲明定義
typedef unsigned char u8;sbit led=P2^0; //定義P20口是led
/*
定時器0初始化函數
*/
void Timer0Init()
{TMOD|=0X01;//選擇為定時器0模式,工作方式1,僅用TR0打開啟動。TH0=0XFC; //給定時器賦初值,定時1msTL0=0X18; ET0=1;//打開定時器0中斷允許EA=1;//打開總中斷TR0=1;//打開定時器
}void main()
{ Timer0Init(); //定時器0初始化while(1);
}void Timer0() interrupt 1
{static u16 i;TH0=0XFC; //重新裝載初值,定時1msTL0=0X18;i++;if(i==1000)//累加1000次得到一秒{i=0;led=~led; }
}