1. 程式人生 > >學習筆記之-51微控制器定時計數器

學習筆記之-51微控制器定時計數器

一、微控制器的時序

  微控制器工作時,是在統一的時鐘脈衝控制下一拍一拍地進行的。由於指令的位元組數不同,取這些指令所需要的時間也就不同,即使是位元組數相同的指令,由於執行操作有較大的差別,不同的指令執行時間也不一定相同,即所需的拍節數不同。
  時鐘週期:時鐘週期也稱為振盪週期,定義為時鐘脈衝的倒數(可以這樣來理解,時鐘週期就是微控制器外接晶振的倒數,例如12M的晶振,它的時間週期就是1/12 us),是計算機中最基本的、最小的時間單位。 在一個時鐘週期內,CPU僅完成一個最基本的動作。 在8051微控制器中把一個時鐘週期定義為一個節拍(用P表示),二個節拍定義為一個狀態週期(用S表示)。
  機器週期:

在計算機中,為了便於管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。8051系列微控制器的一個機器週期同6個S週期(狀態週期)組成。前面已說過一個時鐘週期定義為一個節拍(用P表示),二個節拍定義為一個狀態週期(用S表示),8051微控制器的機器週期由6個狀態週期組成,也就是說一個機器週期=6個狀態週期=12個時鐘週期。
  指令週期: 指令週期是執行一條指令所需要的時間,一般由若干個機器週期組成。指令不同,所需的機器週期數也不同。 時鐘週期、機器週期、指令週期之間的關係圖如下。

時序關係圖.png

二、51微控制器的定時/計數器的概念

  微控制器中,脈衝計數與時間之間的關係十分密切,每輸入一個脈衝,計數器的值就會自動累加1,只要相鄰兩個計數脈衝之間的時間間隔相等,則計數值就代表了時間的流逝,因此,微控制器中的定時器和計數器其實是同一個物理的電子元件,只不過計數器記錄的是微控制器外部發生的事情(接受的是外部脈衝),而定時器則是由微控制器自身提供的一個非常穩定的計數器,這個穩定的計數器就是微控制器上連線的晶振部件;MCS-51微控制器的晶振經過12分頻之後提供給微控制器穩定脈衝;晶振的頻率是非常準確的,所以微控制器的計數脈衝之間的時間間隔也是非常準確的。

三、51微控制器的定時/計數器的工作原理

  加1計數器輸入的計數脈衝有兩個來源,一個是由系統的時鐘振盪器輸出脈衝經12分頻後送來;一個是T0或T1引腳輸入的外部脈衝源。
  作為定時器使用時,定時器計數8051微控制器片內振盪器輸出經過12分頻後的脈衝個數,即:每個機器週期使定時器T0/T1的暫存器值自動累加1,直到溢位,溢位後繼續從0開始迴圈計數;所以,定時器的解析度是時鐘振盪頻率的1/12;
  作為計數器使用時,通過引腳T0(P3.4)或T1(P3.5)對外部脈衝訊號進行計數,當輸入的外部脈衝訊號發生從1到0的負跳變時,計數器的值就自動加1由於檢測一個從1到0的下降沿需要2個機器週期,因此要求被取樣的電平至少要維持一個機器週期。當晶振頻率為12MHz時,最高計數頻率不超過1/2MHz,即計數脈衝的週期要大於2微秒。;計數器的最高頻率一般是時鐘振盪頻率的1/24;
  由此可知,不論是定時器還是計數器工作方式,定時器T0和T1均不佔用CPU的時間,除非定時器/計數器T0和T1溢位,才可能引起CPU中斷,轉而去執行中斷處理程式。所以說,定時器/計數器是微控制器中效率高而工作靈活的部件。

51微控制器定時器工作原理圖:

這裡寫圖片描述

  由上圖可見與定時器相關的暫存器主要有下面這幾個:TMOD、 TCON、 TL0、TH0、TL1、TH1。下面介紹一下這幾個暫存器

  • 16位加法計數器:
    這裡寫圖片描述
      是定時計數器的核心,其中 TL0、TH0、是定時計數器0的底八位和高八位;TL1、TH1是定時計數器1的底八位和高八位;並且高八位和底八位可單獨使用。16位加法計數器主要是在設定定時計數器的初值時候使用
  • TMOD定時器工作模式及方式暫存器
    TMOD
       GATE :定時操作開關控制位,當GATE=1時,INT0或INT1引腳為高電平,同時TCON中的TR0或TR1控制位為1時,計時/計數器0或1才開始工作。若GATE=0,則只要將TR0或TR1控制位設為1,計時/計數器0或1就開始工作。
      C/T :定時器或計數器功能的選擇位。C/T=1為計數器,通過外部引腳T0或T1輸入計數脈衝。C/T=0時為定時器,由內部系統時鐘提供計時工作脈衝。
      M1 M0:T0、T1工作模式選擇位
      m0m1
      
  • TCON定時器控制暫存器
    這裡寫圖片描述
    TF1:定時器T1溢位標誌,可由程式查詢和清零,TF1也是中斷請求源,當CPU響應T1中斷時由硬體清零。
    TF0:定時器T0溢位標誌,可由程式查詢和清零,TF0也是中斷請求源,當CPU響應T0中斷時由硬體清零。
    TR1:T1充許計數控制位,為1時充許T1計數(定時)。
    TR0:T0充許計數控制位,為1時充許T0計數(定時)。
    IE1:外部中斷1請示源(INT1,P3.3)標誌。IE1=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬體清“0”。
    IT1:外部中斷源1觸發方式控制位。此位為1設定為底電平觸發,為0設定為下降沿觸發。
    IE0:外部中斷0請示源(INT0,P3.2)標誌。IE0=1,外部中斷1正在向CPU請求中斷,當CPU響應該中斷時由硬體清“0”。
    IT0:外部中斷源0觸發方式控制位。此位為1設定為底電平觸發,為0設定為下降沿觸發。

51微控制器定時器4種工作方式:

  工作模式0:
  由TL0的低5位和TH0的全部8位共同構成一個13位的定時器/計數器,定時器/計數器啟動後,定時或計數脈衝個數加到TL0上,從預先設定的初值(時間常數)開始累加,不斷遞增1,當 TL0計滿後,向TH0進位,直到13位暫存器計滿溢位,TH0溢位時,置位TCON中的TF0標誌,向CPU發出中斷請求。並且定時器/計數器硬體會自動地把13位的暫存器值清0,如果需要進一步定時/計數,需要使用相關指令重置時間常數,並把定時器/計數器的中斷標記TF0置0。
  工作模式1:最常用的定時器工作模式
  模式1與模式0幾乎完全相同,唯一的區別就是,模式1中的暫存器TH0和TL0共同構成的是一個16位定時器/計數器來參與操作,因此比模式0中的定時/計數範圍更大
10
  工作模式2: 工作方式2特別適合於用作較精確的脈衝訊號發生器。
  這種模式又稱為自動再裝入預置數模式。有時候,我們的定時/計數操作是需要多次重複定時/計數的,如果溢位時不做任何處理,那麼,在第二輪定時/計數時就是從0開始定時/計數了,而這並不是我們想要的。所以,要保證每次溢位之後,再重新開始定時/計數的操作是我們想要的,那就要把預置數(時間常數)重新裝入某個地方,而重新裝入預置數的操作是硬體裝置自動完成的,不需要人工干預,所以這種工作模式就叫自動再裝入預置數方式。在工作模式2中,把自動重灌入的預置數存放在定時器/計數器的暫存器的高8位中,也就是存放在TH0中,而只留下TL0參與定時/計數操作。
  這個工作模式常用於波特率發生器(串列埠通訊),T1工作在串列埠模式2;用於這種方式時,定時器就是為了提供一個時間基準;計數溢位之後,不需要做太多的事情,只做一件事就可以,就是重新裝入預置數,再開始重新計數,而且中間不需要任何延時。
2

  工作模式3:
  方式3只適用於定時/計數器T0,定時器T1處於方式3時相當於TR1=0,停止計數由於定時器/計數器T1沒有工作模式3,如果把定時器/計數器T0設定為工作模式3,那麼TL0和TH0將被分割成兩個相互獨立的8位定時器/計數器。
這裡寫圖片描述

三、51微控制器的定時/計數器的應用

  在protues下搭建模擬環境:
  定時器測試原理圖.png

  在這裡介紹一下定時器初值的設定:
  
工作方式0:13位定時器/計數器工作模式,最多可計數2的13次方次,即:8192次
工作方式1:16位定時器/計數器工作模式,最多可計數2的16次方次,即:65536次
工作方式2:8位定時器/計數器工作模式,最多可計數2的8次方次,即:256次,
工作方式3:8位定時器/計數器工作模式,最多可計數2的8次方次,即:256次

  以12M晶振為例:每秒鐘可以執行1000000次機器週期個機器週期。而定時器每次溢位 最多65536 個機器週期。
那麼對12MHz的晶振來講
1個機器週期 1us ( 12/fosc = 1us)
方式0 13位定時器最大時間間隔 = 2^13 = 8.192ms
方式1 16位定時器最大時間間隔 = 2^16 = 65.536ms
方式2 8位定時器最大時間間隔 = 2^8 = 0.256ms =256 us
方式3 8位定時器最大時間間隔 = 2^8 = 0.256ms =256 us

以上是對定時器定時的最大時間間隔做一個說明,下面具體說明怎麼計算初值(小於最大時間間隔)假如定時10ms那麼的定時器初值計算如下:
-當使用12M晶振,12MHz除12為1MHz,也就是說一秒=1000000次機器週期。10ms=10000次 機器週期。
預置數的計算公式:預置數=最大值-需要計數的次數;(65536-10000)
再將預置數裝入16位定時計數器,如下:
TH0=(65536-10000)/256
TL0=(65536-10000)%256
-當使用11.0592M晶振,11.0592MHz除12為921600Hz,就是一秒921600次機器週期,10ms=9216次機器週期。
預置數的計算公式:預置數=最大值-需要計數的次數;(65536-9216)
再將預置數裝入16位定時計數器,如下:
TH0=(65536-9216)/256
TL0=(65536-9216)%256

  介紹完初值的確定,下面介紹定時器最常見的兩種用法

  • 定時:定時計數器作為定時器使用,配置步驟如下:
    1.模式設定,配置TMOD暫存器
    2.定時器初值設定 假設10ms中斷
    3.開定時器中斷
    4.開總中斷
    5.開啟定時器
    通過以上5步就打開了一個定時器,定時器沒10毫秒發起一次中斷,即沒10毫秒進入一次中斷服務程式
    示例程式如下:
#include<reg51.h>

sbit led=P1^0;
unsigned int flag;
void main()
{
    TMOD=0x01;//1.模式設定,00000001,採用的是定時器0,工作與式1(M1=0,M0=1)。
    TH0=(65536-10000)/256;  //2.定時器設定,每隔10毫秒發起一次中斷。
    TL0=(65536-10000)%256;
    ET0=1;                  //3.開定時器0中斷
    EA = 1;                 //4.開總中斷
    TR0=1;                  //5.開啟定時器
    while(1)
    {
         if(flag==100)  
        {
            led=~led;
            flag=0;

        }   
    }
}

void TIM0() interrupt 1 //中斷服務程式
{   
    TH0=(65536-10000)/256;  //進入中斷要重新設定定時器處置,要注意。
    TL0=(65536-10000)%256;
    flag++;
}
  • 計數:定時計數器作為計數器使用,配置步驟如下:
    1.模式設定,配置TMOD暫存器。
    2.開計數器中斷
    3.開總中斷
    4.開啟計數器
    通過這簡單的四步,我們就打開了一個計數器,可以對P3.4或者P3.5進行下降沿的脈衝計數,這裡有一點要注意就是計數器可以不開中斷,這樣溢位時只是不會進去中斷服務程式。
    示例程式如下:
#include<reg51.h>

sbit led=P1^0;
sbit s=P3^4;
unsigned int count;
void main()
{
    TMOD=0x05;       //1.模式設定,00000101,採用的是計數器0,工作模式1(M1=0,M0=1)。
    TH0=0;           //計數器清零
    TL0=0;
    ET0=1;           //2.開計數器0中斷
    EA=1;            //3.開總中斷
    TR0=1;           //4.開啟計數器
    led=1;
    while(1)
    {   
        count=(TH0<<8)|TL0;
        if((count*10000)==50000)//按5下按鍵led狀態取反  
            {
                led=0;
                TH0=0XFF;
                TL0=0XFF; //人為的讓計數器進入中斷
            }
    }
}

 void TIM0() interrupt 1 //中斷服務程式
{   
    led=1;
    TH0=0;
    TL0=0;          
}

心得體會~

這樣51微控制器的定時計數器就會使用了,當然這只是基礎的應用,當然我們使用微控制器只是學習配置它的硬體,其他高大上的用法可以說不關微控制器的事情,那關係到演算法啊思路想法這些東西了,真正難得還是後者。所以說只是要求會用,那麼花不了幾天時間就可以學會了,涉及到應用那就是一輩子的事情啦,寫這篇部落格一是對51系列微控制器做一下總結,方便日後開發,二呢也方便初學者借鑑一下,快速入門提高。

相關推薦

學習筆記-51微控制器定時計數器

一、微控制器的時序   微控制器工作時,是在統一的時鐘脈衝控制下一拍一拍地進行的。由於指令的位元組數不同,取這些指令所需要的時間也就不同,即使是位元組數相同的指令,由於執行操作有較大的差別,不同的指令執行時間也不一定相同,即所需的拍節數不同。   時鐘週期:

學習筆記-51微控制器中斷

1.中斷的概念   通俗的講,中斷就是cup正在工作的時候,突然外部來了某一請求,要求cpu轉去處理請求的事件,當事情做完之後cup再回來繼續它的工作。這一過程稱為中斷 。 微控制器中斷響應可以分為以下幾個步驟: 1、停止主程式執行。當前指令執行完後立即終

學習筆記51微控制器的中斷功能及其相關的暫存器

51微控制器中斷系統          引起CPU中斷的根源,稱為中斷源,中斷源向CPU提出中斷請求,CPU暫時中斷原來的事務A,轉去處理事件B,對時間B處理完畢後,再回來原來的地方(斷點),稱為中斷返回。實現上述中斷功能的部件稱為中斷系統(中斷機構)。 中斷優先順序決定了

51微控制器學習筆記定時器程式設計

一、定時器/計數器概述 1.相關暫存器 (1)TMOD——方式控制暫存器     GATE C/T M1 M0(T1 T0)   GATE=0,定時器/計數器的執行由內部TR0/TR1置1選通;   GATE=1,定時器/計數器的執行由外部中斷(I引腳P3.2/P3.3)和內部TR0/TR1 置1共

51微控制器學習筆記基礎部分

目錄 一、普中微控制器詳解 二、51微控制器介紹 三、C語言基礎 四、微控制器最小系統 五、開發軟體安裝與工程建立   從0開始,重新學微控制器,from 0 to 100.    ----2019/1/14 一、普中微控制器詳解   電源介面(火牛介面):額定電壓5V   ch

java學習筆記定時

blog div this rgs date row demo sdf 時間 定時器 1 package pack01_timer; 2 3 import java.io.File; 4 import java.text.ParseException; 5 i

學習筆記《吳堅鴻-手把手教你微控制器程式框架》

一,在工控專案中,由於受到電源的波動或者是外來的毛刺訊號干擾,開關的輸入訊號(連線MCU的輸入引腳)或讀取到瞬間的電平   注:MCU的輸入引腳預設為上拉電阻   二,微控制器C語言的多檔案程式設計技巧 1,每個檔案保持成雙成對出現。每個.c 原始檔必須有一個.h 標頭檔案跟它對應,每個.h

MFC學習筆記多對話方塊中使用定時

MFC菜鳥第一次發貼,請各位高人指教:我需要做一個基於對話方塊的程式,主對話方塊TimerTryDlg上就兩個按鈕,確定鈕按下後執行訊息處理OnFirstOK(),先初始化定時器,再開啟有模式對話方塊TestDlg,定時器時間到了執行OnTimer-在子對話方塊上的一個靜態控制元件上畫點,但OnTimer在

韋東山嵌入式Linux學習筆記——第12課第8節 字元裝置驅動程式定時器防抖動

注:本文部分內容摘自《魚樹學員筆記》。 當按鍵按得比較快的時候,這裡出現了兩次中斷值,也即產生了抖動。 這裡產生了“抖動”,按鍵是機械開關,按下鬆開時裡面的金屬彈片可能抖動了好幾次。這種抖動產生了多次“脈衝”導致多次中斷。 方法: 使用定時器來防抖動。

51微控制器定時器/計數器的使用程式與分析

定時器的使用能夠使延時更加的準確定時器/計數器由振盪器,12分頻電路,多路轉換開關MUX,16位的加1計數器T0和16位的T1暫存器組成。定時器/計數器的核心是16位的加1計數器。1、計數功能:對外部脈衝進行計數。外部脈衝通過T0(P3.4)、T1(P.5)兩個訊號引腳輸入,

msp430學習筆記定時器A

1 相關知識 1 定時器a圖解    圖 1  定時器A圖解 2  定時器A的四種計數模式   1. 停止模式。 2. 增計數模式。(產生兩個中斷標誌) 當計數到跟TACCR0一樣的時候,

SAS學習筆記函數應用

不能 oracle 理解 資料 oracl 函數應用 特殊 put acl 今天在做數據需求的時候遇到一些問題,因為不能夠在數據庫裏面做,僅僅好在SAS裏面實現。這就遇到了一些麻煩,須要使用一些函數實現部分功能,如查找字段中某個特殊字符出現的次數,查找某個字符的位置等,

c#學習筆記Application.DoEvents應用

box nbsp net replace 運算 技術 oop blank 假死 Visual Studio裏的摘要:處理當前在消息隊列中的所有 Windows 消息。 交出CPU控制權,讓系統可以處理隊列中的所有Windows消息 比如在大運算量循環內,加Applicati

[C#學習筆記異步編程模式2]BeginInvoke和EndInvoke方法 (轉載)

cti otf 函數返回 編程模式 catch 數值 gin 單線程 blog 為什麽要進行異步回調?眾所周知,普通方法運行,是單線程的,如果中途有大型操作(如:讀取大文件,大批量操作數據庫,網絡傳輸等),都會導致方法阻塞,表現在界面上就是,程序卡或者死掉,界面元素不動了,

.NET學習筆記ADO.NET

技術分享 reader sql語句 bsp 技術 area ada 執行sql 學習 據提供程序: Connection,用來連接數據庫 Command,用來執行SQL語句 DataReader只讀,只進的結果集,一條一條讀取數據 DataAdapter,一個封裝了上面3個

,NET學習筆記ADO.NET

nbsp png alt 學習 log logs ima http blog ,NET學習筆記之ADO.NET

Metasploit學習筆記——情報搜集

user 技術 得到 版本號 域名 listing 避免 ger max 1.情報搜集 1.1外圍信息搜索 1.1.1通過DNS和IP地址挖掘目標網絡信息 (1)whois域名註冊信息查詢(BT5、kali專有):[email protected]

鋒利的JQuery學習筆記JQuery

function 效率 back 一點 ie6 容易 服務器端 pre loading   今天終於看到了最令我興奮的一章:JQuery與Ajax的應用。AJAX即“Asynchronous JavaScript and XML”(異步JavaScript和XML),

java入門學習筆記1(類的定義,代碼的編譯執行)

spa hex nts 自動調用 [] alt vim 進制 技術 這篇文章講解Java代碼的基本執行過程 我們先拋開各種JAVA IDE,開發工具,只使用文本編輯器,以突出最本質的東西。 在Linux環境下,我們編輯一個文件: vim HelloWorld.java

python學習筆記列表與元組

長度 bsp 最大 一般來說 設置 概述 檢查 常用 而且 一、概述 python包含6種內建的序列,其中列表和元組是最常用的兩種類型。列表和元組的主要區別在於,列表可以修改,元組則不能修改 使用上,如果要根據要求來添加元素,應當使用列表;而由於要求序列不可修改時,此時