1.定時(shí)器的作用和意義
什么是定時(shí)器:定時(shí)器-與非網(wǎng)
上節(jié)課的一段代碼:
while(1)
{
TimeCount++;
delay_ms(1);
}
TimeCount++然后一個(gè)延時(shí)1毫秒,每運(yùn)行1ms,變量就會(huì)加一。
系統(tǒng)已經(jīng)運(yùn)行了多少個(gè)毫秒。
實(shí)際使用時(shí)的代碼如下,
while(1)
{
TimeCount++;
delay_ms(1);
if (KEY1 == 0)
{
delay_ms(10);
if (KEY1 == 0)
{
while(KEY1 == 0);
}
}
}
判斷按鍵有沿有按下的時(shí)候,我們等待按鍵松開,還有一個(gè)while循環(huán)。
如果沒有松開,會(huì)一直死在這一行。所以,按下的時(shí)間段內(nèi),TimeCount++沒有在執(zhí)行,變量不會(huì)動(dòng)。
那么像這樣while函數(shù)在不斷循環(huán)執(zhí)行的時(shí)候,能不能有辦法讓這個(gè)變量每隔1ms能自動(dòng)加一,并且不受while循環(huán)的影響呢?
引入:中斷的概念
如果中斷不發(fā)生,就會(huì)一直執(zhí)行主程序(主函數(shù))。但是,如果中斷發(fā)生了,先會(huì)進(jìn)行這個(gè)中斷的處理函數(shù)
處理完后,從中斷返回,再繼續(xù)執(zhí)行主程序(之前沒有完成的一個(gè)人任務(wù))。
定時(shí)器中斷
定時(shí)一定時(shí)間之后產(chǎn)生的中斷,也就是定時(shí)器中斷。
主程序:你在背書
中斷:媽媽讓你五分鐘以后看一下鍋里的湯有沒有燒干,一個(gè)定時(shí)器中斷的一個(gè)例子。
定時(shí)器是定時(shí)器和計(jì)數(shù)器的統(tǒng)稱。
1)設(shè)置為定時(shí)器時(shí),可實(shí)現(xiàn)硬件計(jì)時(shí),或者使程序每隔一固定時(shí)間完成一項(xiàng)操作;
2)設(shè)置為計(jì)數(shù)器時(shí)候能夠?qū)γ}沖進(jìn)行計(jì)數(shù);
3)替代長(zhǎng)時(shí)間的delay,提高CPU的運(yùn)行效率和處理速度,能及時(shí)的響應(yīng)某個(gè)事件。
2.STC32G單片機(jī)定時(shí)器使用原理
T0實(shí)現(xiàn)1ms中斷
手冊(cè)原文:
定時(shí)器/計(jì)數(shù)器(24位定時(shí)器,8位預(yù)分頻14+16位自動(dòng)重裝載)
STC32G系列單片機(jī)內(nèi)部設(shè)置了5個(gè)24位定時(shí)器/計(jì)數(shù)器(8位預(yù)分頻+16位計(jì)數(shù))。5個(gè)16位定時(shí)器T0、T1、T2、T3和T4都具有計(jì)數(shù)方式和定時(shí)方式兩種工作方式。對(duì)定時(shí)器/計(jì)數(shù)器TO和T1,用它們?cè)谔厥夤δ芗拇嫫鱐MOD中相對(duì)應(yīng)的控制位CT來選擇TO或T1為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器T2,用特殊功能寄存器AUXR中的控制位T2_C/T來選擇T2為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器T3,用特殊功能寄存器T4T3M中的控制位T3_C/T來選擇T3為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器
T4,用特殊功能寄存器T4T3M中的控制位T4_C/T來選擇T4為定時(shí)器還是計(jì)數(shù)器。定時(shí)器/計(jì)數(shù)器的核心部件是一個(gè)加法計(jì)數(shù)器,其本質(zhì)是對(duì)脈沖進(jìn)行計(jì)數(shù)。只是計(jì)數(shù)脈沖來源不同:如果計(jì)數(shù)脈沖來自系統(tǒng)
時(shí)鐘,則為定時(shí)方式,此時(shí)定時(shí)器/計(jì)數(shù)器每12個(gè)時(shí)鐘或者每1個(gè)時(shí)鐘得到一個(gè)計(jì)數(shù)脈沖,計(jì)數(shù)值加1;如果計(jì)數(shù)脈沖來自單片機(jī)外部引腳,則為計(jì)數(shù)方式,每來一個(gè)脈沖加1。
當(dāng)定時(shí)器/計(jì)數(shù)器TO、T1及T2工作在定時(shí)模式時(shí),特殊功能寄存器AUXR中的TOx12、T1x12和T2x12分別決定是系統(tǒng)時(shí)鐘/12還是系統(tǒng)時(shí)鐘/1(不分頻〉后讓TO、T1和T2進(jìn)行計(jì)數(shù)。當(dāng)定時(shí)器/計(jì)數(shù)器T3和T4工作在定時(shí)模式時(shí),特殊功能寄存器T4T3M中的T3x12和T4x12分別決定是系統(tǒng)時(shí)鐘/12還是系統(tǒng)時(shí)鐘/1(不分頻〉后讓T3和T4進(jìn)行計(jì)數(shù)。當(dāng)定時(shí)器/計(jì)數(shù)器工作在計(jì)數(shù)模式時(shí),對(duì)外部脈沖計(jì)數(shù)不分頻。
定時(shí)器/計(jì)數(shù)器0有4種工作模式:模式0(16位自動(dòng)重裝載模式)﹐模式1(16位不可重裝載模式),模式2(8位自動(dòng)重裝模式),模式3(不可屏蔽中斷的16位自動(dòng)重裝載模式)。定時(shí)器/計(jì)數(shù)器1除模式3外,其他工作模式與定時(shí)器/計(jì)數(shù)器О相同。T1在模式3時(shí)無效,停止計(jì)數(shù)。定時(shí)器T2的工作模式固定為16位自動(dòng)重裝載模式。T2可以當(dāng)定時(shí)器使用,也可以當(dāng)串口的波特率發(fā)生器和可編程時(shí)鐘輸出。定時(shí)器3、定時(shí)器4與定時(shí)器T2一樣,它們的工作模式固定為16位自動(dòng)重裝載模式。T3/T4可以當(dāng)定時(shí)器使用,也可以當(dāng)串口的波特率發(fā)生器和可編程時(shí)鐘輸出。
2.1 先設(shè)置功能為定時(shí)器/計(jì)數(shù)器(本質(zhì)都是加法計(jì)數(shù)器)
STC32G系列單片機(jī)內(nèi)部設(shè)置了5個(gè)24位定時(shí)器/計(jì)數(shù)器(8位預(yù)分頻+16位計(jì)數(shù))。5個(gè)16位定時(shí)器T0、T1、T2、T3和T4都具有計(jì)數(shù)方式和定時(shí)方式兩種工作方式。對(duì)定時(shí)器/計(jì)數(shù)器TO和T1,用它們?cè)谔厥夤δ芗拇嫫鱐MOD中相對(duì)應(yīng)的控制位CT來選擇TO或T1為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器T2,用特殊功能寄存器AUXR中的控制位T2_C/T來選擇T2為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器T3,用特殊功能寄存器T4T3M中的控制位T3_C/T來選擇T3為定時(shí)器還是計(jì)數(shù)器。對(duì)定時(shí)器/計(jì)數(shù)器T4,用特殊功能寄存器T4T3M中的控制位T4_C/T來選擇T4為定時(shí)器還是計(jì)數(shù)器。定時(shí)器/計(jì)數(shù)器的核心部件是一個(gè)加法計(jì)數(shù)器,其本質(zhì)是對(duì)脈沖進(jìn)行計(jì)數(shù)。只是計(jì)數(shù)脈沖來源不同:如果計(jì)數(shù)脈沖來自系統(tǒng)時(shí)鐘,則為定時(shí)方式,此時(shí)定時(shí)器/計(jì)數(shù)器每12個(gè)時(shí)鐘或者每1個(gè)時(shí)鐘得到一個(gè)計(jì)數(shù)脈沖,計(jì)數(shù)值加1;如果計(jì)數(shù)脈沖來自單片機(jī)外部引腳,則為計(jì)數(shù)方式,每來一個(gè)脈沖加1。
本節(jié)課主要用T0即timer 0也就是定時(shí)器0來實(shí)現(xiàn)功能。這個(gè)T就是一個(gè)定時(shí)的一個(gè)簡(jiǎn)稱。
以定時(shí)器0/1模式寄存器(TMOD)為例:
T0 C/T:控制定時(shí)器0用作定時(shí)器或計(jì)數(shù)器,清0則用作定時(shí)器(對(duì)內(nèi)部系統(tǒng)時(shí)鐘進(jìn)行計(jì)數(shù)),置1用作
計(jì)數(shù)器(對(duì)引腳TO/P3.4外部脈沖進(jìn)行計(jì)數(shù))。
2.2、在定時(shí)器模式下,設(shè)置不分頻或者12分頻∶
當(dāng)定時(shí)器/計(jì)數(shù)器TO、T1及T2工作在定時(shí)模式時(shí),特殊功能寄存器AUXR中的TOx12、T1x12和T2x12分別決定是系統(tǒng)時(shí)鐘/12還是系統(tǒng)時(shí)鐘/1(不分頻)后讓TO、T1和T2進(jìn)行計(jì)數(shù)。當(dāng)定時(shí)器/計(jì)數(shù)器T3和T4工作在定時(shí)模式時(shí),特殊功能寄存器T4T3M中的T3x12和T4x12分別決定是系統(tǒng)時(shí)鐘/12還是系統(tǒng)時(shí)鐘/1(不分頻)后讓T3和T4進(jìn)行計(jì)數(shù)。當(dāng)定時(shí)器/計(jì)數(shù)器工作在計(jì)數(shù)模式時(shí),對(duì)外部脈沖計(jì)數(shù)不分頻。
定時(shí)方式,此時(shí)定時(shí)器/計(jì)數(shù)器每12個(gè)時(shí)鐘或者每1個(gè)時(shí)鐘得到一個(gè)計(jì)數(shù)脈沖,計(jì)數(shù)值加1; 計(jì)數(shù)差了12倍。
看一下輔助寄存器(AUXR)
用特殊功能寄存器AUXR中的控制位T2_C/T來選擇T2為定時(shí)器還是計(jì)數(shù)器。
默認(rèn)最高位為0:
所以默認(rèn)的頻率是除以12的。
Tips:選擇不分頻還是12分頻
看具體的定時(shí)時(shí)間,如果定時(shí)時(shí)間夠,那就用12分頻。如果不分頻,相當(dāng)于定時(shí)的時(shí)間短一些,但是精度會(huì)更好。
2.3、定時(shí)器的工作模式
16位自動(dòng)重載模式:計(jì)數(shù)可以從0計(jì)數(shù)到65535,16位就是65535,2^16-1=65535。
定時(shí)時(shí)間到了,系統(tǒng)會(huì)把你寫入的定時(shí)時(shí)間重新給他自已裝進(jìn)去。不自動(dòng)重載模式,需要自己手動(dòng)給定定時(shí)時(shí)間。
8位自動(dòng)重載:從0計(jì)數(shù)到255,這就是他的最大值,
不可屏蔽中斷的16位自動(dòng)重載:與模式0相同,不可屏蔽中斷,中斷優(yōu)先級(jí)最高,高于其他所有中斷的優(yōu)先級(jí),并且不可關(guān)閉,可用作操作系統(tǒng)的系統(tǒng)節(jié)拍定時(shí)器,或者系統(tǒng)監(jiān)控定時(shí)器。
這個(gè)中斷只要一旦開啟,他就是最高優(yōu)先級(jí),別的任何的中斷都是不能打斷它的。后期還有串口中斷,外部中斷等等。
今天主要做16位自動(dòng)重載模式的設(shè)置及測(cè)試。
2.4 TCON寄存器設(shè)置
TF0和TR0
TF0:T0溢出中斷標(biāo)志,一定要手動(dòng)給它寫1,不寫1則不能開啟,即不能計(jì)數(shù)。T0被允許計(jì)數(shù)以后,從初值開始加1計(jì)數(shù),當(dāng)產(chǎn)生溢出時(shí),由硬件置“1”TFO,
向CPU請(qǐng)求中斷,一直保持CPU響應(yīng)該中斷時(shí),才由硬件清0(也可由查詢軟件清0)。
TR0:定時(shí)器T0的運(yùn)行控制位。該位由軟件置位和清零,當(dāng)然不清0也沒關(guān)系。當(dāng)GATE (TMOD.3)=0,TRO=1時(shí)就允許TO開
始計(jì)數(shù),TRO=0時(shí)禁止TO計(jì)數(shù)。當(dāng)GATE(TMOD.3)=1,TRO=1且INTO輸入高電平時(shí),才允許TO計(jì)數(shù),TRO=0時(shí)禁止TO計(jì)數(shù)。
2.5中斷使能寄存器(中斷允許位)
回顧一下我們之前的課我們想要P60輸出一個(gè)低電平,我們可以這樣寫:
方法1:P60 = 0;
方法2:P6 = 0XFE; //當(dāng)然最好要寫 P6 &= 0XFE;
比如說我們要設(shè)置ET0等于1:可以直接寫ET0等于1(這樣子更方便而且不會(huì)影響到別的位)
也可以寫IE=0X02
3.定時(shí)器的簡(jiǎn)單應(yīng)用
當(dāng)c/T=0時(shí),多路開關(guān)連接到系統(tǒng)時(shí)鐘的分頻輸出,TO0對(duì)內(nèi)部系統(tǒng)時(shí)鐘計(jì)數(shù),TO工作在定時(shí)方式。當(dāng)
C/T=1時(shí),多路開關(guān)連接到外部脈沖輸入P3.4/T0,即TO工作在計(jì)數(shù)方式。
STC單片機(jī)的定時(shí)器0有兩種計(jì)數(shù)速率:一種是12T模式,每12個(gè)時(shí)鐘加1,與傳統(tǒng)8051單片機(jī)相同;另外一種是1T模式,每個(gè)時(shí)鐘加1,速度是傳統(tǒng)8051單片機(jī)的12倍。TO 的速率由特殊功能寄存器AUXR中的TOx12決定,如果TOx12=0,TO則工作在12T模式;如果TOx12=1,T0則工作在1T模式
定時(shí)器0有兩個(gè)隱藏的寄存器RL_THO和RL_TLO。RL_THO與THO共有同一個(gè)地址,RL_TLO與TLO共有同一個(gè)地址。當(dāng)TRO=0即定時(shí)器/計(jì)數(shù)器О被禁止工作時(shí),對(duì)TLO寫入的內(nèi)容會(huì)同時(shí)寫入RL_TLO,對(duì)THO寫入的內(nèi)容也會(huì)同時(shí)寫入RL_THO。當(dāng)TRO=1即定時(shí)器/計(jì)數(shù)器О被允許工作時(shí),對(duì)TLO寫入內(nèi)容,實(shí)際上不是寫入當(dāng)前寄存器TLO0中,而是寫入隱藏的寄存器RL_TLO中,對(duì)THO寫入內(nèi)容,實(shí)際上也不是寫入當(dāng)前寄存器TH0中,而是寫入隱藏的寄存器RL_THO,這樣可以巧妙地實(shí)現(xiàn)16位重裝載定時(shí)器。當(dāng)讀THO和TLO的內(nèi)容時(shí),所讀的內(nèi)容就是THO和TLO的內(nèi)容,而不是RL_THO和RL_TLO的內(nèi)容。
當(dāng)定時(shí)器О工作在模式0(TMOD[1:0][M1.MO]=00B)時(shí),[THO,TLO]的溢出不僅置位TFO,而且會(huì)自動(dòng)將[RL_THO,RL_TLO]的內(nèi)容重新裝入[THO,TLO]。
當(dāng)TOCLKO/INT_CLKO.0=1時(shí),P3.5/T1管腳配置為定時(shí)器0的時(shí)鐘輸出TOCLKO。輸出時(shí)鐘頻率為TO溢出率/2。
如果C/T=0,定時(shí)器/計(jì)數(shù)器TO對(duì)內(nèi)部系統(tǒng)時(shí)鐘計(jì)數(shù),則:
TO工作在1T模式(AUXR.7/TOx12=1)時(shí)的輸出時(shí)鐘頻率 =(SYsclk)(TMOPS+1)(65536-[RL_THO, RL_TLO])2To工作在12T模式(AUXR.7/TOx12=0)時(shí)的輸出時(shí)鐘頻率-(SYsck)(TMOPS+1)/12/(65536-[RL_THO,RL_TLO])2如果C/T=1,定時(shí)器/計(jì)數(shù)器TO是對(duì)外部脈沖輸入(P3.4/TO)計(jì)數(shù),則:
輸出時(shí)鐘頻率=(To_Pin_CLK)/(65536-[RL_THO,RL_TLO])/2
根據(jù)手冊(cè) 14.5范例程序
14.5.1 定時(shí)器0(模式0一16位自動(dòng)重載),用作定時(shí)
TMOD = 0x00;//模式0,16位自動(dòng)重載模式
TL0=0x66;//65536-11.0592M/12/1000
TH0 = 0xfe;
TR0= 1;//啟動(dòng)定時(shí)器
ET0= 1;//使能定時(shí)器中斷
EA=1;
TMOD = 0x00 查詢手冊(cè),可知,執(zhí)行設(shè)置:
1、16位自動(dòng)重載模式;
2、T0_C/T:控制定時(shí)器0用作定時(shí)器或計(jì)數(shù)器,清0則用作定時(shí)器(對(duì)內(nèi)部系統(tǒng)時(shí)鐘進(jìn)行計(jì)數(shù))
3、TO_GATE:控制定時(shí)器0,當(dāng)GATE=0(TMOD.3)時(shí),如TRO=1,則定時(shí)器計(jì)數(shù)。
定時(shí)時(shí)間:
相關(guān)公式:
TL0 = 0x66;//65536-11.0592M/12/1000
TH0 = 0xfc;
0XFC66對(duì)應(yīng)64614,65536-64614=922,92212(0+1)/(11.0592*1000000)=0.0010004340277778s
約為1ms。
本節(jié)目標(biāo):T0實(shí)現(xiàn)1毫秒的一個(gè)中斷
用上節(jié)課的代碼做模板,編譯運(yùn)行,會(huì)發(fā)現(xiàn)有一個(gè)小bug,每次按key的時(shí)候,數(shù)碼管會(huì)閃一下。
用定時(shí)器就可以把這個(gè)閃的這個(gè)問題給修復(fù)掉。
首先打開stc手冊(cè),14.5節(jié)例程:
右鍵跳轉(zhuǎn)到sys_init()的定義,可以看到,TMOD以前的定義均已有。
直接看到我們最重要的這個(gè)TMOD,一般初始化的代碼放在EA之前.
手冊(cè)中給到是11.0592MHZ時(shí)間,需要改成24MHZ:
根據(jù)前述公式:24000000*0.001/12/(0+1)=2000,改成程序員模式:65536-2000=0XF830,則:
TL0 = 0X30; //計(jì)算出24MB時(shí)鐘下的1ms定時(shí)時(shí)間
TH0 = 0XF8;
打開定時(shí)器,使能定時(shí)器中斷。
STC中斷列表
增加定時(shí)器中斷函數(shù),函數(shù)名按規(guī)定寫,可以自定,但是關(guān)鍵詞interrupt不能少,表示中斷號(hào):
void TM0_Isr() interrupt 1 //定時(shí)器0對(duì)應(yīng)中斷號(hào)1,自動(dòng)找到中斷號(hào),并去執(zhí)行。
把需要的函數(shù)移植到中斷中去,這里只需將數(shù)碼管刷新函數(shù)SEG_Fre()加入到其中,并禁用SEG_Fre()中的延時(shí)語句,將數(shù)碼管刷新代碼也加入:
void TM0_Isr() interrupt 1 //1ms進(jìn)來執(zhí)行一次,無需其他延時(shí),重復(fù)賦值
{
SEG_Fre(); //數(shù)碼管刷新1ms執(zhí)行一次
if( RUN_State==1 ) //開始運(yùn)行后,每隔1ms加1,需要移進(jìn)來
{
TimCount++; //每ms加1,按鍵操作均不影響數(shù)碼管刷新
Show_Tab[4] = TimCount/10000%10;
Show_Tab[5] = TimCount/1000%10+10;
Show_Tab[6] = TimCount/100%10;
Show_Tab[7] = TimCount/10%10; //取10位
}
}
編譯下載,發(fā)現(xiàn)一個(gè)bug,按鍵一直按住不松開時(shí),數(shù)碼管顯示有問題,肯定是按鍵函數(shù)有問題,找一下按鍵部分代碼:
將按鍵部分的刷新代碼刪除,該部分刷新由中斷函數(shù)每ms自動(dòng)執(zhí)行,無需重復(fù)刷新。
再運(yùn)行,數(shù)碼管無閃爍,實(shí)驗(yàn)成功。
4.定時(shí)器的快速使用方法
STC-ISP有專用的定時(shí)器時(shí)間計(jì)算選項(xiàng)卡:
輸入?yún)?shù)后,生產(chǎn)C代碼:
void Timer0_Isr(void) interrupt 1
{
}
void Timer0_Init(void) //1000微秒@24.000MHz
{
AUXR &= 0x7F; //定時(shí)器時(shí)鐘12T模式
TMOD &= 0xF0; //設(shè)置定時(shí)器模式
TL0 = 0x30; //設(shè)置定時(shí)初始值
TH0 = 0xF8; //設(shè)置定時(shí)初始值
TF0 = 0; //清除TF0標(biāo)志
TR0 = 1; //定時(shí)器0開始計(jì)時(shí)
ET0 = 1; //使能定時(shí)器0中斷
}
將初始化函數(shù) Timer0_Init()放在主程序前,并將中斷名稱修改一致:
中斷頻率越低越好?。?/h3>
總結(jié)
1.了解定時(shí)器和定時(shí)器中斷
2.學(xué)會(huì)分析什么時(shí)候該用定時(shí)器
3.熟悉工具并能快速使用定時(shí)器文章來源:http://www.zghlxwxcb.cn/news/detail-704840.html
課后練習(xí):
一、第十課的課后作業(yè)做一個(gè)簡(jiǎn)易時(shí)鐘,在此基礎(chǔ)上將時(shí)鐘改成定時(shí)器驅(qū)動(dòng)。
二、在上述基礎(chǔ)上是增加一個(gè)按鈕,按下一次就可以讓時(shí)間暫停,在按一下時(shí)間又能繼續(xù)走,在按一下再暫停!文章來源地址http://www.zghlxwxcb.cn/news/detail-704840.html
到了這里,關(guān)于學(xué)習(xí)筆記|定時(shí)器|STC中斷|定時(shí)器時(shí)間計(jì)算|STC32G單片機(jī)視頻開發(fā)教程(沖哥)|第十一集:定時(shí)器的作用和意義的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!