個人對單片機中斷程序的理解
/*1:利用定時/計數(shù)器T0從P1.0輸出周期為1s的方波,讓發(fā)光二極管以1HZ閃爍,設(shè)晶振頻率為12MHz。*/
#include
#include
#define uint unsigned int
#define uchar unsigned char
sbit P1_1=P1^0;
uchar time;
void main()
{
time=0;
TMOD=0x01;////設(shè)置定時器0為工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//開總中斷
ET0=1;//開定時器0中斷
TR0=1;//啟動定時器0
while(1);//等待中斷產(chǎn)生
}
void T1_time() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==20)
{
time=0;
P1_1=~P1_1;
}
}
hit:
在學習單片機的時候很容易按照C語言編程的格式來理解,程序在打開中斷之后會一直停留在while(1);當中,但在實際上,程序的確會停留在while(1);里,由于開啟了中斷開關(guān)而并未關(guān)閉,所以T0繼續(xù)計數(shù),所以后面一直會有中斷。
過程可以理解為這樣,程序一直在while(1);當中,直到定時器計滿產(chǎn)生中斷;
產(chǎn)生中斷后,執(zhí)行中斷程序,定時器重新賦值,time自加1;
回到while(1)中,等待下一次中斷,定時器繼續(xù)計數(shù)。
單片機怎么從主函數(shù)跳到中斷函數(shù)中:
對于單片機的硬件,你熟悉嗎?時鐘和CPU是獨立的,時鐘中斷程序時這樣的:在CPU執(zhí)行指令時,計數(shù)器(計時器)同時在計時,當計時器溢出時,就向CPU申請中斷,如果允許響應(yīng)中斷,CPU就轉(zhuǎn)到中斷服務(wù)程序執(zhí)行相關(guān)的程序。
單片機的時鐘中斷相應(yīng)要滿足兩個條件:第一,允許中斷源申請中斷。第二,允許cpu響應(yīng)中斷。二者缺一不可。 EA=1;//開總中斷
ET0=1;//開定時器0中斷
ET1=1;
TR0=1;//啟動定時器0
TR1=1;
你這些語句,就允許了中斷響應(yīng),所以,當你的程序跑起來時,時鐘時間到了,CPU就轉(zhuǎn)入中斷服務(wù)程序了,執(zhí)行完了再返回主程序。你可以在編譯器中用DEBUG查看執(zhí)行過程的。如果你用匯編語言寫,就更清楚了,可以看清每一步的操作的。
硬件部分是這樣:在每個機器周期的S5P2,單片機會來采樣,判斷是否有中斷申請。所以一旦時鐘計數(shù)溢出,就會轉(zhuǎn)入中斷服務(wù)程序。
這個打個比方吧,你在上課,相當于主程序,這時時間到了,打鈴下課了,你就不讀書了,跑出去玩了。這其實是一樣的道理。你在上課,這和打鈴不相關(guān),并不是你讓打鈴的,學校的時鐘在不停地走,到了時間自動打鈴,這不受你上課的影響的。但是如果你把耳朵堵上了(不允許響應(yīng)中斷),就是把鈴打碎了你也不知道下課了,所以你就一直讀書。
評論