❶ 單片機定時器的使用方法
第一步:設置特殊功能寄存器 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 的頻率進行閃爍
❷ 跪求用單片機製作長延時定時器的程序
多簡單的事啊,我貼一個AVR採用定時器0計時的,你參考一下吧。
#pragma interrupt_handler timer0_ovf_isr:10 //TIMER0 定時2ms中斷.
void timer0_ovf_isr(void)
{
TCNT0 = 0xD9; //reload counter value
timer2ms++;
if(timer2ms >= 5)
{
timer2ms = 0;
timer10ms ++;
systimer10ms ++;
if(systimer10ms >= 22) //內部1M晶振
{
systimer10ms = 0;
timer1s ++;
}
}
也就是說。你另外起一個變數。與響應時間對照。你別說9999分鍾。你就是9999年都可以做到。不理解時加我QQ問我吧。
❸ 單片機定時器應用實驗程序
我來試試吧,用匯編語言編寫:
ORG 0
JMP MAIN
MAIN:SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
JMP MAIN
DELAY:MOV R1,#10 ;500ms的延時子程序
MOV TMOD,#1 ;定時器0方式1
AGAIN:MOV TL0,#LOW(65536-50000) ;裝載計數初值的低位
MOV TH0,#HIGH(65536-50000) ;裝載計數初值的高位
SETB TR0 ;啟動
LOOP1:JBC TF0,LOOP2 ;查詢並清除溢出位
JMP LOOP1
LOOP2:DJNZ R1,AGAIN
CLR TR0
RET
END
剛才我拿51的測試板編譯了一下,下載後可以正常運行,你直接拷貝應該就能用,嘻嘻
❹ 51單片機定時器程序五分鍾的怎樣寫呀!
設置定時器中斷時間,比如1s,然後做一個全局的變數進行累加,當終端產生300次,就給蜂鳴器導通。
❺ 單片機定時器c程序
你可以設定定時器T0,每50MS中斷一次,中斷一次計數一次,計數20次,剛好1秒,到1秒就把狀態改變就行了。
❻ 求單片機定時器簡單程序(C語言)詳解。不勝感激~
用定時器0中斷做流水燈,程序如下:#include<reg52.h>#include<intrins.h> //包含_crol_()循環左移函數
unsigned char temp,count;void init() //初始化函數{ TMOD=0x01;//設置定時器0為工作方式1 TH0=(65536-50000)/256;//裝初值,高8位 TL0=(65536-50000)%256;//裝初值,低8位 EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0 temp=0xfe; count=0;//記數值清0}void main(){ init(); while(1){ P1=temp;}}void timer0() interrupt 1 using 1 //定時器0中斷函數{ TH0=(65536-50000)/256;//重裝初值,同上 TL0=(65536-50000)%256; count++;//計數值加1 if(count==10)//500ms{ count=0;//計數值清0 temp=_crol_(temp,1);循環左移一位}
❼ 怎樣用單片機定時器設計0到9秒的循環程序
#define uint unsigned int
#define uchar unsigned char
#include <reg52.h>
uint i;
uchar code TAB[]=[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
TMOD=0x22; /*定時器0設置為工作方式2,基準定時(256-6)/1M=0.25ms*/
TH0 =6; //賦T0的預置值6,溢出4000次就是1秒鍾
TL0 =6;
ET0=1; //打開定時器0中斷
EA=1; //打開總中斷
TR0=1; //啟動定時器
while(1) //程序循環
{
P3=TAB[(i)];//p3送數
}
}
//定時器0中斷
void timer0(void) interrupt 1 using 1
{
static uint t; //注意t的范圍,這里涉及到C51變數取值范圍這個知識點
t++;
if(t==4000) //T0的預置值6,溢出4000次就是1秒鍾,晶振12MHz
{
t=0;
i++;
i=i%10;
}
}
❽ 單片機定時器程序
延時計算公式應該是:
{1 + [1 + (1 + 1 + 2)×TIME1 + 2]×TIME2 + 2}×機器周期
式中的4個1,分別是兩條MOV和兩條NOP的;
式中的3個2,分別是兩條DJNZ和RET的。
即:最後的2,是指令RET的。
計算方法可見:
http://hi..com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/95d6b8376e6bc6d7a2cc2bd5.html
❾ 51單片機的定時程序
給你個提示吧,在主程序裡面設置好中斷,然後開中斷,定時夠6秒,這個定時不能直接頂出來的,你可以間接得到,你可以定時0.1秒,然後用一個變數裝起來,沒定時一次,在中斷服務程序裡面對這個變數加一,然後在主程序裡面不斷判斷這個變數是否夠6000,夠的話就對你要的那個變數加一,然後對這個6000的變數清零,就可以了。這個單片機的程序一定要自己多寫才行的,這樣才可以學到東西。
❿ 51單片機定時器的匯編語言程序編程,
LED BIT P1.0 ;定義LED的引腳
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 0030H
MAIN:
MOV TMOD,#01H ;定時器0工作模式1
MOV TH0,#HIGH(65536-50000) ;初值,50毫秒中斷一次
MOV TL0,#LOW(65536-50000)
SETB TR0 ;啟動定時器
SETB ET0 ;啟動定時器中斷
SETB EA ;開總中斷
MOV R2,#40 ;中斷計數初始值
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH(65536-50000)
MOV TL0,#LOW(65536-50000)
SETB TR0
DJNZ R2,T0E ;R2減到0重新賦值,否則退出
MOV R2,#40
CPL LED ;LED亮滅轉換
T0E:
RETI
END