單片機實驗:外部中斷按鍵


實驗內容:
實驗大致上就是說:按鍵不按的時候,燈一直亮,按鍵按下的時候,燈不亮,報警器響。現在給了匯編語言,要改成c語言,並在proteus里面仿真。

思考與總結:
響應中斷請求的條件:
1.總中斷允許開關EA=1。
2.中斷源的中斷允許位為1。
3.中斷源發出中斷請求。
4.無同級或更高級中斷正在被服務。

結合實驗,就知道,這里跑到中斷子程序的條件,首先總開關打開。然后選擇中斷請求源,對這個實驗來說,也就是選擇I N T 0 ‾ \overline{INT0}
INT0
外部中斷請求0,它的中斷允許控制位是E X 0 EX0EX0,我們置1后,就說明允許了外部中斷0中斷。
我們如果選用跳沿觸發,一個機器周期采樣到外部中斷輸入為高,下一個為低,那么中斷請求觸發器置一,這個時候進入中斷子程序。
這個實驗是電平觸發。
cpu查詢到中斷請求時,就會進行中斷響應(這里假設只是單一中斷,如果有不同優先級的中斷,那么cpu還要進行判斷)。硬件生成一個長調用指令並執行,程序轉向中斷入口地址,兩個中斷入口相隔8字節,難以放下中斷子程序,此時需要一個跳轉指令,轉向在其他地址下的子程序中。

實驗結果:
匯編語言實現:

     ORG 0000h
     LJMP MAIN//主程序
     ORG 0003h
     LJMP INT0s//中斷入口
     ORG 0100h
MAIN: CLR IT0//外部中斷請求0為電平觸發
      SETB EA//總中斷允許
      SETB EX0 //允許外部中斷0    
LOOP: CLR P0.0//p0.0是低電平,此時燈亮
      SETB P2.3//p2.3是高電平,此時警報不響
      SJMP LOOP//短轉移指令,程序跳到loop函數循環
      ORG 0200h//偽指令
INT0s: SETB P0.0     //p0.0是高電平,此時燈滅
       CLR P2.3     //p2.3是低電平,此時警報響
Delay: MOV R0,#200//延時函數
D1:    MOV R1,#254
D2:    DJNZ R1,D2
       DJNZ R0,D1
       RETI
     END

改成c51語言:

#include<reg51.h>
#define uchar unsigned char
sbit key = P3^2;
void delay(unsigned int i)//延時函數
{
    unsigned int j;
    for(;i>0;i--)
        for(j=0;j<333;j++){}
}
void main()//主函數
{
    EA=1;//總中斷允許
    EX0=1;//允許外部中斷0
    IT0=0;//選擇外部中斷0為電平觸發方式
    while(1)//循環
    {P0=0xfe;}//P0.0口的Led亮
}
void key_scan() interrupt 0 //外部中斷0的中斷服務函數
{
    if(key==0)//判斷是否有按鍵按下
    {
        delay(10);//延時去抖
        if(key==0)
        {
            P2=0xf7;
            P0=0xff;
            while(!key);//等待按鍵松開
            P2=0xff;
            P0=0xfe;
        }

    }
}

proteus仿真:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM