1. 程式人生 > >51中斷-定時器/計數器中斷

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
只有程式執行到那邊的時候,進判斷的時候程式將會跳轉,而且跳轉完不能夠再次回到被中斷的
那個地方依舊在執行完的時候繼續一次的執行,但是中斷,是無論在程式的哪個地方只要中斷一旦
觸發的時候的那麼就執行中斷子程式(中斷服務程式)但是前提是開啟中斷程式,執行行完中斷的依舊回到被中斷的地方
計數器一直開著那麼只要計數器溢位,那麼就觸發中斷。

   其餘的中斷類似,只不過控制的暫存器不一樣;