新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 個人對單片機中斷程序的理解

個人對單片機中斷程序的理解

作者: 時間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
開題首先貼上一段練習(xí)中遇到的代碼:

/*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;
}
}

本文引用地址:http://butianyuan.cn/article/201612/324158.htm

hit:
在學(xué)習(xí)單片機的時候很容易按照C語言編程的格式來理解,程序在打開中斷之后會一直停留在while(1);當(dāng)中,但在實際上,程序的確會停留在while(1);里,由于開啟了中斷開關(guān)而并未關(guān)閉,所以T0繼續(xù)計數(shù),所以后面一直會有中斷。

過程可以理解為這樣,程序一直在while(1);當(dāng)中,直到定時器計滿產(chǎn)生中斷;
產(chǎn)生中斷后,執(zhí)行中斷程序,定時器重新賦值,time自加1;
回到while(1)中,等待下一次中斷,定時器繼續(xù)計數(shù)。

單片機怎么從主函數(shù)跳到中斷函數(shù)中:
對于單片機的硬件,你熟悉嗎?時鐘和CPU是獨立的,時鐘中斷程序時這樣的:在CPU執(zhí)行指令時,計數(shù)器(計時器)同時在計時,當(dāng)計時器溢出時,就向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),所以,當(dāng)你的程序跑起來時,時鐘時間到了,CPU就轉(zhuǎn)入中斷服務(wù)程序了,執(zhí)行完了再返回主程序。你可以在編譯器中用DEBUG查看執(zhí)行過程的。如果你用匯編語言寫,就更清楚了,可以看清每一步的操作的。
硬件部分是這樣:在每個機器周期的S5P2,單片機會來采樣,判斷是否有中斷申請。所以一旦時鐘計數(shù)溢出,就會轉(zhuǎn)入中斷服務(wù)程序。


這個打個比方吧,你在上課,相當(dāng)于主程序,這時時間到了,打鈴下課了,你就不讀書了,跑出去玩了。這其實是一樣的道理。你在上課,這和打鈴不相關(guān),并不是你讓打鈴的,學(xué)校的時鐘在不停地走,到了時間自動打鈴,這不受你上課的影響的。但是如果你把耳朵堵上了(不允許響應(yīng)中斷),就是把鈴打碎了你也不知道下課了,所以你就一直讀書。



關(guān)鍵詞: 單片機中斷程

評論


技術(shù)專區(qū)

關(guān)閉