生活随笔
收集整理的這篇文章主要介紹了
07-小蜜蜂单片机中断系统
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
中斷相關的基礎概念
內核和外設之間的主要交互方式有兩種:輪詢和中斷。
在執行cpu當前程序時,由于系統中出現了某種急需處理的情況,cpu暫停正在執行的程序,轉而去執行另外一段特殊的程序來處理出現的緊急事務,處理結束后,CPU自動返回到原來暫停的程序中去繼續執行。這種程序在執行過程中由于外界的原因而被中間打斷的情況,成為中斷。
中斷服務函數:內核響應中斷后執行的相應處理程序。
中短向量:中斷服務函數的入口地址。每個中斷源都對應一個固定的入口地址。當內核響應中斷請求時,就會暫停當前的程序執行,然后跳轉到該入口地址執行代碼。
有中斷請求不一定能打斷主程序。
中斷系統
首先將J5處的跳帽接到2 ~ 3 引腳,即S5按鍵接到P32/INT0,S4按鍵接到P33/INT1。定義一個working函數,使L1指示燈不斷閃爍。將P32引腳定義為外部中斷功能,按鍵S5按鍵就會產生外部中斷觸發信號,在中斷響應函數中,點亮L8指示燈,延長一段時間后熄滅,該功能用兩種方式實現:
1-直接在中斷服務函數中延時
2-在中斷服務函數中標志變量,在外部執行延時
#include "reg52.h"sbit L1
= P0
^0;
sbit L8
= P0
^7;void Delay(unsigned int t
)
{while(t
--);
}void SelectHC573()
{P2
= (P2
& 0x1f )| 0x80;
}void Working()
{SelectHC573();L1
=0;Delay(60000);L1
=1;Delay(60000);
}
void Init_INT0()
{IT0
= 1; EX0
=1;EA
=1;
}void ServiceINT0() interrupt
0
{L8
=0;Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);L8
=1;
}
void main()
{while(1){Init_INT0();Working();}
}
上面的這個代碼將延時函數放在了中斷服務函數中。
這個的結果是當使L1閃爍時,按下S5,L8亮,但L1可以亮,可以不亮。這取決于按下的時間點。
如果將延時放在中斷服務函數外面 即:
#include "reg52.h"sbit L1
= P0
^0;
sbit L8
= P0
^7;void Delay(unsigned int t
)
{while(t
--);
}void SelectHC573()
{P2
= (P2
& 0x1f )| 0x80;
}void Working()
{SelectHC573();L1
=0;Delay(60000);L1
=1;Delay(60000);
}
void Init_INT0()
{IT0
= 1; EX0
=1;EA
=1;
}unsigned char stat_int
=0;
void ServiceINT0() interrupt
0
{stat_int
=1;
}void LEDINT()
{if(stat_int
==1){L8
=0;Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);Delay(60000);L8
=1;}stat_int
=0;
}
void main()
{ Init_INT0();while(1){Working();LEDINT();}
}
上面這個代碼將延時放在了另一個函數中,而中斷服務函數中只有標志變量的改變。
這就使得當有一個中斷進來使標志變量改變時,必須等到working執行完之后(即L1閃爍一次之后),才會檢測變量的值,在決定L8是否點亮。
注意
一般在中斷服務函數中不要寫太多的語句。
總結
以上是生活随笔為你收集整理的07-小蜜蜂单片机中断系统的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。