⑴ 51系列單片機定時/計數器初始化的四個步驟
1、設置寄存器TMOD
2、計算初始值
3、開放中斷
4、啟動定時器
⑵ 怎樣使用51單片機的定時器
51單片機定時器的使用
51單片機定時器/計時器的使用
步驟:
1、 打開中斷允許位:
對IE寄存器進行控制,IE寄存器各位的信息如下圖所示:
EA: 為0時關所有中斷;為1時開所有中斷
ET2:為0時關T2中斷;為1時開T2中斷,只有8032、8052、8752才有此中斷 ES: 為0時關串口中斷;為1時開串口中斷 ET1:為0時關T1中斷;為1時開T1中斷 EX1:為0時關1時開 ET0:為0時關T0中斷;為1時開T0中斷 EX0:為0時關1時開
2、 選擇定時器/計時器的工作方式:
定時器TMOD格式
CPU在每個機器周期內對T0/T1檢測一次,但只有在前一次檢測為
1和後一次檢測為0時才會使計數器加1。因此,計數器不是由外部時鍾負邊沿觸發,而是在兩次檢測到負跳變存在時才進行計數的。由於兩次檢測需要24個時鍾脈沖,故T0/T1線上輸入的0或1的持續時間不能少於一個機器周期。通常,T0或T1輸入線上的計數脈沖頻率總小於100kHz。
方式0:定時器/計時器按13位加1計數,這13位由TH中的高8位和TL中的低5位組成,其中TL中的高3位棄之不用(與MCS-48兼容)。
13位計數器按加1計數器計數,計滿為0時能自動向CPU發出溢出中斷請求,但要它再次計數,CPU必須在其中斷服務程序中為它重裝初值。
方式1:16位加1計數器,由TH和TL組成,在方式1的工作情況和方式0的相同,只是計數器值是方式0的8倍。
1
1/3
方式2:計數器被拆成一個8位寄存器TH和一個8位計數器TL,CPU對它們初始化時必須送相同的定時初值。當計數器啟動後,TL按8位加1計數,當它計滿回零時,一方面向CPU發送溢出中斷請求,另一方面從TH中重新獲得初值並啟動計數。
方式3:T0和T1工作方式不同,TH0和TL0按兩個獨立的8位計數器工作,T1隻能按不需要中斷的方式2工作。 在方式3下的TH0和TL0是有區別的:TL0可以設定為定時器/計時器或計數器模式工作,仍由TR0控制,並採用TF0作為溢出中斷標志;TH0隻能按定時器/計時器模式工作,它借用TR1和TF1來控制並存放溢出中斷標志。因此,T1就沒有控制位可以用了,故TL1在計滿回零時不會產生溢出中斷請求的。 顯然,T0和T1設定為方式3實際上就相當於設定了3個8位計數器同時工作,其中TH0和TL0為兩個由軟體重裝的8位計數器,TH1和TL1為自動重裝的8位計數器,但無溢出中斷請求產生。由於TL1工作於無中斷請求狀態,故用它來作為串口可變波特
3、 為計數器賦值
計數器初值計算
TC=M−C
TC:計數器初值,M:計數器模值(2k),C:把計數器計滿的計數值 定時器初值計算
T=(M−TC)T計數
或
TC=M−T/𝑇計數
M:模值,T計數:單片機時鍾周期TCLK(ΦCLK的倒數)的12倍;TC為定時器的定時初值,T為欲定時的時間。
TC=M−T×𝛷𝐶𝐿𝐾/12
M:模值,ΦCLK:單片機時鍾周期ΦCLK;TC為定時器的定時初值,T為欲定時的時間。 例如:單片機主脈沖頻率ΦCLK為12MHz,最大定時時間為: 方式0時 TMAX = 213×1us = 8.192ms 方式1時 TMAX = 216×1us = 65.536ms 方式2和方式3 TMAX = 28×1us = 0.256ms
4TR0:為0時,停T0計數;為1時,啟T0計數
2
2/3
TF0:為0時,無T0中斷(硬體復位);為1時,有T0溢出中斷 TR1:為0時,停T1計數;為1時,啟T1計數 TF1:為0時,無T1中斷(硬體復位);為1時,有T1溢出中斷 IE1:為0時,硬體復位;為1時 IT1:為0時,INT1電平觸發(軟體復位);為1時,INT1負邊沿觸發 IE0:為0時,硬體復位;為1時 IT0:為0時,INT0電平觸發(軟體復位);INT0負邊沿觸發
5
在C51的C語言中使用interrupt x來指定中斷入口地址,x為中斷號,例T0中斷: void Time0_Int() interrupt 1 //定時器T0的中斷入口程序
⑶ 單片機定時器實驗.
你的注釋有的有錯誤,現重新更正如下
ORG 0000H
AJMP START
ORG 001BH ;外中斷1入口地址
AJMP INT_T1
ORG 0100H
START:
MOV SP,#60H;設置堆棧深度
MOV TMOD,#10H ;置T1為方式1
MOV TL1,#00H ;延時50mS的時間常數
MOV TH1,#4BH
MOV R0,#00H;表格計數器
MOV R1,#20;1s計數器即20*50ms=1000ms=1s,得到所需要定時時間1s
SETB TR1;打開定時器1
SETB ET1:允許定時器1中斷
SETB EA ;開總中斷
SJMP $:等待
INT_T1: ;T1中斷服務子程序
PUSH ACC ;保護現場
PUSH PSW
PUSH DPL
PUSH DPH
CLR TR1 ;關定時器
MOV TL1,#00H ;重新載入計數初值
MOV TH1,#4BH
SETB TR1 ;再次打開定時器
DJNZ R1,EXIT;判斷是否到達20個50ms,如果沒有則繼續循環
MOV R1,#20 ;重新載入1s計數值
MOV DPTR,#DATA ;置常數表首地址 MOV A,R0 ;置常數表偏移量
MOVC A,@A+DPTR ;讀常數表
MOV P1,A ;這里中的A決定是什麼花色,也就是顯示什麼
INC R0;指向下一個數
ANL 00,#07H;
EXIT:
POP DPH ;恢復現場
POP DPL
POP PSW
POP ACC
RETI
LED顯示常數表
DATA: DB 0FAH,0F5H,0AFH,05FH,0AAH,55H,00H,0FFH
END
總的來說顯示什麼樣的花色是由你提前計算好,然後將對應的值放入表格中。比方說,你的led是共陰極接法,那麼你要L1和L3亮就要給p1口送00000110B,這個值放到表格中等你用的時候從表格中取出來就行了
⑷ 單片機定時器的使用方法
第一步:設置特殊功能寄存器 TMOD,配置好工作模式。
第二步:設置計數寄存器 TH0 和 TL0 的初值。
第三步:設置 TCON,通過 TR0 置 1 來讓定時器開始計數。
第四步:判斷 TCON 寄存器的 TF0 位,監測定時器溢出情況。
寫程序之前,我們要先來學會計算如何用定時器定時時間。我們的晶振是 11.0592M,時鍾周期就是 1/11059200,機器周期是 12/11059200,假如要定時 20ms,就是 0.02 秒,要經過x 個機器周期得到 0.02 秒,我們來算一下 x*12/11059200=0.02,得到 x= 18432。16 位定時器的溢出值是 65536(因 65535 再加 1 才是溢出),於是我們就可以這樣操作,先給 TH0 和 TL0一個初始值,讓它們經過 18432 個機器周期後剛好達到 65536,也就是溢出,溢出後可以通過檢測 TF0 的值得知,就剛好是 0.02 秒。那麼初值 y = 65536 - 18432 = 47104,轉成 16 進制就是 0xB800,也就是 TH0 = 0xB8,TL0 = 0x00。
這樣 0.02 秒的定時我們就做出來了,細心的同學會發現,如果初值直接給一個 0x0000,一直到 65536 溢出,定時器定時值最大也就是 71ms 左右,那麼我們想定時更長時間怎麼辦呢?用你小學學過的邏輯,倍數關系就可以解決此問題。
好了,我們下面就用程序來實現這個功能。
#include
sbit LED = P0^0;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main(){
unsigned char cnt = 0; //定義一個計數變數,記錄 T0 溢出次數
ENLED = 0; //使能 U3,選擇獨立 LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01; //設置 T0 為模式 1
TH0 = 0xB8; //為 T0 賦初值 0xB800
TL0 = 0x00;
TR0 = 1; //啟動 T0
while (1){
if (TF0 == 1){ //判斷 T0 是否溢出
TF0 = 0; //T0 溢出後,清零中斷標志
TH0 = 0xB8; //並重新賦初值
TL0 = 0x00;
cnt++; //計數值自加 1
if (cnt 》= 50){ //判斷 T0 溢出是否達到 50 次
cnt = 0; //達到 50 次後計數值清零
LED = ~LED; //LED 取反:0--》1、1--》0
}
}
}
}
程序中都寫了注釋,結合前幾章學的內容,自己分析一下,不難理解。本程序實現的結果是開發板上最右邊的小燈點亮一秒,熄滅一秒,也就是以 0.5Hz 的頻率進行閃爍
⑸ 51單片機的3個定時器怎樣使用
51單片機只有T0,T1。52才有T2的。
定時器設置方法:
做定時用一般採用16位模式,也就是TMOD=0x11(10或01單獨一個定時器的話),初值的計算是這樣的:
假設時間是X毫秒,晶振為YMhz,那麼:
THn=(65536-1000*X*Y/12)/256
TLn=(65536-1000*X*Y/12)%256
之後就是TRn=1(開啟定時器)
ETn=1(開啟定時器中斷)
EA=1
⑹ 單片機c語言里怎麼用2個定時器
有幾個步驟。
首先說明一下幾個和定時器有關的寄存器。
第一,方式控制寄存器TMOD,地址89H,不可位定址,這個寄存器可以對定時器的工作方式進行設置。
第二,TCON寄存器,地址88H,可以位定址,控制寄存器的開啟關閉,寄存器的溢出標志也在這個寄存器中。
第三,中斷控制寄存器IE,用來控制各中斷的開啟或關閉。
現在開始介紹2個定時器的用法
1。設置TMOD
2。分別給兩個定時器賦初值
3。開中斷
4。開啟定時器
5。設置循環語句等待中斷
下面舉一個例子:
#include
void
main(void)
{
TMOD=0x01;//前四位控制t1,後四位控制t0
TH0=0x00;//賦初值
TL0=0x00;
TH1=0x43;
TL1=0x32;
EA=1;//開總中斷
ET0=1;//開t0中斷
ET1=1;//開t1中斷
TR0=1;//開啟定時器t0
TR1=1;//開啟定時器t1
while(1)//等待中斷
{
}
}
⑺ 51單片機中用定時器定時1毫秒,怎麼編寫
假設晶振為12MHz,不用中斷時程序語句如下:
TMOD=0x01;//定時器0工作方式1
TH0=(65536-1000)/256;//裝入初值
TL0=(65536-1000)%256;
TF0=0;//清溢出標志;
TR0=1;//啟動定時器0
while(TF0==0);//等待定時時間到
TR0=0;
TF0=0;