定時計數器_單片機_普中


1 定時/計數器介紹

  定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器THX和TLX組成。它隨着計數器的輸入脈沖進行自加1,也就是每來一個脈沖,計數器就自動加1,當加到計數器為全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使相應的中斷標志位置1(產生一個溢出標志),向CPU發出中斷請求(定時/計數器中斷運行時)。如果定時/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。

(1)CPU時序的有關知識

①時鍾周期/振盪周期:時鍾周期又叫做振盪周期、節拍周期,定義為時鍾晶振頻率的倒數。時鍾周期是計算機中最基本的、最小的時間單位。在一個時鍾周期內,CPU僅完成一個最基本的動作。例如晶振為12M,則時鍾周期為1/12us。又可以被定義為節拍。
②指令周期:指令周期是指取出並完成一條指令所需的時間,一般由若干個機器周期組成,分為單周期指令,雙周期指令和多周期指令。對於一些簡單的單字節指令,在取指令周期中,指令取出到指令寄存器后,立即譯碼執行,不再需要其它的機器周期。對於一些比較復雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期。
③機器周期:在計算機中,為了便於管理,常把一條指令的執行過程划分為若干個階段,每一階段完成一項工作。例如,取指令、存儲器讀、存儲器寫等,這每一項工作稱為一個基本操作。完成一個基本操作所需要的時間稱為機器周期。一般情況下,一個機器周期由若干個S周期(狀態周期)組成。比如,取值周期,取數周期。在80C51內部,機器周期一般包括於6個狀態周期,12個時鍾周期。例如24M的晶振,機器周期為12/24M秒。

例如:外接晶振為 12MHz 時,51 單片機相關周期的具體值為: 振盪周期=1/12us; 狀態周期=1/6us; 機器周期=1us; 指令周期=1~4us;

(2)學習定時器需要明白的幾點:

①普通51單片機有兩組定時/計數器,因為即可以定時,又可以計數,故稱之為定時/計數器;

②定時/計數器和單片機的CPU是相互對立的,定時/計數器工作的過程是自動完成的,不需要CPU的參與。

③51單片機中的定時/計數器是根據機器內部的時鍾或者是外部的脈沖信號對寄存器的數據加1。

   有了定時/計數器之后,可以增加單片機的效率,一些簡單地重復加1的工作交給定時/計數器處理。CPU轉而處理一些復雜的事情,同時可以實現精確定時作用。

(3)定時/計數器內部結構框圖

  定時/計數器T0和T1分別是由兩個8位的專用寄存器組成,即定時/計數器T0由TH0和TL0組成,T1由TH1和TL1組成。此外,其內部還有2個8位的特殊功能寄存器TMOD和TCON,TMOD負責控制和確定T0和T1的功能和工作模式,TCON用來控制T0和T1啟動或停止計數,同時包含定時/計數器的狀態。

TF0:定時器0溢出標志。定時/計數器溢出時由硬件置位。中斷處理時由硬件清除,或用軟件清除。

TF1:定時器1溢出標志。定時/計數器溢出時由硬件置位。中斷處理時由硬件清除,或用軟件清除。

從上面的圖中紅線可以看出由TMOD選擇由那個定時器工作,工作於什么方式;

從上面的圖中藍線可以看出由TCON決定定時器是否啟動;

從上面的圖中黃線可以看出外部技術輸入由TH和TL進行累計;

從上面的圖中紫線可以看出當TH和TL計數溢出時會向TCON進行申請報告;

從上面的圖中綠線可以看出所有的定時中斷都由TCON向CPU進行中斷申請;

從上面的圖中黑線可以看出外部中斷直接向CPU進行中斷申請;

(4)定時/計數器相關寄存器配置

1)定時器控制寄存器TCON

①-④TCON[3:0]:外部中斷控制位;

⑤TR0(TCON[4]) :定時/計數器T0運行控制位,TR0=1時,T0開始工作,否則停止工作。TR0由軟件置1或清0。所以,用軟件可控制定時/計數器的啟動與停止。

⑥TF0(TCON[5]) :定時/計數器T0溢出中斷請求標志位。T0計數溢出時由硬件自動置TF0為1。CPU響應中斷后TF0由硬件自動清0。

⑦TR1(TCON[6]) :定時/計數器T1運行控制位,其功能與TR0類同。

⑧TF1(TCON[7]) :定時/計數器T1溢出中斷請求標志位,其功能與TF0類同。

2)定時器模式寄存器TMOD

①-② M1M0(TMOD[1:0]):定時器T0工作方式設置位,共有四種工作方式。

③ C/T(TMOD[2]):定時器T0定時/計數模式選擇位,當C/T=0時為定時模式;當C/T=1為計數模式;

④ GATE(TMOD[3]):定時器T0門控位,用於控制定時器的啟動是否受外部中斷源信號的影響。當GATE=0時,只要用軟件使TCON中TR0或TR1為1,就可以啟動定時器工作;當GATE=1時,不僅要用軟件使TCON中TR0或TR1為1,同時外部中斷引腳INT0/INT1也為高電平時,才能啟動定時器工作。

④~⑦(TMOD[7:4]):定時器T1工作模式設置位,與定時器T0類同。

2 功能要求:通過定時器 0 中斷控制 D1 指示燈間隔 1 秒閃爍,定時器1中斷控制D2指示燈間隔1秒閃爍。

3 硬件設計(略)

4 軟件設計

 1 #include "reg52.h"      //頭文件
 2 
 3 typedef unsigned int     u16;
 4 typedef unsigned char     u8;
 5 
 6 //定義輸出管腳
 7 sbit     LED1    =    P2^0;       //LED1管腳
 8 sbit     LED2    =     P2^1;        //LED2管腳
 9 
10 //定時器T0初始化,順序可以調整
11 void timer0_init(void)
12 {
13      TMOD    =    TMOD |  0X01;    //設置定時器的工作方式,即TMOD=0000_0001
14     /*選擇定時器T0,工作方式1*/
15     TH0        =    0XFC;           //給定時器TH賦初值,定時1ms
16     TL0     =     0X18;        //給定時器TL賦初值,定時1ms
17     ET0        =    1;              //打開定時器中斷允許位
18     EA        =     1;            //打開總中斷允許位
19     TR0        =     1;            //打開定時器
20 }
21 
22 //定時器T1初始化,順序可以調整
23 void timer1_init(void)
24 {
25      TMOD    =    TMOD |  0X10;    //設置定時器的工作方式,即TMOD=0001_0000
26     /*選擇定時器T1,工作方式1*/
27     TH1        =    0XFC;           //給定時器TH賦初值,定時1ms
28     TL1     =     0X18;        //給定時器TL賦初值,定時1ms
29     ET1        =    1;              //打開定時器中斷允許位
30     EA        =     1;            //打開總中斷允許位
31     TR1        =     1;            //打開定時器
32 }
33 
34 
35 //主函數
36 void main()
37 {
38      timer0_init();    //對定時器T0進行初始化
39     timer1_init();    //對定時器T1進行初始化
40 
41     while(1)  
42     {
43               /*進入循環,但沒有任何執行功能程序,但當定時時間到達1MS,
44             即會進入定時中斷函數*/
45     }
46 }
47 
48 //定時中斷,定時1ms
49 void time0() interrupt 1
50 {
51      static u16 i;          //靜態變量i,可以保持原來的值
52     TH0        =    0XFC;    //定時器溢出后,需要手動加載初值
53     TL0     =     0X18;
54     i++;                   //i=i+1,
55     if(i==1000)            //當i=1000時,表示定時時間達1秒
56     {
57          i        =    0;            //清零變量i,代表1秒時間完成
58         LED1     =     !LED1;       //控制LED狀態翻轉
59     }
60 }
61 
62 //定時中斷,定時1ms
63 void time1() interrupt 3
64 {
65      static u16 i;          //靜態變量i,可以保持原來的值
66     TH1        =    0XFC;    //定時器溢出后,需要手動加載初值
67     TL1     =     0X18;
68     i++;                   //i=i+1,
69     if(i==1000)            //當i=1000時,表示定時時間達1秒
70     {
71          i        =    0;            //清零變量i,代表1秒時間完成
72         LED2     =     !LED2;       //控制LED狀態翻轉
73     }
74 }
timer_led

5 仿真與實驗結果

   實驗現象:指示燈D1和D2間隔1s閃爍。

參考文獻

(1)單片機時鍾周期、機器周期、指令周期的區別-百度經驗 (baidu.com)

(2)(81條消息) 單片機學習(三)定時器篇_chenwenjie666的博客-CSDN博客_單片機定時器;

(3)(81條消息) 51單片機——定時器_LiuRenyou的博客-CSDN博客_51單片機定時器程序


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM