娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2025年06月21日(星期六)

2021年06月21日 | 51單片機開發之定時器

發布者:乘風翻浪 來源: eefocus關鍵字:51單片機開發  定時器  時間單位 手機看文章 掃描二維碼
隨時隨地手機看文章

4.1 定時器

4.1.1 51時鐘周期介紹

時鐘周期:時鐘周期T是時序中最小的時間單位,具體計算的方法就是 1/時鐘源頻率,89C51單片機開發板上常用的晶振是11.0592M,對于這個單片機系統來說,時鐘周期=1/11059200 秒。


機器周期:是單片機完成一個操作的最短時間。


機器周期主要針對匯編語言而言,在匯編語言下程序的每一條語句執行所使用的時間都是機器周期的整數倍,而且語句占用的時間是可以計算出來的,而 C 語言一條語句的時間是不確定的,受到諸多因素的影響。


51單片機系列,在其標準架構下一個機器周期是 12 個時鐘周期,也就是 12/11059200 秒。


現在很多的增強型51單片機,其速度都比較塊,有的1個機器周期等于 4 個時鐘周期,有的1個機器周期就等于1個時鐘周期,也就是說大體上其速度可以達到標準 51 架構的 3 倍或 12倍。


定時器和計數器是單片機內部的同一個模塊,通過配置 SFR(特殊功能寄存器)可以實現兩種不同的功能大多數情況下是使用定時器功能。


顧名思義,定時器就是用來進行定時的,定時器內部有一個寄存器,讓它開始計數后,這個寄存器的值每經過一個機器周期就會自動加1,可以把機器周期理解為定時器的計數周期。就像鐘表,每經過一秒,數字自動加 1,而這個定時器就是每過一個機器周期的時間,也就是 12/11059200 秒,數字自動加 1。


4.1.2 定時器功能介紹

標準的51單片機內部有T0和T1兩個定時器,T 就是 Timer 的縮寫。


STC90C51RC/RD+系列單片機的定時器0和定時器1,與傳統8051的定時器完全兼容,當在定時器1做波特率發生器時,定時器0可當兩個8位定時器使用。


STC90C51RC/RD+系列單片機內部設置的兩個16位定時器/計數器T0和T1都具有計數方式和定時方式兩種工作方式。 對每個定時器/計數器(T0和T1),在特殊功能寄存器TMOD中都有一個控制位— C/T來選擇T0或T1為定時器還是計數器。


定時器/計數器的核心部件是一個加法(也有減法)的計數器,其本質是對脈沖進行計數。只是計數脈沖來源不同:如果計數脈沖來自系統時鐘,則為定時方式,此時定時器/計數器每12個時鐘或每6個時鐘得到一個計數脈沖,計數值加1;如果計數脈沖來自單片機外部引腳(T0為P3.4,T1為P3.5),則為計數方式,每來一個脈沖加1。


定時器/計數器0有4種工作模式:

模式0(13位定時器/計數器)

模式1(16位定時器/計數器)

模式2(8位自動重裝模式)

模式3(兩個8位定時器/計數器)

定時器/計數器1除模式3外,其他工作模式與定時器/計數器0相同,T1在模式3時無效,停止計數。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-1-1 定時器的寄存器

定時器的相關寄存器介紹,在STC單片機官方手冊的137頁有詳細講解。

手冊下載地址: http://www.stcmcu.com

上面圖片里就是使用定時器時需要配置的寄存器,其中TL0、TL1、TH0、TH1寄存器用于存放定時器的重裝載值,分為高低位兩個寄存器。


4.1.3 TCON寄存器

TCON寄存器用于控制定時器,比如: 定時器啟動位、定時器溢出標志位等等。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-1-2 TCON寄存器

 

TCON寄存器支持位尋址,在頭文件里也定義了每個位的功能,可以直接操作位進行賦值。


TF1和TF0:是定時器1和定時器0的溢出標志位,當定時器計數溢出時(就是定時器超時),該標志位置1。


TR1和TR0:是定時器1和定時器0的控制位。當賦值為1時,就啟動定時器,開始計數。

其他的位是外部中斷相關的控制,目前學習定時器時沒有用到,先暫時不管。


4.1.4 TMOD寄存器

TMOD寄存器用于配置定時器的模式。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-1-3 TMOD寄存器

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

圖4-1-4 寄存器模式選擇


4.1.5 定時器重裝值計算方法

51單片機標準架構下一個機器周期是12個時鐘周期,如果晶振頻率是11.059200MHZ,那一個機器周期的時間就是12/11.059200 微秒。


也就是說定時器的計數器+1的時間就12/11.059200=1.085069us。


如果定時器工作在16位模式下,最大值可以存放: 0~65535范圍的值,那么最大的定時時間就可以得知:

65535*1.085069=71109.996915us=71.109996915ms  ,大約是71毫秒的時間。

如果需要定時1000us,那么公式就是:x*1.085069=1000,得出x的值就是:  1000/1.085069=921 。


計算出定時器需要+921次剛好得到1000us,但是單片機工作在16位模式情況下,需要加滿65535定時器才會溢出,所以需要給定時器賦初值。


65535-921=64614,這樣定時器就可以從64614開始計數,當計數到65535時,定時器就會溢出,TF0就會置1,這時剛好經過1000us時間。

那么定時器的重裝值寄存器就可以這樣賦值:

u16 t0_data=64614;

TH0=t0_data>>8;  //高位

TL0=t0_data;     //低位


4.1.6 配置定時器0工作在16位定時器模式

下面代碼里配置51單片機的定時器0工作在16位定時器模式。程序封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。


程序里的功能是,時間到達1秒鐘,就是改變一次LED燈的狀態。


示例代碼:

(硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間)


#include #define LED P0  //定義LED引腳u16 T0_Update_data;//定時器0的初始值void Timer0_16bit_Init(u16 us){       //當前實驗板上的晶振實際頻率為: 11.956MHZ    u16 val=us/(12/11.956); //得到計數的時間,只要整數部分    T0_Update_data=65535-val; //得到重裝載值    TMOD&=0xF0;     //清除配置    TMOD|=0x01;     //配置定時器0工作在16位定時器模式    TH0=T0_Update_data>>8; //定時器0高位重裝值    TL0=T0_Update_data;    //定時器0低位重裝值    TR0=1;          //啟動定時器0}//定時器0的重裝值更新函數void Timer0_Update(void){    TH0=T0_Update_data>>8; //定時器0高位重裝值    TL0=T0_Update_data;    //定時器0低位重裝值}int main(){    u32 cnt=0;    u8 i=0;    Timer0_16bit_Init(1000);  //配置定時器超時的時間為1000us    LED=0x00; //關閉所有燈    while(1)    {        if(TF0) //判斷定時器0定時時間是否到達        {            cnt++;//記錄超時次數            if(cnt==1000)            {                cnt=0;                LED=~LED; //取反LED燈            }            TF0=0; //清除標志位            Timer0_Update(); //重新給定時器的計數器賦值         }    }}


4.1.7 配置定時器1工作在16位定時器模式


下面代碼里配置51單片機的定時器1工作在16位定時器模式。程序封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。


程序里的功能是,時間到達1秒鐘,就是改變一次LED燈的狀態。


示例代碼:


(硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間)


#include #include "delay.h"#define LED P0  //定義LED引腳u16 T1_Update_data;//定時器1的初始值void Timer1_16bit_Init(u16 us){       //當前實驗板上的晶振實際頻率為: 11.956MHZ    u16 val=us/(12/11.956); //得到計數的時間,只要整數部分    T1_Update_data=65535-val; //得到重裝載值    TMOD&=0x0F;            //清除配置    TMOD|=0x10;            //配置定時器1工作在16位定時器模式    TH1=T1_Update_data>>8; //定時器1高位重裝值    TL1=T1_Update_data;    //定時器1低位重裝值    TR1=1;                 //啟動定時器1} //定時器1的重裝值更新函數void Timer1_Update(void){    TH1=T1_Update_data>>8; //定時器1高位重裝值    TL1=T1_Update_data;    //定時器1低位重裝值}int main(){    u32 cnt=0;    u8 i=0;    Timer1_16bit_Init(1000);  //配置定時器超時的時間為1000us    LED=0x00; //關閉所有燈    while(1)    {        if(TF1) //判斷定時器0定時時間是否到達        {            cnt++;//記錄超時次數            if(cnt==1000)            {                cnt=0;                LED=~LED;            }            TF1=0; //清除標志位            Timer1_Update(); //重新給定時器的計數器賦值         }    }}


4.1.8 配置定時器0工作在8位自動重裝載模式


