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