51單片機-實現定時器模塊教程

本章概述思維導圖:

51單片機驅動定時器模塊

CPU時序簡介

CPU時序定義了CPU內部操作的時間節奏,以下從四個時序周期進行逐步解析;

1、振蕩周期

????????振蕩周期:CPU內部時鐘源產生的最小時間單位,由晶振或內部振蕩器決定;

????????公式為:Tosc?=1 / ?fosc??;?fosc?為時鐘頻率

????????作用為:所有操作的基礎時間單位,CPU所有動作均同步于此信號。

2、狀態周期

????????狀態周期:部分CPU(如8051)將振蕩周期分為兩個狀態(高電平與低電平),每個狀態周期包含兩個振蕩周期

????????公式為:Tstate?=2×Tosc?;

3、機器周期

????????機器周期:完成一個基本操作(如取指、讀寫內存)所需的時間,由多個狀態周期或振蕩周期組成;1個機器周期=6個狀態周期=12個振蕩周期(以8051為列);? ? ?

????????公式為:Tmachin=6×Tstate?=12×Tosc?

????????作用:CPU執行指令的階段性時間單位,所有指令均由若干機器周期組成。

4、指令周期

?????????指令周期:執行一條完整指令所需要的全部時間,包含取指、解碼、執行等階段。

????????公式為:指令周期=N個機器周期(1<= N <=4)

????????簡單指令(如NOP):1個機器周期

????????復雜指令(如乘法):4個機器周期(8051為例)

例如:外接晶振為12MHZ時,51單片機相關周期的具體值為:

? ? ? ? 振蕩周期:1/12us;

? ? ? ? 狀態周期:1/6us;

? ? ? ? 機器周期:1us;

? ? ? ? 指令周期:1us-4us;


定時器簡介

51單片機定時器原理

定時原理的核心:機器周期與計數頻率;

機器周期:51單片機執行一條單周期指令所需的時間(如12個振蕩周期,假設時鐘頻率為12MHZ時,機器周期為1us);

定時器計數頻率:定時器的計數頻率為機器周期的倒數,即每過一個機器周期,定時器計數值1;公式為:ftimer??=1 / TmachinTmachin=1us,則ftimer?=1MHZ(即每秒計數1000000次)

51單片機定時器工作模式

????????STC89C51RC/RD+系列單片機內部設置的兩個16位定時器/計數器T0和T1都具有計數方式和定時方式兩種工作方式。對每個定時器/計數器(TO和T1),在特殊功能寄存器TMOD中都有一控制位一C/T來選擇T0或T1為定時器還是計數器。定時器/計數器的核心部件是一個加法(也有減法)的計數器,其本質是對脈沖進行計數。只是計數脈沖來源不同:如果計數脈沖來自系統時鐘,則為定時方式,此時定時器/計數器每12個時鐘或者每6個時鐘得到一個計數脈沖,計數值加1;如果計數脈沖來自單片機外部引腳(T0為P3.4,T1為P3.5),則為計數方式,每來一個脈沖加1。

????????51單片機通常有4種工作模式(通過TMOD寄存器配置),常用模式為模式1(16位定時器)和模式2(8位自動重裝)。

????????模式

位數

特點

????????模式0

13位

定時器使用THx的高5位和TLx的低8位(最大計數值8192)

????????模式1

16位

定時器使用THx和TLx組成的16位計數器(最大計數值65536)

????????模式2

8位自動

TLx為8位計數器,溢出后自動將THx的值重裝到TLx(適合固定周期定時)????????

????????模式3

分裂模式

定時器0為8位自動重裝,定時器1停止(僅52系列支持)


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

結構特點:

????????位數:13位(THX的高5位+TLX的低8位)

????????最大計數值:2的13次方=8192

????????寄存器組合:

????????????????THX的高5位(D3~D7)參與計數,TLX的8位全部參與計數

????????????????計數范圍:0x0000-0x1FFF(十六進制)

應用場景:適用于需要較短定時時間(<8192個機器周期)且對精度要求不高的場景。

代碼示例:測量外部脈沖寬度(需結合GATE=1和INTx引腳)。

TMOD = 0x00; // T0模式0(M1=0, M0=0) 
TH0 = 0xF0; // 高5位初值(假設計數16個機器周期) 
TL0 = 0x00; // 低8位初值 
TR0 = 1; // 啟動T0

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

結構特點:

????????位數:16位(THX和TLX各8位)

????????最大計數值:2的16次方=65536

????????寄存器組合:

????????????????THX和TLX共組成16位計數器

????????????????計數范圍:0x0000-0xFFFF

應用場景:最常用模式,適用于需要較長定時時間(如毫秒級、秒級定時)。

代碼示例:LED閃爍(50ms中斷一次)、PWM信號生成(需結合中斷服務程序)。

TMOD = 0x01; // T0模式1(M1=0, M0=1) 
TH0 = 0x3C; // 初值高8位(50ms定時,機器周期1μs) 
TL0 = 0xB0; // 初值低8位 
TR0 = 1; // 啟動T0

3、模式2(8位自動重載定時器 / 計數器)

結構特點:

? ? ? ??位數:8位(僅TLX參與計數,THX為重載值寄存器)

????????最大計數值:2的8次方=256

????????自動重載:

????????????????TLX溢出后,硬件自動將THX的值重裝到TLX,無需軟件干預。

????????????????計數范圍:0x00-0xFF(TLX),重載值由THX設定。

應用場景:適用于需要固定周期中斷的場景(如串口波特率生成、LED呼吸燈)。

代碼示例:生成1kHz PWM信號(周期1ms,需250個機器周期)。

TMOD = 0x02; // T0模式2(M1=1, M0=0) 
TH0 = 0x9C; // 重載值(250個機器周期,對應1ms) 
TL0 = 0x9C; // 初始值(首次計數從0x9C開始) 
TR0 = 1; // 啟動T0

4、模式3(定時器0的分裂模式)

????????結構特點:

????????????????僅支持T0,T1不支持此模式

????????????????分裂為兩個8為計數器:

????????????????TL0:獨立的8位計數器,由TR0控制啟動,使用T0的溢出標志TF0。

????????????????TL1:獨立的8為計數器,由TR1控制啟動(需占用T1的TR1位),使用T1的溢出標志TF1。

應用場景:適用于需要同時控制兩個獨立定時器的場景(如雙通道PWM輸出)。

代碼示例:TL0生成PWM1,TH0生成PWM2(需配合T1的中斷標志)。

TMOD = 0x03; // T0模式3(M1=1, M0=1)
TH0 = 0x3C; // TH0初值(獨立計數器) 
TL0 = 0xB0; // TL0初值(獨立計數器) 
TR0 = 1; // 啟動TL0 
TR1 = 1; // 啟動TH0(需注意:T1的TR1被占用)

定時器模式總結

? ? ? ? 模式

位數

最大計數值

特點

適用場景

????????模式0

13位

8192

結構簡單,計數范圍小

短時間定時、外部信號測量

????????模式1

16位

65536

計數范圍大,精度高

長時間定時、PWM信號生成

????????模式2

8位

256

自動重載,無需軟件干預

固定周期中斷、波特率生成

????????模式3

分裂

2×8位

T0分裂為兩個獨立計數器

多通道定時、雙PWM輸出


定時器寄存器介紹

TMOD(定時器/計數器模式控制寄存器)

功能:控制定時器/計數器的工作模式,分為高四位(控制T1)和低四位(控制T0)

????????位

名稱

功能描述

????????D7

GATE

門控位(T1)。GATE=1時,T1啟動需同時滿足TR1=1且INT1引腳為高電平;GATE=0時,僅TR1控制啟動。

????????D6

C/T

功能選擇位(T1)。C/T=0為定時器模式(對內部時鐘計數),C/T=1為計數器模式(對外部脈沖計數)。

??D5-D4

M1/M0

工作方式選擇位(T1):
-?方式0(00):13位定時器/計數器。
-?方式1(01):16位定時器/計數器。
-?方式2(10):8位自動重載定時器/計數器。
-?方式3(11):僅T0支持,分為兩個8位計數器;T1不支持。

????????D3

GATE

門控位(T0),功能同T1的GATE位。

????????D2

C/T

功能選擇位(T0),功能同T1的C/T位。

? D1-D0

M1/M0

工作方式選擇位(T0),功能同T1的M1/M0位。


TCON(定時器/計數器控制寄存器)

功能:控制定時器/計數器的啟動、停止及溢出標志

名稱

功能描述

D7

TF1