下面代碼里配置51單片機的定時器0工作在8位定時器自動重裝載模式,在自動重裝載模式下,每次定時器超時之后,就省去了手動賦重裝值的過程,比較方便,但是定時器的每次最大定時時間變短了,計數器到達255就會溢出。


程序里封裝了計算重裝值的函數,方便調用,程序沒有使用中斷,采用輪詢方式檢測定時器是否超時,在主函數里使用了一個計數變量,記錄定時器超時的次數,方便記錄更長的時間。


程序里的功能是,時間到達500毫秒,就是改變一次LED燈的狀態。


示例代碼: 


(硬件平臺說明:CPU是STC90C516RD 、晶振頻率12MHZ 、工作在12T模式下、一個機器周期為1us時間)


#include /*配置定時器0工作在8位自動重裝載模式注意,時間不能超過定時器最大時間255*(12/11.059200)=276us*/void Timer0_8bit_Init(u16 us){       //當前實驗板上的晶振實際頻率為: 11.956MHZ    u16 val=us/(12/11.956); //得到計數的時間,只要整數部分    TMOD&=0xF0;     //清除配置    TMOD|=0x02;     //配置定時器0工作在8位自動重載模式    TL0=TH0=255-val;//得到重裝載值;    TR0=1;          //啟動定時器0}#define LED P0  //定義LED引腳int main(){    u32 cnt=0;    u8 i=0;    Timer0_8bit_Init(100);  //配置定時器超時的時間為100us    LED=0x00; //關閉所有燈    while(1)    {        if(TF0) //判斷定時器0定時時間是否到達        {            cnt++;//記錄超時次數            if(cnt==10*500) //500ms            {                cnt=0;                LED=~LED;            }            TF0=0; //清除標志位        }    }


關鍵字:51單片機開發  定時器  時間單位 引用地址:51單片機開發之定時器

上一篇:51單片機程序執行流程(STARTUP.A51)
下一篇:最后一頁

推薦閱讀

開關穩壓器使用輸出級,重復切換“開”和“關”狀態,與能量存貯部件(電容器和感應器)一起產生輸出電壓。它的調整是通過根據輸出電壓的反饋樣本來調整切換定時來實現的。中國北京 – 2018 年 6 月 21 日 – Analog Devices (ADI) 宣布推出 Power by Linear? LT8642S,這是一款 10A、18V 輸入同步降壓型開關穩壓器。其 Silent Switc...
起于蘇南內衣廠的長電科技,越過臺灣當局跑到大陸建晶圓代工廠的臺灣人,在包郵區開放包容的政策下,或起于草莽頑強生長,或借助地方政府提供的土地和人才紅利,在大陸市場大放異彩。起于微末的民營企業,和世界級的企業同場競技,是這片熱土上的奇景。 一張世界半導體大會的展位圖,揭開了包郵區芯片之城的暗戰。在南京世界半導體大會熱鬧的展位上,不見...
搞過嵌入式開發的程序員一定知道有I2C總線,手機和電視中的主要串行技術,通過兩條線SDA,SCL解決總線傳輸,地址區分和熱插拔問題的技術。可是就是這么一個簡單的東西,讓我這個自認為有些經驗的單片機開發者浪費了整整五個月!這還是我有比較充分的經驗,在一年半前就已經非常了解I2C協議的情況下!這段時間我花了無數的時間在調試,思考,解決問題而沒有...
近日,瑞豐光電稱,目前主要的生產基地為深圳和義烏工廠,一個生產基地從取得土地到基建到廠房裝修再到設備調試等需要較長的周期,公司看好MINI LED未來在背光和直顯領域的發展,公司提前布局第三個制造基地。自從邁入電子消費潮流以來,隨著人們對電子產品的顯示不斷提出著新的要求,LED顯示技術也得到迅速發展,尤其是MINI LED、Micro LED的出現,LED...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 泰顺县| 丘北县| 鸡东县| 临安市| 弥渡县| 鹿邑县| 鹿泉市| 杨浦区| 太原市| 四子王旗| 晋江市| 成武县| 平度市| 德州市| 遂川县| 永定县| 葫芦岛市| 揭西县| 兴国县| 本溪市| 察哈| 珲春市| 普兰店市| 庆阳市| 武冈市| 祁门县| 额济纳旗| 通许县| 怀柔区| 高淳县| 麟游县| 翁源县| 本溪市| 南雄市| 保亭| 沅陵县| 呼伦贝尔市| 汝阳县| 和田市| 靖安县| 荔浦县|