① 51單片機定時器中斷
定時器的中斷不影響定時器的計數,它是環形計數的,會一直向上加1的,所以,一般,進入定時器中斷之後,都會先關閉定時器,處理完成了再開啟定時器,然後中斷再返回
② 定時器中斷實驗51單片機,P2口外接8個發光二極體,4個共陽極接法,4個共陰極接法,如圖所示.要求分別用C語言
雖然看不到圖但是這種問題實在不難,給你程序等於害你,給你點思路自己寫才能幫助你:首先設定好定時器1,如果晶振是12MHz,TH1=(65536-50000)/256,TL1=(65536-50000)%6,TMOD=0x10,主要就這三步,配置好了定時器1。然後給P2一個初值0xf0,然後進入主程序死循環等待中斷,中斷函數重裝初值後,i ,當i增到20說明1s時間到,i=0,P2=~P2。具體思路給你了。
希望我的回答能幫助到你。
③ 一個關於51單片機定時器中斷的問題,程序如下,目地是在時間到後LED由全亮變為依次點亮,出現了問題。
問題:
void inter(void) interrupt 1 using 1
{
P2=0xfe;//這1句執行的結果,是每次進入中斷只亮第1個LED,
TH0=0x00;
TL0=0x00;
for(i=1;i<=8;i++)
{
delay(3000);//在中斷里調用其它函數,經常會造成RAM沖突死的很難看?!
P2=P2<<1;//P2是I/O口,不能作為變數進行移位操作,這是問題的關鍵!
P2=P2|0x01;//這1句執行的結果是讓第1個LED滅
}
}
你的意思是定時器每中斷1次,LED間隔delay(3000)後環移1次,那麼這樣修改試試,應該可以達到你的目的:
#include"reg52.h"
void delay(unsigned int t);
unsigned char i=0xfe;//這1行改成讓第1個LED亮的編碼
void main()
{
P2=0x00;
TMOD=0x01;
TH0=0x00;
TL0=0x00;
EA=1;
ET0=1;
TR0=1;
while(1);
}
void inter(void) interrupt 1 using 1
{
static unsigned char j = 10;//定義1個靜態變數用於中斷次數計數以增加LED移位時間
if(j)j--;//中斷次數計數
else j=10;
i <<= 1;//每中斷10次LED右移1次
if(i != 0xfe)i |= 0x01;//當又環移到第1個LED亮時,保持。
P2 = i;//將LED編碼送P2口
}
說明:因為不知道單片機晶振的頻率,所以在中斷里定義了1個靜態變數,改變上述靜態變數的值可以改變LED移位的時間。
④ 關於51單片機的定時器中斷
是這樣的,如果你在定時中斷服務程序里,沒有執行關閉定時器,或者關閉定時器中斷,即
TR0 = 0,ET0 = 0
如果你上面這兩條語句一個都沒有,那麼,就是第三種情況,第一次程序中斷執行到一大半,然後第二次中斷又開始了。
如果你上面有任何一句,那麼,就是把第一次執行完畢。
一般來說,我們會用TR0 = 0,而很少會用ET0 = 0。這樣,就是把當前一次執行完畢,然後,再開始定時器,20ms後再進入中斷。
⑤ 51單片機實驗(關於定時器計數器)
6mz的晶振 可算出一個時鍾周期為2微秒,200毫秒去除一下2微秒就是10000,然後吧10000取16進制為 27A0 ,用 FFFF減27A0再加1 得 C860,用定時方式一,TL0 ,#60H
TH0, #C8H
⑥ 51單片機定時器中斷原理
原理很簡單,說白了就是用一個計數器對內部時鍾計數,計滿溢出時觸發定時器中斷,此時,程序會中斷執行當前代碼跳轉到一個固定地址(定時器中斷服務程序入口)去執行中斷服務程序,執行完畢再回到被中斷的代碼地址繼續執行。
⑦ 單片機定時中斷實驗
跟你理清一下思路,你的問題就解決了。首先,你的程序很簡單,就是讓發光二極體1秒亮1秒滅。因此,你前提是要定時1秒,但51單片機無法定時1秒,因此,你的程序就要定時50毫秒,每到了50毫秒,你就讓num自加1,當num加到20時,換句話說,已經定時50毫秒20次了,那就是1秒咯,所以此有led1=~led1;
//讓發光管狀態取反,達到程序目的。另外,定時50毫秒你要給th0和tl0賦給初值,因此
th0=(65536-45872)/256;
//重新裝載初值tl0=(65536-45872)%256;才會有這兩句,但定時50毫秒後,你的初值也會隨之消失,因此才會在void
t0_time()這個函數中重新賦初值。的確像你所說的初值是裝滿了開始執行中斷,其實從你tmod=0x01;
//設置定時器0位工作模式1(m1,m0位0,1)這句已經開始定時了,而賦初值是為了准確的定時50毫秒罷了。明白了沒有?
(其實你可以這樣理解,定時計數器就好比一個空的瓶子,當你給tmod=0x01時,水就開始一滴一滴的往瓶子你滴,當瓶子滿了的時候,中斷就發生了。假如從一個空的瓶子滴到滿的瓶子定時是80毫秒的話,可你只需要定時50毫秒就夠了,所以就要一開始往瓶子里倒水,使滴水的起點不是空瓶子,這就是賦初值的作用。當瓶子滿了後,瓶子就會自動清空,重新從零開始。而第二次你再想定時50毫秒,你就必須從新再往瓶子里倒水,這就是第二次賦初值的作用)
⑧ 51單片機中 定時器定時到了,進入中斷
記得在介紹51單片機對中斷服務程序的處理時,說的是中斷發生時不管在處理什麼程序都會停下來轉去處理中斷服務程序,並保存當前pc地址,以能在中斷服務程序處理完成之後能返回這個地址繼續處理之前未處理完畢的程序。所以呢,若是在中斷發生之前有一個比中斷發生時間更長的延時函數,不外乎就兩種情況,要麼保存當前pc地址,待中斷服務程序處理完成重新開始執行被中斷處的函數,要麼保存當前pc地址並記錄程序狀態,待處理完成後接著延時,不重新延時。
如果剛才所說的沒幫到你,我建議你自己寫一個實驗程序,就用定時器產生中斷,4.5s一次吧,在寫一個簡單的延時函數,多延時一些,盡量大於4.5s,然後延時函數中用到的變數使用全局變數以方便在主函數中讀取值並顯示。如果每次讀取為0,那麼就是重新開始延時,如果每次都不一樣,說明保存了狀態的,中斷服務程序用來讀取值。
希望我的回答能幫助到你。
⑨ 51單片機中斷定時
30秒這個時間比較長,不知道你的晶振選用的什麼頻率。一般來說16位方式也很難做到30秒,所以需要藉助一個全局的counter變數來輔助提升定時器位數。
⑩ 51單片機定時器中斷問題
case 2: TH0=(63036+X)/256;--這種表達式,要由單片機來算出結果
TL0=(63036+X)%256;--這兩行,都是16位數的計算,非常浪費單片機的時間
case 3: TH0=(65536-1500)/256;--這兩行,都是由編譯軟體來算,結果,存入了ROM
TL0=(65536-1500)%256;--這兩行,單片機,只是傳送而已,佔用單片機的時間最少