|
STC15系列單片機的外部中斷0(INT0)和外部中斷1(INT1)的觸發(fā)有兩種方式,上升沿和下降沿均可觸發(fā)方式和僅下降沿觸發(fā)方式。在實際應(yīng)用中,有時候需要上升沿觸發(fā)。這時有兩種方案可以解決。
1.將觸發(fā)方式設(shè)置成僅下降沿觸發(fā)。當(dāng)外部電路產(chǎn)生一個上升沿時,通過硬件電路加一個三極管進(jìn)行反向變成下降沿。
2.這種方法不需要改變硬件電路。將觸發(fā)方式設(shè)置成上升沿和下降沿均可觸發(fā)方式。外部中斷產(chǎn)生一個上升沿時,進(jìn)入中斷服務(wù)函數(shù),這時在中斷服務(wù)函數(shù)里做進(jìn)一步處理,檢測當(dāng)前INT0的電平狀態(tài)。如果是高電平,則判斷為上升沿。如果是低電平,則判斷為是下降沿。
注意(很重要!): 進(jìn)入中斷服務(wù)函數(shù)后,一定要延時幾個毫秒再去做電平檢測。因為不管是上升沿還是下降沿,都不可能是在一個瞬間完成的,中間會經(jīng)歷一個從高(低)到低(高)的過程。
如果進(jìn)入中斷服務(wù)函數(shù)就立刻檢測,可能當(dāng)時電平還沒有達(dá)到滿足高或低電平的默認(rèn)電壓值或者處于高和低之間的臨界電壓狀態(tài),很可能出現(xiàn)誤判的現(xiàn)象。這樣做的目的是讓跳變后的電平達(dá)到穩(wěn)定狀態(tài)再檢測,說白了就是一個去抖動的過程。
下面把初始化和中斷服務(wù)函數(shù)的代碼貼出來:
- void Initial_INT0(void)
- {
- INT0=0;
- IT0=0; // 設(shè)置成上升沿和下降沿均觸發(fā)
- EX0=1; //使能INT0中斷
- EA=0;
- }
- void exint0() interrupt 0 //外部中斷入口
- {
- delay_ms(50); //延時消抖
- if(INT0==1) //如果檢測到INT0=1,則判斷為上升沿
- {
- led=0;
- delay_ms(500);
- led=1;
- }
- else
- led=1;
- }
復(fù)制代碼 在實際做東西的過程中遇到的一個小問題,希望對你有幫助。
|
評分
-
查看全部評分
|