中斷
- 1、定時器T0中斷
- 2、案例:通過定時器T0中斷來實現燈間隔1s亮滅
1、當中央處理機CPU正在處理某件事的時候外界發生了緊急事件請求,要求CPU暫停當前的工作,轉而去處理這個緊急事件,處理完以后,再回到原來被中斷的地方,繼續原來的工作,這樣的過程稱為中斷。
2、通常根據中斷源的輕重緩急排隊,優先處理最緊急事件的中斷請求源,即規定每一個中斷源有一個優先級別。CPU總是先響應優先級別最高的中斷請求。
3、C51單片機有8個中斷請求源:
1、定時器T0中斷
如圖:中斷也需要配置寄存器,一共有2種寄存器,第一種位中斷控制寄存器(IE和XICON),第二種為優先級控制寄存器。這里我們只學習定時器T0的一個中斷。
要使用定時器T0中斷:
ET0 = 1;ET0為定時器T0的中斷開關,為1時打開中斷
EA = 1; EA為中斷源的總開關。
定的時間到了后,去執行中斷函數里面的程序,那么怎樣才知道哪個函數是中斷函數喃?— 查詢中斷號(不同中斷源產生的中斷號不同)
2、案例:通過定時器T0中斷來實現燈間隔1s亮滅
#include <REGX52.H>sbit LED1 = P3^7;
int cnt = 0;void Timer0_Init_10ms(void) //10毫秒@11.0592MHz
{TMOD &= 0xF0; //設置定時器模式TMOD |= 0x01; //設置定時器模式TL0 = 0x00; //設置定時初值TH0 = 0xDC; //設置定時初值TF0 = 0; //清除TF0標志TR0 = 1; //定時器0開始計時
}void Timer0_interrupt_Init(void)//定時器T0中斷初始化
{ET0 = 1;EA = 1;
}void main(void)
{ LED1 = 1;//先讓燈熄滅的狀態Timer0_Init_10ms();//打開定時器T0Timer0_interrupt_Init();//打開定時器T0中斷while(1){}
}/*定義中斷函數*/
void Timer0Hander() interrupt 1
{TF0 = 0;//軟件清零TL0 = 0x00; //重新給初值TH0 = 0xDC;cnt++;if(cnt == 100)//數100次,相當于1s{cnt = 0;LED1 = !LED1;}
}
- 當中斷開啟時,每隔10ms就跳出主函數,執行中斷函數里面的程序。
- 定時的第一個10ms到了,執行中斷函數,重新給定時器計時10ms,cnt = 1,燈還是滅
- 定時的第二個10ms到了,執行中斷函數,重新給定時器計時10ms,cnt = 2,燈還是滅
- …
- 定時的第100個10ms到了,執行中斷函數,重新給定時器計時10ms,cnt = 100,燈變亮
這樣就實現了間隔1s的亮滅。