實驗內容:
實驗大致上就是說:按鍵不按的時候,燈一直亮,按鍵按下的時候,燈不亮,報警器響。現在給了匯編語言,要改成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仿真: