『壹』 51單片機程序如下,問定時器為啥沒工作,求改錯。
TF0是什麼?溢出中斷請求標志位。 T0計數溢出時由硬體自動置TF0為1。CPU響應中斷後TF0由硬體自動清0。 中斷是什麼意思? 就拿 你這里來說,就是暫停執行你這里的主函數,去執行中斷裡面 的函數。
你的程序過程是這樣的: 定時器第一次計數,計數滿後,TF0=1,進入中斷(此時,就暫停執行主函數裡面的東西),但是你中斷里什麼都沒有(沒有中斷函數),然後硬體又直接將TF0置0,跳出中斷,回到主函數,判斷if(TF0==1)是否滿足,這里不滿足(因為TF0=0),所以 IF裡面所有的東西都沒有執行(包括定時器的重裝),所以定時器只計數了一次,然後程序結束。
你這里不能吧定時器0的重裝數據放在主函數裡面,這個過程要放在中斷函數裡面取處理,因此用定時器時,要開啟定時器0中斷。
程序應該這么 寫:
『貳』 單片機 TCON 每一位:TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 表示什麼意思0或1代表什麼謝謝,百度百科都沒
這里TF、TR、IE、IT後面跟的0和1是對單片機寄存器中位的命名,因為有兩個定時/計數器、兩個中斷,所以用0、1來區分。
各位的定義如下:
TF1、TF0:分別是定時器1、定時器0的溢出標志位。當定時器x計滿溢出時,由硬體使TFx位置「1」,並申請中斷。進入中斷服務程序後,由硬體自動清「0」,在查詢方式下用軟體清「0」。
TR1、TR0:分別是定時器1、定時器0的運行控制位。由軟體清「0」關閉定時器。當GATE=1,且INTx為高電平時,TR置「1」啟動定時器;當GATE=0,TRx置「1」啟動定時器。
IE1、IE0:分別為外部中斷1、外部中斷0的請求標志位。
IT1、IT0:分別為外部中斷1、外部中斷0的觸發方式選擇位。當ITx=0,為低電平觸發方式;當ITx=1,為下降沿觸發方式。
(2)單片機tf0為1沒有中斷擴展閱讀:
TCON初始化:
1、確定工作方式(即對TMOD賦值);
2、預置定時或計數的初值(可直接將初值寫入TH0、TL0或TH1、TL1);
3、根據需要開放定時器/計數器的中斷(直接對IE位賦值);
4、啟動定時器/計數器(若已規定用軟體啟動,則可把TR0或TR1置「1」;若已規定由外中斷引腳電平啟動,則需給外引腳加啟動電平。當實現了啟動要求後,定時器即按規定的工作方式和初值開始計數或定時)。
『叄』 關於單片機匯編
你程序中的F0,並不是T0的中斷請求標志位,中斷請求標志位是TF0,當TF0=1時,申請中斷,單片機響應後,從中斷返回時才被自動清零。而F0是自己定義的一個標志位,與TF0毫無關系。或者是PSW寄存器中的一位,也是用戶標志位,與TF0沒有關系。
就你的程序,那個F0的標志位,在主程序中被清0了,可在中斷程序中沒有再被置1,
JB F0 ,COUNT,這條指令中的F0是不會變1的,也就是不會跳轉的,這條指令也沒有什麼用。
再問一句,這程序是你自己寫的,還是從哪裡抄來的,程序中的
SETB GATE,那GATE是什麼?注釋是打開計數門,這是誰這么寫的?那GATE是TMOD寄存器中的那個GATE嗎,TMOD是不可以位定址的寄存器,GATE並沒有位地址,也就是說這條指令
SETB GATE是無效的。
所以,這個程序是有問題的。這只是在紙上談兵吧,並沒有編譯吧,如果編譯的話會有錯誤的,更不可能去真的運行了吧?那這就沒有什麼意義了,都是空談。
『肆』 單片機程序定時器問題
應該是TF0=0; 這是清除定時器中斷標志位為0。這個語句放在重新賦初值後與現在的位置,是有區別的。主要是對定時的精度的影響,因為,定時器定時到,則停止計數,必須重新賦值才開始計數定時,為了保證定時的精度,應立即賦值,以減少執行其它指令而延長了賦值的時間,所以,TF0=0放在賦值語句後,就不影響定時精度,而放在現在的位置,就要執行完才賦值。當然了,定時一次的誤差雖然只有2us,但程序要運行一天以上,積累的計時誤差就不能忽略了。
『伍』 如何實現單片機的中斷
#define _1231_C_#include "reg51.h"#include "1231.h"//sbit OE=P2^3;unsigned int SystemTime;void timer0(void) interrupt 1 using 3 //中斷部分代碼,見下文的釋疑{ TH0 = 0xdb; TL0 = 0xff;// TF0 = 0; SystemTime++;}void main(){ TMOD &= 0xF0; TMOD |= 0x01; //TMOD的值表示定時器工作方式選擇 TH0 = 0xdb; //寫入初始值,初始值可以決定定時多久 TL0 = 0xff;//根據下文的木桶比喻的話,如果TH0 = 0x00;TL0 = 0x00;則表示從桶底開始裝水。//TH0 = 0xdb;TL0 = 0xff;可以這樣子理解相當於木桶里已經有部分液鉛在裡面,//TH0和TL0這個兩個值表示木桶里液鉛的高度,即此時桶里只能從液鉛的高度以上開始裝水,//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置. TF0 = 0; //計數到時TF0為1,即當TH0 = 0xff;TL0 = 0xff;再運行一步TF0 = 1; TR0 = 1; //開始計數,從這時起,每運行一步TH0和TL0都會增加,直到TH0 = 0xff;TL0 = 0xff; //相當於開水龍頭,如TR0=0則TH0和TL0不變 ET0 = 1; //允許定時器0中斷 EA=1; //開總中斷//下面是個死循環,程序里每運行一步TH0和TL0都會增加,當增加到TH0 = 0xff;TL0 = 0xff;//單片機會從死循環里退出,去執行中斷部分的代碼,即開始運行void timer0(void) interrupt 1 using 3{}//運行完中斷部分的代碼後,接著繼續執行死循環里的代碼。//注意:當TH0 = 0xff;TL0 = 0xff;再運行,TF0並沒有從0變為1,個人猜測TF0=1;時觸發了中斷,並重新被置零。//如把ET0 = 1;和EA=1;注釋掉,當TH0 = 0xff;TL0 = 0xff;再運行,TF0會變為1,此時不會再執行中斷部分代碼。 while(1) { if ((SystemTime%100)<50) //SystemTime除以100,余數小於50為真 { //這兩行不用管,就當做是功能1 P0=0xf1; P2=0xf0; } else { //這兩行不用管,就當做是功能2 P0=0x00; P2=0xf0; } };}釋疑:void Timer0() interrupt 1 using 1Timer0 是函數名,隨便取的 interrupt xx using y 跟在interrupt 後面的xx 值得是中斷號,就是說這個函數對應第幾個中斷埠,一般在51中 0 外部中斷0 1 定時器0 2 外部中斷1 3 定時器1 4 串列中斷
『陸』 51單片機中執行完定時器中斷函數,TF0是硬體自動清0嗎
TF0是51單片機定時器T0的溢出中斷標志位。當T0被允許計數後,T0從初值開始按機器周期或者外部引腳輸入的脈沖進行加1計數。當計數到T0最高位產生溢出時,置「1」TF0,並向CPU請求中斷。當CPU響應該中斷時,將由硬體自動清「0」TF0。當然,你也可以用「位操作指令」對TF0進行置「1」或清「0」操作。
『柒』 如果單片機T0的中斷沒開,T0計滿數後,TF會始終保持為1嗎會影響下面重新開始的計數嗎
T0的話一般TF0由硬體清0,至於計數和中斷是兩個相對獨立而又有聯系的過程,媒介就是T0的中斷允許,也就是說中斷允許開不開計數照常,TF變化和T0中斷開了一樣,滿了清0滿了清0.bu不影響重新計數
『捌』 51單片機中斷問題
這位仁兄:
單片機有兩種工作方式:中斷和查詢。
你用的是查詢,沒用到中斷。要用到中斷的話,就得給EA、 ET1、ET0 設1開中斷。
TF0、TF1是定時器溢出標志,特點是有中斷時由硬體清零,沒用到中斷時,由軟體清零。你的程序沒用到中斷,當然中斷也不會響應,所以必須用軟體清零。
把你的程序改一改如下,是一個用中斷的例子:
#include<reg51.h>
sbit P10=P1^0;
void timer0(void) interrupt 1 using 1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
P10=1;
}
void main (void)
{
TMOD=0x01;
P10=0;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
EA=1; ET0=1;
TR0=1;
for(;;)
//TF0=0; 這句不用了
}
『玖』 單片機中,計數器tcon中tf0,tro是什麼意思他們的值對計數器有什麼影響
1.TF0由硬體控制,當計數器溢出時置為1時,中斷發生;中斷後自動清0
2.TR0是程序控制,控制T0的工作,置1工作,清0停止
『拾』 單片機程序中TF0是什麼意思 定時器T0溢出中斷
定時器/計數器0的溢出中斷標志位
當T0從初值開始加一計數到產生溢出時,由硬體使TF0置1,直到CPU響應中斷由硬體復位