51中斷-定時器/計數器中斷
什麼時中斷:
是指在執行程式的過程中,當出現每種情況,發出緊急的事件或其他情況時,
有服務物件向CPU發出中斷請求的訊號,CPU暫時中斷當前的程式的執行,而轉去
執行相應的處理程式,待處理程式完畢以後,再返回來執行原來被中斷的程式。
關於中斷以定時/計數器0中斷為例;
void timer0_init()
{
EA = 1; //開啟總中斷;
TMOD |= 0x01; //選定定時/計數器0的工作的方式
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256; //初始化定時/計數器的值
ET0 = 1; //開啟中斷服務程式
TR0 = 1; //開啟計數器
}
void timer0_isr() interrupt 1 // 中斷的服務的程式
{
TH0 = (65536 - 20000) / 256;
TL0 = (65536 - 20000) % 256; //觸發中斷後再一次初始化值
change(); //呼叫一個程式,假設改變led的燈
}
void main()
{
timer0_init(); //中斷的初始化;
while(1);
}
這個程式的執行的過程是,先是中斷的初始化,然後一直while裡面死迴圈,每當
計數器溢位的時候,觸發中斷函式,進入中斷的服務函式,執行中斷函式timer0_isr()
由於計數器沒有關閉,所以計數器一直在計數,所以每隔20ms(晶振12mhz)觸發一次中
斷。
注:
溢位:是指16位的計數器(可以選擇計數器的工作的方式),每次累加到16位的最大的
值溢位的時候,觸發中斷。
ET0 :如果把它置為0的話,那麼就算計數器的溢位也不會呼叫中斷服務程式
TR0 :如果將它置為0的話,那麼計數器將不再累加
累加:什麼時候累加,是根據晶振的hz來決定的
微控制器的晶振頻率 :12M震盪週期1/12us
微控制器的機器的週期:12個機器週期,即加一次1us;
interrupt 1: 1.區分不同的函式
2.
1 定時器0
2 外部中斷1
3 定時器1
4 序列中斷
3.後面還有跟using 的,主要為了說明使用哪一組的暫存器,可以不寫
中斷程式就像C語言的裡面的goto語句,打斷程式的執行的順序,但是又是不同的,因為,goto
只有程式執行到那邊的時候,進判斷的時候程式將會跳轉,而且跳轉完不能夠再次回到被中斷的
那個地方依舊在執行完的時候繼續一次的執行,但是中斷,是無論在程式的哪個地方只要中斷一旦
觸發的時候的那麼就執行中斷子程式(中斷服務程式)但是前提是開啟中斷程式,執行行完中斷的依舊回到被中斷的地方
計數器一直開著那麼只要計數器溢位,那麼就觸發中斷。
其餘的中斷類似,只不過控制的暫存器不一樣;