
STC15W408AS只有定時器0和定時器2,工作工作位定時器或者計數器模式。定時器/計數器的核心部件是一個加法計數器,其本質是對脈沖進行計數。只是計數脈沖來源不同:如果計數脈沖來自系統時鐘,則為定時方式,此時定時器/計數器每12個時鐘或者每1個時鐘得到一個計數脈沖,計數值加1;如果計數脈沖來自單片機外部引腳(T0為P3.4,T1為P3.5,T2為P3.1,T3為P0.7,T4為P0.5),則為計數方式,每來一個脈沖加1。
當定時器/計數器T0、T1及T2工作在定時模式時,特殊功能寄存器AUXR中的T0x12、T1x12和T2x12分別決定是系統時鐘/12還是系統時鐘/1(不分頻)后讓T0、T1和T2進行計數。
定時器/計數器0有4種工作模式:模式0(16位自動重裝載模式),模式1(16位不可重裝載模式),模式2(8位自動重裝模式),模式3(不可屏蔽中斷的16位自動重裝載模式)。定時器T2的工作模式固定為16位自動重裝載模式。T2可以當定時器使用,也可以當串口的波特率發生器和可編程時鐘輸出。
(資料圖片)
TCON為定時器/計數器T0、T1的控制寄存器,同時也鎖存T0、T1溢出中斷源和外部請求中斷源等,TCON格式如下:
TCON : 定時器/計數器中斷控制寄存器 (可位尋址)
TF0:T0溢出中斷標志。T0被允許計數以后,從初值開始加1計數,當產生溢出時,由硬件置“1”TF0,向CPU請求中斷,一直保持CPU響應該中斷時,才由硬件清0(也可由查詢軟件清0)。
TR0: 定時器T0的運行控制位。該位由軟件置位和清零。當GATE(TMOD.3)=0,TR0=1時 就允許T0開始計數,TR0=0時禁止T0計數。當GATE(TMOD.3)=1,TR0=1且INT0輸 入高電平時,才允許T0計數,TR0=0時禁止T0計數。
定時和計數功能由特殊功能寄存器TMOD的控制位C/T進行選擇,TMOD寄存器的各位信息如下表所列。可以看出,2個定時/計數器有4種操作模式,通過TMOD的M1和M0選擇。2個定時/計數器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述。
寄存器TMOD各位的功能描述
STC15系列單片機1T 的8051單片機,為兼容傳統8051,定時器0 , 復位后是傳統8051的速度,即12分頻,這是為了兼容傳統8051。但也可不進行12分頻,通過設置新增加的特殊功能寄存器AUXR,將T0,T1,T2 設置普通111條機器指令執行速度是固定的,快4到24倍,無法改變。
AUXR格式如下:
AUXR : 輔助寄存器
#include "stc15.h"#define uint unsigned intuint t = 0;void main(){ P1M0 = 0x02; P1M1 = 0x00;// 定時器 0 AUXR |= 0x80; // 定時器0 1T模式 TMOD = 0x00; // 定時器模式0 16位自動重載模式 TL0 = 0xAE; TH0 = 0xFB; // 計數值 100us@11.0592MHz TR0 = 1; // 定時器開始計時 ET0 = 1; // 使能定時器1中斷 EA = 1; // 打開總中斷 while (1);}void tm1_isr() interrupt 1{ t = t + 1; if(t >= 100){ // 100 * 100us = 10ms P1.1端口取反輸出 t = 0; P11 = !P11; }}
通過示波器可以測得波形搞好是50Hz,每個周期20ms。
這里有個問題就是定時器的初始值的計算。
定時器定時時長(100us) = SYSclk/(65536 - [TH0,TL0]), SYSclk = 11.0592MHz。
這里計算得到[TH0,TL0] = 64430,轉換為十六進制就是FBAE,則TH0 = FB,TL0 = AE。
#include "stc15.h"void main(){ P1M0 = 0x02; P1M1 = 0x00; P11 = 0; // 初始設置為0 AUXR |= 0x1C; // 定時器2 工作為計數器模式 P3.1為計數引腳 允許計數器運行 T2L = 0x00; T2H = 0x00; while(1) { if(T2L==16) // 計數器到了16 就把P1.1口輸出取反 { T2L=0X00; P11 = !P11; } }}
定時器0個定時器2都可以工作位定時器/計數器模式,這里為了區分就把定時器2作為計數器使用了。
標簽: