『壹』 單片機定時器的使用方法
第一步:設置特殊功能寄存器 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單片機的定時器是怎麼設置的
單片機定時器的設置步驟為:
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
『叄』 單片機60秒計時器的程序,用AT89C51實現
//1:用AT89C51單片機的定時/計數器T0產生一秒的
//定時時間,作為秒計數時間,當一秒產生時,秒
//計數加1,秒計數到60時,自動從0開始。單片機
//晶振頻率為12MHZ
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
0x6f};
void display(uchar fen,uchar miao);
uchar a,fen,miao,shu;
void delay(uint z);
void init();
void main()
{
init();
while(1)
{
display(fen,miao);
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
shu++;
fen=shu/10;
miao=shu%10;
if(shu==60)
shu=0;
}
}
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display(uchar fen,uchar miao)
{
P1=0xFe;
P2=table[fen];
delay(5);//延時5毫秒
P1=0xFf;
P2=table[miao];
delay(5);//延時5毫秒
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
『肆』 單片機定時器怎麼實現時間計時越細越好
定時/計數器的實質是加1計數器(16位),由高8位和低8位兩個寄存器組成。TMOD是定時/計數器的工作方式寄存器,確定工作方式和功能;TCON是控制寄存器,控制T0、T1的啟動和停止及設置溢出標志。
加1計數器輸入的計數脈沖有兩個來源,一個是由系統的時鍾振盪器輸出脈沖經12分頻後送來;一個是T0或T1引腳輸入的外部脈沖源。每來一個脈沖計數器加1,當加到計數器為全1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使TCON中TF0或TF1置1,向CPU發出中斷請求(定時/計數器中斷允許時)。如果定時/計數器工作於定時模式,則表示定時時間已到;如果工作於計數模式,則表示計數值已滿。
可見,由溢出時計數器的值減去計數初值才是加1計數器的計數值。
•設置為定時器模式時,加1計數器是對內部機器周期計數(1個機器周期等於12個振盪周期,即計數頻率為晶振頻率的1/12)。計數值N乘以機器周期Tcy就是定時時間t。
『伍』 單片機定時器的作用是什麼啊
單片機定時器的作用:
1,可以虛圓用做精確延時處理,比較差搭塌延時1ms時間。
2,可以當做計數器,比如枝型將這個功能IO口接到一個時鍾源,你可以統計有多少個脈沖信號。
『陸』 在單片機中定時器是用來干什麼的
它的主要功能是在發生軟體故障時,通過使器件復位(如果軟體未將器件清零)將單片機復位。也可以用於將器件從休眠或空閑模式喚醒,看門狗定時器對微控制器提供了獨立的保護系統。
當系統出現故障時,在可選的超時周期之後,看門狗將以RESET信號作出響應,像x25045就可選超時周期為1.4秒、600毫秒、200毫秒三種。當程序死機時,x25045就會使單片機復位。
(6)單片機定時神器擴展閱讀
定時/計數器T0和T1分別是由兩個8位的專用寄存器組成,即定時/計數器T0由TH0和TL0組成,T1由TH1和TL1組成。
此外,其內部還有2個8位的特殊功能寄存器TMOD和TCON,TMOD負責控制和確定T0和T1的功能和工作模式,TCON用來控制T0和T1啟動或停止計數,同時包含定時/計數器的狀態。
TF1:定時器1溢出標志。定時/計數器溢出時由硬體置位。中斷處理時由硬體清除。或用軟體清除。
TF0:定時器0溢出標志。定時/計數器溢出時由硬體置位。中斷處理時由硬體清除,或用軟體清除。
『柒』 單片機定時器/計數器主要有什麼作用
作用一:計數概念的引入
作用二:定時
作用三:溢出
單片機提供內部定時和外部計數的功能,功能差不多都是定時和計數達到終點時,產生中斷,而CPU則暫時放下目前所執行的程序區處理中斷。
定時器:主要用於產生固定時間(比較精確),也可以作為UART等外設的頻率發生器。
計數器:主要是計量引腳產生脈沖的個數。
『捌』 如何用單片機做一個簡單的倒計時器
51單片機實現數碼管99秒倒計時,其實很簡單,就是使用定時器中斷來實現。目的就是學習怎樣用單片機實現倒計時,從而實現一些延時控制類的東西,99秒只是一個例子,你完全可以做出任意倒計時如10秒倒計時程序。定時器定時時間計算公式:初值X=M(最大計時)-計數值。
初值,換算成十六進制,高位給TH0,低位給TL0,如果用定時器0的話。
M(最大計時)如果是16位的,就是2的16次方,最大定時,65535 微秒,實現1秒定時,可以通過定時10毫秒,然後100次改變一次秒值即可。10*100毫秒=1S
計數值:你要定時多長時間,如果定時1毫秒,就是1000微秒,(單位為微秒),如果定時10毫秒,就是10000(微秒),當然,最大定時被定時器本身位數限制了,最大2的16次方(16位定時計數器),只能定時65.535毫秒。定時1S當然不可能1S定時器中斷。
下面為實現99秒倒計時C語言源程序
/*了解定時器,這樣的話,就可以做一些基本的實驗了,如定時炸彈~~,10秒後打開關閉繼電器*/
/*數碼管,12M晶振*/
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //連的是繼電器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定時器0 16位定時器 X=65535-10000(10毫秒)=55535=D8F0(十六進制)定時10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //這里是中斷優先順序控制EA=1(開總中斷),ET0=1(定時器0允許中斷),這里用定時器0來定時
TR0=1; //開定時器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的個位,
delay(300); //動態掃描數碼管延時
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定時器0中斷
{
static uchar second=99,count; //99隻是一個數,可以任意改,因為這里只學習怎樣實現倒計時
TH0=0xd8; //定時10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定時,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //這里讓繼電器動作,當然動作之後,要復位才能等下次倒定時再動作。
second=99; //回到99再循環來,當然,可以做其他的控制,
}
shiwei=tab[second/10]; //數碼管10位
gewei=tab[second%10]; //數碼管個位
}
『玖』 單片機的定時器部件有哪兩種功能
使用51單片機時經常用到一個元件,那就是單片機定時器。在很多定時系統中發揮著重要作用。單片機定時器有哪些作用?使用單片機時定時器是怎樣工作的?怎樣運行的?本文就由大神普及單片機定時器的相關知識,為大家講解在系統中單片機定時器發揮著什麼作用?
首先要為大家解釋的一個問題是,單片機定時器其實跟我們平時常說的計數器,是同一個電子元件,只不過計數器記錄的是51單片機外部情況,所接受的也是外部脈沖,而定時器則是由單片機自身提供的一個非常穩定的計數器,這個穩定的計數器就是單片機上連接的晶振部件。單片機的晶振經過12分頻之後提供給單片機的只有1MHZ的穩定脈沖,晶振的頻率是非常准確的,所以單片機的計數脈沖之間的時間間隔也是非常准確的,這個准確的時間間隔是1微秒。
下面我們來看一下,一個單片機定時器的簡單結構圖,如下圖所示:
單片機定時器的簡單結構圖
而無論是單片機定時器,還是計數器,他們在單片機的工作運行過程中都有定時或事件計數功能,因此常常會被應用於時間控制、程序延時、對外部時間計數和檢測等工作范圍內。而一旦了解了計數器/定時器的應用領域和使用情況,工程師就可以充分利用單片機定時器來完成一些對時間限制要求精準的程序的設定,例如信號檢測或電氣自動化設計,都是比較常用到51單片機計數器進行程序設計的領域。