本章概述思維導圖:
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 / Tmachin;若Tmachin=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): |
????????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燈閃爍
制作不易!喜歡的小伙伴給個小贊贊!喜歡我的小伙伴點個關注!有不懂的地方和需要的資源隨時問我喲!