導航:首頁 > 操作系統 > 單片機定時器教程

單片機定時器教程

發布時間:2024-01-18 21:22:35

⑴ 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單獨一個定時器的話),初值的計算是這樣的:

  1. 假設時間是X毫秒,晶振為YMhz,那麼:
    THn=(65536-1000*X*Y/12)/256

    TLn=(65536-1000*X*Y/12)%256

  2. 之後就是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;

閱讀全文

與單片機定時器教程相關的資料

熱點內容
加密的視頻不小心刪除怎麼恢復 瀏覽:464
安卓游戲充錢充錯帳號怎麼辦 瀏覽:203
有什麼是綁定手機號的app 瀏覽:496
phpredis事務 瀏覽:935
陰陽師pad怎麼登錄安卓賬號 瀏覽:734
bitlocker加密後讀取不了 瀏覽:176
演算法設計是指流程圖嗎 瀏覽:168
javaboot如何防止反編譯 瀏覽:118
python復合數據結構視頻 瀏覽:146
培訓學校需要用什麼雲伺服器 瀏覽:721
衛星鍋加密卡那裡收購 瀏覽:58
小米工具文件夾選項在哪裡 瀏覽:55
md5磁碟加密 瀏覽:642
單片機x地址 瀏覽:208
回車鍵失靈運行命令如何使用 瀏覽:984
電腦一鍵解壓縮的軟體 瀏覽:171
怎麼關閉手機通訊錄對外app 瀏覽:370
我的世界如何強行進入一個滿人的伺服器 瀏覽:653
什麼app可以查詢會考成績 瀏覽:389
程序員能創造的價值 瀏覽:261