中斷大概是這樣的。。。如果有點錯誤不要怪我。。。我以前作過鼠標(biāo)中斷的東西?!,F(xiàn)在有些想不起來了。。。所以。。。呵呵呵。。。
創(chuàng)新互聯(lián)是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護、網(wǎng)站制作、成都做網(wǎng)站、網(wǎng)站備案、服務(wù)器租用、域名注冊、軟件開發(fā)、小程序開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運營推廣經(jīng)驗的科技公司,有著多年的網(wǎng)站建站經(jīng)驗,致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個面向全國乃至全球的業(yè)務(wù)窗口:建站歡迎聯(lián)系:028-86922220
當(dāng)程序運行到中斷條件的時候,會向CPU發(fā)信號改變優(yōu)先級(原先運行的東西會放進哪個特定的地方的,作保存),以發(fā)出中斷的那段程序作為最高優(yōu)先,執(zhí)行完成后再由執(zhí)行另外的。。。建議你去看看匯編。。。哈哈哈。。。我沒學(xué)過的。。。
C中實現(xiàn)中斷是用了一個函數(shù):geninterrupt(...)
這個“...”是個16進制的數(shù)字,是中斷號,像鼠標(biāo)中斷號就是0x33
還要用到類似匯編里寄存器模樣的變量:如_AX,_BX,_CX,_DX...不同的值功能不同。。。哎呀,我都忘完了。。。建議去查下geninterrupt()的用法就OK了。。。
首先你要寫中斷函數(shù)
然后在主程序中像調(diào)用子函數(shù)一樣調(diào)用就可以了
舉個例子吧
#define uchar unsigned char
#define uchar unsigned char
sbit D1=P1^0;
uchar aa;
void init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main()
{
init();
while(1)
{
if(aa==20)
{
D1=~D1;
aa=0;
}
}
}
void T0time()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
外部中斷的常用功能
外部中斷經(jīng)常用來記錄外部脈沖的個數(shù),也就是當(dāng)我們使用外部中斷1時,如果想記錄自身單片機的某個引腳的下降沿個數(shù),只需用杜邦線把這個引腳和P3.3連接即可。
比如P2.3引腳產(chǎn)生這樣的電平無規(guī)律跳轉(zhuǎn),則下降沿的個數(shù)為5
所以我們就用外部中斷1來實現(xiàn)記錄K4按鍵從按下到松手的抖動過程中經(jīng)歷了多少個下降沿,把下降沿的個數(shù)顯示在數(shù)碼管上。
2.程序思路
我們定義一個16位的全局變量pulse用來記錄P2.3下降沿的個數(shù),在中斷函數(shù)中的任務(wù)就是簡單的pulse自加,因為引腳遇到下降沿就會進入中斷函數(shù)。
在主函數(shù)里就是負(fù)責(zé)數(shù)碼管顯示即可。
3.代碼#include?
#include?//詳見第六章第8講
u16?pulse=0;
void?main()
{
u16?x,PULSE_buf;
IT1?=?1;???//下降沿觸發(fā)模式
EX1?=?1;
EA??=?1;
LED_Init();//初始化LED硬件模塊
KEY_Init();//初始化按鍵功能模塊
ShowNumber(pulse);
while(1)
{
SEG_Scan();
if(PULSE_buf!=pulse)ShowNumber(pulse);//pulse不再是前一次的值,也就是pulse數(shù)值更新了,所以數(shù)碼管緩存區(qū)也要更新pulse的數(shù)值以便顯示出來
x++;
if(x=50)//隔一段時間過來記錄此時的pulse數(shù)值
{
x=0;
PULSE_buf=pulse;
}
}
}
//請把P3.3和P2.3用杜邦線連接起來
void?EXTI1_IRQHandler()?interrupt?2
{
pulse++;
}
大家多按幾次K4,發(fā)現(xiàn)按下后松手的一個動作里有時pulse就自加了幾次,顯示在數(shù)碼管上的數(shù)加了好幾下。
中斷函數(shù)是不需要額外通過代碼調(diào)用的
當(dāng)中斷條件滿足,單片機會打斷當(dāng)前執(zhí)行的語句,跳轉(zhuǎn)到中斷函數(shù),然后執(zhí)行完中斷函數(shù)后,再次返回之前被打斷的語句繼續(xù)執(zhí)行
中斷函數(shù)中,每次都會對定時器重新初始化,即頭兩句對TH1和TL1的賦值,這樣每50ms會再次進入一次中斷函數(shù).每20次進入中斷,即經(jīng)過了1秒,然后對全局變量miao自增1
而main函數(shù)則是不斷對變量miao進行輸出