单片机实验:外部中断按键
生活随笔
收集整理的這篇文章主要介紹了
单片机实验:外部中断按键
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這是之前寫的,一直沒發(fā)。
實驗內容:
實驗大致上就是說:按鍵不按的時候,燈一直亮,按鍵按下的時候,燈不亮,報警器響。現(xiàn)在給了匯編語言,要改成c語言,并在proteus里面仿真。
思考與總結:
響應中斷請求的條件:
1.總中斷允許開關EA=1。
2.中斷源的中斷允許位為1。
3.中斷源發(fā)出中斷請求。
4.無同級或更高級中斷正在被服務。
結合實驗,就知道,這里跑到中斷子程序的條件,首先總開關打開。然后選擇中斷請求源,對這個實驗來說,也就是選擇INT0 ̄\overline{INT0}INT0外部中斷請求0,它的中斷允許控制位是EX0EX0EX0,我們置1后,就說明允許了外部中斷0中斷。
我們如果選用跳沿觸發(fā),一個機器周期采樣到外部中斷輸入為高,下一個為低,那么中斷請求觸發(fā)器置一,這個時候進入中斷子程序。
這個實驗是電平觸發(fā)。
cpu查詢到中斷請求時,就會進行中斷響應(這里假設只是單一中斷,如果有不同優(yōu)先級的中斷,那么cpu還要進行判斷)。硬件生成一個長調用指令并執(zhí)行,程序轉向中斷入口地址,兩個中斷入口相隔8字節(jié),難以放下中斷子程序,此時需要一個跳轉指令,轉向在其他地址下的子程序中。
實驗結果:
匯編語言實現(xiàn):
ORG 0000hLJMP MAIN//主程序ORG 0003hLJMP INT0s//中斷入口ORG 0100h MAIN: CLR IT0//外部中斷請求0為電平觸發(fā)SETB EA//總中斷允許SETB EX0 //允許外部中斷0 LOOP: CLR P0.0//p0.0是低電平,此時燈亮SETB P2.3//p2.3是高電平,此時警報不響SJMP LOOP//短轉移指令,程序跳到loop函數(shù)循環(huán)ORG 0200h//偽指令 INT0s: SETB P0.0 //p0.0是高電平,此時燈滅CLR P2.3 //p2.3是低電平,此時警報響 Delay: MOV R0,#200//延時函數(shù) D1: MOV R1,#254 D2: DJNZ R1,D2DJNZ R0,D1RETIEND改成c51語言:
#include<reg51.h> #define uchar unsigned char sbit key = P3^2; void delay(unsigned int i)//延時函數(shù) {unsigned int j;for(;i>0;i--)for(j=0;j<333;j++){} } void main()//主函數(shù) {EA=1;//總中斷允許EX0=1;//允許外部中斷0IT0=0;//選擇外部中斷0為電平觸發(fā)方式while(1)//循環(huán){P0=0xfe;}//P0.0口的Led亮 } void key_scan() interrupt 0 //外部中斷0的中斷服務函數(shù) {if(key==0)//判斷是否有按鍵按下{delay(10);//延時去抖if(key==0){P2=0xf7;P0=0xff;while(!key);//等待按鍵松開P2=0xff;P0=0xfe;}} }proteus仿真:
總結
以上是生活随笔為你收集整理的单片机实验:外部中断按键的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux C文件编译
- 下一篇: catalog move.php,cat