天津大學智能車隊階段一第三部分培訓內容主要包括:
1、回顧上節課內容;
2、定時器中斷演示,
3、定時器原理和定時器中斷介紹,
(1)方式0
(2)方式1
(3)方式2
(4)方式3:省略,
1、定時器/計數器意義和作用:
1、時間對于單片機的運行來說非常重要,時鐘信號相當于單片機的心臟,正常情況下單片機的時鐘是穩定不變的,每一句代碼運行的時間也都是固定的(匯編語言),但特殊情況下也可以超頻或者降頻運行,就好比人劇烈運動起來了心臟跳得更快一樣,此時單片機每句代碼運行的時間縮短,表現出來效果就是單片機速度提升了,
2、定時器是單片機集成的一個模塊,跟人在內心默念計時有一定的區別,定時器是獨立于程式的運行的,他只在特定時間到達后發出中斷請求才能打斷主程式的運行,
定時器模塊有兩個功能,一個是定時使用,相當于另外有一個人在數著你的心跳來計時,到達一定時間后告訴你,吸引你的注意力,如果你的定時器中斷允許標志位打開了,你就會被他吸引,也就是主程式被打斷轉去執行中斷服務函式(當然,還有中斷優先級的問題),另一個是計數器,模塊有對應的引腳,該引腳可以輸入脈沖,而模塊可以記錄脈沖個數,脈沖個數到達設定的值也可以產生中斷,
作用:
1、像例程一樣當定時器使用來控制LED燈的亮滅時間,而且不影響主程式的運行,
2、電機測速,位移需要對時間求導,(計數器+定時器)
3、PID演算法的誤差對時間積分,
4、保證系統的控制周期是一定的,對演算法有好處,
5、很多傳感器如超聲波和編碼器輸出信號都是脈沖方波,
2、定時器/計數器的結構

圖中振蕩器(晶振)與(/12)部分構成振蕩器分頻輸入電路,Ti為計數器外部輸入引腳,C/T反為計數器脈沖選擇端,反相器、或門、與門及啟/停電路C構成計數器啟停電路,THi、TLi為加1計數器,TFi為中斷標志位,此外,還涉及一個方式暫存器TMOD和一個8位的控制暫存器TCON,用于選擇、控制及反應定時器/計數器的作業模式、啟動方式及相關引數的狀態,
3、作業原理
定時器/計數器實質上是一個加1計數器,它可以作業于定時器方式,此時輸入脈沖是系統固定的機器周期(晶振脈沖頻率12分頻后是機器周期),也可以作業在計數器模式,此時輸入的脈沖就是外部脈沖,
注意:計數器模式下外部輸入的最高脈沖頻率有限制,因為一個脈沖周期必須要能被單片機檢測至少兩次才能判斷出這個周期里存在跳變沿,
4、作業方式
每個定時器T0和T1都有四種作業方式,分別是方式0,方式1,方式2,方式3.
方式0:(13位計數器最大計數值8192)
1、THi提供高8位,TLi提供低5位(高3位未使用)!
要讀當前計時時間:Time = (THi <<8) +TLi;
2、需要軟體重裝初值,否則下一次計數從0開始,
3、中斷標志位TFi硬體自動清零,
方式1:(16位計數器最大計數值65536)
1、THi提供高8位,TLi提供低8位
2、需要軟體重裝初值,否則下一次計數從0開始,
3、中斷標志位TFi硬體自動清零,
方式2:(8位計數器最大計數值256)
1、TLi用于進行計數作業,THi用于存放計數初值并保持不變,
2、中斷標志位TFi硬體自動清零,
方式3:(8位計數器可用于配置串口波特率)
省略,
5、配置方式
涉及暫存器:TMOD(8位) TCON(8位)
TMOD:

GATE:門控制位,用于啟、停操作方式的選擇,
C/T反:計數器/定時器方式選擇,
M1,M0:模塊作業方式選擇位,
注意:不允許位尋址!!!!
TCON

TFn:溢位中斷標志位,
TRn: 運行控制位(1:啟動定時器,0:關閉定時器)
(低四位是外部中斷的)
可以位尋址,
定時器啟動開關:
GATE為0時:定時器/計數器啟停由TRi的狀態(1/0)來決定,
GATE為1時:定時器/計數器啟停必須有TRi和INTi同時為1才能啟動,(可通過引腳來控制定時器的啟動)
THi
計數暫存器高8位
TLi
計數暫存器低8位
6、計數初值計算
定時方式下:
tOV為所需定時時間:
t
O
V
=
(
2
n
?
N
)
?
t
tOV= (2^{n}-N)*t
tOV=(2n?N)?t
其中t為機器周期:
t
=
12
/
f
o
s
c
t = 12/fosc
t=12/fosc
計數方式下:
N為要求計數的次數:
N
=
2
n
?
X
N = 2^{n} - X
N=2n?X
7、使用定時器/計數器步驟
1、根據需要選擇作業方式(M1,M0)
2、根據需求選擇啟動定時器還是計數器(C/T反),
3、根據需求選擇定時器/計數器啟停方式(GATE),
4、將步驟1、2、3涉及的bit拼成8位長度的數,賦值給TMOD暫存器,
5、(定時器)根據需求和作業方式計算計數暫存器初值,分別賦值給THi和TLi,
6、(計數器)根據需求和作業方式計算計數暫存器初值,分別賦值給THi和TLi,
7、打開定時器中斷:ETi = 1
8、啟動定時器:TRi = 1(根據GATE的值做考慮,見上述)
9、打開全域中斷:EA = 1
10、書寫定時器中斷服務函式(T0中斷號為1,T1中斷號為3)
11、在中斷服務函式里重新賦初值,
(12、在中斷服務函式里清中斷標志位TFi = 0)
例程
#include<reg52.h>
sbit LED=P0^0;
sbit button = P3^2;
int T0_delay = 0;
char button_flag = 0;
void main()
{
TMOD = 0x01; // 0000 0001 方式1
TH0 = 0x00; //2^16×(12 / 11.0592*10^6) 最長定時約為71ms
TL0 = 0x00;
ET0 = 1;
TR0 = 1;
EA =1; //總中斷開關
while(1)
{
if(button == 0 && button_flag == 1)
{
LED=~LED;
button_flag = 0;
}
else if(button == 1)
{
button_flag = 1;
}
}
}
void T0_ISR(void) interrupt 1
{
TF0 = 0;
TH0 = 0x00;
TL0 = 0x00;
T0_delay ++;
if(T0_delay > 50)
{
LED=~LED;
T0_delay = 0;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/244358.html
標籤:其他
