1. 怎樣使用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的中斷入口程序
2. 51單片機定時器的使用
51單片機定時器的GATE=1時,用外部INT0啟動定時器,當INT0=0時,
定時器T1會停止計數,這個時候讀取T1的值是可以計算出高電平的寬度的。
3. 51單片機定時功能如何實現
#include"reg51.h"
#define
uchar
unsigned
char
#define
uint
unsigned
int
/**************初始化程序****************/
void
initiation()
{
TMOD=0x11;
//設定計數方式等
TH0=-10000/256;
TL0=-10000%256;
//10MS定時初值(T0計時用)
TH1=-25000/256;
TL1=-25000%256;
//25MS定時初值(T1計時用)
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
/****************定時器0中斷服務程序*****/
void
init_timer0(void)
interrupt
1
{
TH0=-10000/256;
TL0=-10000%256;
//10MS定時初值(T0計時用)
//下面寫用戶程序
}
/****************定時器1中斷服務程序*****/
void
init_timer1(void)
interrupt
3
{
TH1=-25000/256;
TL1=-25000%256;
//50MS定時初值(T1計時用)
//下面寫用戶程序
}
/****************主程序******************/
main()
{
initiation();
while(1)
{
;
}
}
4. 51單片機定時器使用
51單片機定時器GATE=1時用外部INT0啟動定時器當INT0=0時
定時器T1會停止計數時候讀取T1值計算出高電平寬度
5. 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
6. 51單片機的定時器是怎麼設置的
單片機定時器的設置步驟為:
1、設置定時器的工作模式,共4種工作方式,兩種模式(計數器/定時器)。比如:
MOV TMOD,#01;設置定時器0位定時器模式,工作方式1
2、根據定時時間賦初值。比如定時10毫秒,那麼如果12M晶振的話是10000個機器周期。定時器是溢出申請中斷,所以用溢出值減去定時周期為初值。
MOV TH0,#HIGH(65536-10000)
MOV TL0,#LOW(65536-10000)
3、開啟中斷、定時器。
SETB ET0
SETB EA
SETB TR0
7. 時鍾頻率為12MHZ, 如何利用51單片機定時/計數器定時500ms
我說一下原理
12MHZ的51單片機,定時器最大隻能定時65.535ms,所以要定時500ms的時間,
需要產生10次50ms的定時。
步驟如下:
1、每隔50ms定時器中斷溢出,計數+1。
2、當計數達到10次時,便產生了500ms的定時啦,然後,你自己根據你的設計,需要讓單片機做什麼就自己寫些什麼(比如讓某個io口取反)
3、計數達到10次後,不要忘了初始化計數。
最後給點建議:1、要讓定時器計數50ms,只能在定時器的工作方式1下進行;
2、定時器初值: TH0 = 0x3C; TL0 = 0x0B0;(我使用的是定時器0)
思路和原理都給你了,只要你看懂了,想讓計時器計時多少s都如魚得水。
8. 51單片機中的定時器中斷是怎麼用的
代碼如下:
//實現led燈一秒亮滅閃爍
void main()
{
TMOD=0x01;//設置定時器0為工作方式1(M1 M0為01)
TH0=(65536-45872)/256;//裝初值11.0582晶振定時50ms數為45872
TL0=(65536-45872)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
while(1);//程序停止在這里等待中斷發生
}
void T0_time() interrupt 1
{
TMOD=0x01;//重裝初值
TH0=(65536-45872)/256;
num++;//num每加一次判斷一次是否到20次
if(num==20)//如果到了20次,說明1秒時間到
{
num=0;//num清0重新計數
led=~led1;
}
}
(8)巧用51單片機定時器擴展閱讀
定時器有兩種工作模式,分別為計數模式和定時模式。對Px,y的輸入脈沖進行計數為計數模式。定時模式,則是對MCU的主時鍾經過12分頻後計數。因為主時鍾是相對穩定的,所以可以通過計數值推算出計數所經過的時間。
51單片機計數器的脈沖輸入腳。主要的脈沖輸入腳有Px,y, 也指對應T0的P3.4和對應T1的P3.5,主要用來檢測片外來的脈沖。而引腳18和19則對應著晶振的輸入脈沖,脈沖的頻率和周期為
F = f/12 = 11.0592M/12 = 0.9216MHZ T = 1/F = 1.085us
51計數器的計數值存放於特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C),T1(TL1-0x8B, TH1-0x8D)
定時器常用作定時時鍾,以實現定時檢測,定時響應、定時控制,並且可以產生ms寬的脈沖信號,驅動步進電機。定時和計數的最終功能都是通過計數實現,若計數的事件源是周期固定的脈沖則可實現定時功能,否則只能實現計數功能。因此可以將定時和計數功能全由一個部件實現。