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