T1溢出標志位。計數溢出時硬件置1,需軟件清零(中斷方式下自動清零)。

D6

TR1

T1運行控制位。TR1=1時啟動T1,TR1=0時停止T1。

D5

TF0

T0溢出標志位,功能同TF1。

D4

TR0

T0運行控制位,功能同TR1。

D3-D0

外部中斷相關位

用于控制外部中斷,與定時器無關。


THx/TLx(定時器高/低8位寄存器)

功能:存儲定時器/計數器的計數值,分為:TH0/TL0對應T0的高8位和低8位。TH1/TL1對應T1的高8位和低8位。


定時器配置

定時器配置步驟:

1、對TMOD寄存器賦值,以確定T0或T1的工作方式(模式)

2、根據所要定時的時間計算初值,并將其寫入TH0、TL0或TH1、TL1

3、如果使用中斷,則對EA開啟總中斷,開啟定時器對應中斷允許位

4、使TR0或TR1置位,啟動定時/計數器定時或計數;

示例:定時50毫秒配置

TMOD=0x01;    //設置定時器TO工作模式為1
/*計算初值步驟為:
第一步、    根據時鐘源頻率計算振蕩周期    1/11.0592us;
第二步、    根際振蕩周期計算出機器周期    12*(1/11.0592)us
第三步、    根據延時時間50ms除以機器周期時間得出要計時為46080次
第四步、    根據定時器模式1計數的最高定時次數65536減去要計時的次數為19456;
第五步、    得到初值為19456轉換為16進制,分別分配給TH0和TL0寄存器上
*/
TH0=0x4c;    
TL0=0x00;
EA=1;        //開啟總中斷
TR0=1;       //開啟TR0寄存器啟動定時器

定時器硬件電路原理圖分析

定時器是MCU內置的功能,在開發板中并沒有電路連接。這里用LED燈模塊電路實現500毫秒閃爍;

可分析出有8個LED燈分別為D1~D8;LED燈左側連接高電平VCC,LED燈右側連接排阻在連接51單片機的P20~P27編號引腳;51單片機P20~P27編號引腳分別對應51芯片P2.0引腳~P2.7引腳;所以要得LED燈點亮電路中51單片機P2.0引腳~P2.7引腳輸出低電平形成電勢差;

定時器模塊軟件編程設計

實現定時器定時500毫秒LED燈實現閃爍

第一步:首先進行定時器配置,并且封裝成函數;

第二步:在主函數中實現定時器的判斷并且進行對應的操作

代碼示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define LED P2		//LED燈宏定義
void TIM0_Init(void)//函數封裝:定時器0初始化,定時時間為50毫秒
{TMOD=0x01;		//開啟定時器0的模式1:16位定時TH0=0x4C;		//初值高八位存放0x4cTL0=0x00;		//初值第八位存放0x00TR0=1;			//開啟定時器0
}
int main()
{u16 i=0;		//記錄延時次數TIM0_Init();	//定時50毫秒定時器0配置LED=0x00;		//LED燈初始化為點亮while(1){if(TF0)		//定時器時間到{TF0=0;		//軟件清0TH0=0x4C;	//高八位存放0x4cTL0=0x00;	//第八位存放0x00i++;	  	}if(i==10){i=0;		//次數到,清零重新計數LED=~LED;	//LED燈翻轉實現閃爍}}
}

實現定時器定時500毫秒LED燈閃爍(要求:中斷方式實現)

第一步:首先進行定時器配置,并且封裝成函數;

第二步:創建定時器中斷服務函數

第三步:在主函數中進行定時器配置函數等申明

代碼示例:

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
#define LED P2		//LED燈宏定義
void TIM0_Init(void)//函數封裝:定時器0初始化,定時時間為50毫秒
{TMOD=0x01;		//開啟定時器0的模式1:16位定時TH0=0x4C;		//初值高八位存放0x4cTL0=0x00;		//初值第八位存放0x00ET0=1;			//開啟定時器0中斷EA=1;			//開啟總中斷TR0=1;			//開啟定時器0
}
void TIM0_ET0()	interrupt 1
{static u8 i=0;TF0=0;			//軟件清零TH0=0x4C;		//初值高八位存放0x4cTL0=0x00;		//初值第八位存放0x00i++;if(i==10){LED=~LED;i=0;}	}	
int main()
{TIM0_Init();while(1){}
}

定時器定時500毫秒LED燈實現閃爍效果展示
?

定時器模塊實現定時500毫秒LED燈閃爍


制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94514.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

7.Kotlin的日期類

以下是 Kotlin 中常用時間類&#xff08;基于 java.time 包&#xff09;的核心方法及使用示例&#xff0c;參考數組方法的表格形式&#xff0c;按類分類展示&#xff1a; 一、LocalDate&#xff08;日期&#xff1a;年/月/日&#xff09;方法簽名返回值說明示例now(): LocalDat…

【Big Data】Hive技術解析:大數據倉庫的SQL橋梁

Hive作為Apache頂級項目&#xff0c;是Hadoop生態系統中最具影響力的SQL查詢引擎&#xff0c;它解決了大數據處理與傳統SQL技能之間的鴻溝。Hive的核心價值在于將類SQL查詢語言HiveQL無縫轉換為分布式計算框架MapReduce的任務&#xff0c;使數據分析師能夠利用熟悉的SQL語法操作…

Ubuntu2204server系統安裝postgresql14并配置密碼遠程連接

前言&#xff1a; 最近因項目需要安裝postgresql14&#xff0c;系統是ubuntu2204server系統&#xff0c;安裝好后發現無法實現遠程連接&#xff0c;解決了之后在此記錄一下解決方法。 疑問&#xff1a; 什么情況下需要配置postgresql遠程連接&#xff1f; ①如果是postgresql和…

【嵌入式】【搜集】狀態機、狀態遷移圖及狀態模式材料

文章目錄狀態機狀態機狀態機定義與核心特點狀態機總結狀態遷移圖狀態遷移圖狀態遷移圖核心概念與要素狀態遷移圖常見錯誤與規避狀態遷移圖總結狀態模式狀態模式狀態模式核心概念與組成狀態模式核心價值與適用場景狀態模式優缺點分析進階優化技巧行為模式總結狀態機 狀態機 狀…

Java學習歷程14——制作一款五子棋游戲(4)

上次我們基本實現了五子棋游戲的功能&#xff0c;這次我們進行一些優化和添加一些便于用戶使用的功能。新增功能及優化一、復盤功能復盤功能就是指在下完一局棋后&#xff0c;我們可以通過復盤按鈕使本局棋的所有棋子重頭開始自動下一遍。分析得知&#xff0c;我們首先要保存以…

記錄一次el-table+sortablejs的拖拽bug

bug回顧出現bug的情況時 當編輯表格過于緊湊的時候 有些非必要編輯或需要一眼看到的數據 移動到了el-table-column typeexpand時 同事&#xff1a;怎么拖拽功能用不了了 ok開始檢查代碼 當原來是個簡單的編輯表格 不涉及展開和簡單拖拽時 不會出現問題 解決了 出現了展開行以后…

利用go sort.Sort()排序自定義切片

1 sort.Sort()簡介2 核心功能3 調用前提4 代碼示例 1 sort.Sort()簡介 Go語言中的sort.Sort函數是標準庫提供的通用排序接口 2 核心功能 核心功能支持多種類型進行快速排序 基礎類型支持?&#xff1a;內置Ints、Float64s、Strings等函數直接排序常見切片 自定義排序?&a…

Elasticsearch腦裂緊急處理與預防

在 Elasticsearch 中出現 網絡分區&#xff08;Network Partition&#xff09; 或 腦裂&#xff08;Split-Brain&#xff09; 導致兩個子集群各自選出 Master 的情況&#xff0c;是非常嚴重的問題。比如這個場景&#xff08;20個節點分裂成兩個10節點的子集群&#xff0c;各自選…

華為網路設備學習-29(BGP協議 四)路由策略-實驗

示例 延伸-具體實驗1.代碼部分&#xff1a;基礎配置R1 [Huawei]int GigabitEthernet 0/0/0 [Huawei-GigabitEthernet0/0/0]ip address 10.1.13.1 24[Huawei]int LoopBack 1 [Huawei-LoopBack1]ip address 172.16.1.1 24 [Huawei-LoopBack1]q [Huawei]int LoopBack 2 [Huawei-Lo…

500系列狀態碼與可能的場景

501 Not Implemented&#xff08;未實現&#xff09;HTTP 方法不支持客戶端發送了 PUT、DELETE、PATCH 請求但服務器只實現了 GET 和 POST協議功能不支持客戶端使用了 HTTP/2 的某些高級特性服務器只支持 HTTP/1.1&#xff0c;無法處理&#xff0c;返回 501API 接口未完成開發中…

大數據、hadoop、爬蟲、spark項目開發設計之基于數據挖掘的交通流量分析研究

大數據、hadoop、爬蟲、spark項目開發設計之基于數據挖掘的交通流量分析研究

Pytest項目_day20(log日志)

Log日志優點&#xff1a;記錄程序運行信息&#xff0c;方便定位問題python日志模塊logging&#xff0c;日志等級如下&#xff1a; DEBUGINFO&#xff08;正常&#xff09;WARNINGERROR&#xff08;報錯&#xff09;示例代碼如下&#xff1a;import logging import os.path impo…

elasticsearch中的分詞器配置及使用

一、什么是分詞器&#xff1f; 在 Elasticsearch&#xff08;ES&#xff09;中&#xff0c;分詞器&#xff08;Analyzer&#xff09; 是處理文本的核心組件&#xff0c;負責將原始文本轉換為可搜索的索引詞&#xff08;Term&#xff09;。它是文本分析過程的核心&#xff0c;直…

《Linux 網絡編程二:UDP 與 TCP 的差異、應用及問題應對》

一、UDP 與 TCP 對比表對比項UDPTCP連接方式無需建立連接有連接&#xff08;三次握手建立&#xff0c;四次揮手斷開&#xff09;傳輸可靠性盡最大努力交付&#xff0c;可能丟包安全可靠的數據傳輸機制面向對象面向數據包面向數據流傳輸模式一對一、一對多傳輸本質一對一&#x…

uniapp 頁面跳轉及字符串轉義

1. uniapp 頁面跳轉及字符串轉義 1.1. uniapp頁面跳轉方法 在uniapp中,頁面跳轉可以通過多種方式進行,包括但不限于路由跳轉和頁面間事件通信。 ??一. 路由跳轉 ??在uniapp中,路由跳轉是指通過改變頁面url的方式來跳轉到不同的頁面。uni-app提供了一套路由跳轉的API,包…

Vue中 this.$emit() 方法詳解, 幫助子組件向父組件傳遞事件

this.$emit()是 Vue.js 中一個很有用的方法,可以幫助子組件向父組件傳遞事件1、原理說明&#xff1a;在Vue中&#xff0c;this.$emit()方法用于觸發自定義事件。它是Vue實例的一個方法&#xff0c;可以在組件內部使用。使用 this.$emit() 方法&#xff0c;可以向父組件發送自定…

BUCK電路的環路補償

芯片的COMP腳是用來設計環路補償用的&#xff0c;它給芯片內部的誤差放大器的輸出和PWM控制器輸入做補償&#xff0c;如果環路補償設計得不好&#xff0c;會更容易引起環路的不穩定或振蕩&#xff0c;也可能導致輸出電壓異常。環路補償涉及三個指標&#xff1a;剪切頻率&#x…

Hyperledger Fabric官方中文教程-改進筆記(十六)-策略(policy)

本Fabric中文文檔專欄的閱讀前言&#xff1a;前言 文章目錄什么是策略為什么需要策略策略如何實現訪問控制列表 (ACLs)智能合約背書政策修改策略如何在 Fabric 中編寫策略Signature policiesImplicitMeta policies例子: 通道配置策略Organizations 部分Application部分Fabric 鏈…

Flutter性能優化完全指南:構建流暢應用的實用策略

Flutter性能優化完全指南&#xff1a;構建流暢應用的實用策略 探索從UI構建到內存管理的全方位優化技巧&#xff0c;打造如絲般順滑的Flutter體驗 引言 在跨平臺開發領域&#xff0c;Flutter以其出色的性能表現脫穎而出。然而&#xff0c;正如任何強大的框架一樣&#xff0c;不…

jvm對象內存占用

歡迎訪問我的主頁: https://heeheeaii.github.io/ 在Java虛擬機&#xff08;JVM&#xff09;中&#xff0c;一個對象在內存中的存儲布局可以分為三個部分&#xff1a;對象頭&#xff08;Object Header&#xff09;、實例數據&#xff08;Instance Data&#xff09;和對齊填充…