【51微控制器實驗】INT0中斷計數
前言
—中斷源—
52微控制器:6箇中斷源:
INT0:外部中斷0,P3.2,引起:低電平、下降沿
INT1:外部中斷1,P3.3,引起:低電平、下降沿
T0:定時器/計數器0中斷,由T0計數器計滿回零引起
T1:定時器/計數器1中斷,由T1計數器計滿回零引起
T2:定時器/計數器2中斷,由T2計數器計滿回零引起
TI/RI:序列口中斷,引起:串列埠完成一幀字元傳送/接收
優先順序—51系列微控制器中用於中斷控制的暫存器為—
IE,中斷允許控制暫存器,各位定義如下:
- (外定0;外定1;串;空空;C)
EX0(IE.0),外部中斷0允許位;
ET0(IE.1),定時/計數器T0中斷允許位;
EX1(IE.2),外部中斷0允許位;
ET1(IE.3),定時/計數器T1中斷允許位;
ES (IE.4),序列口中斷允許位;
ET2(IE.5),定時器/計數器2中斷允許位(T2:51特有)
EA (IE.7), CPU中斷允許(總允許)位。
有的晶片IE.5及IE.6沒用定義。
值為1,開中斷;值為0,關中斷
- IP,中斷優先順序控制暫存器,各位定義如下:
(外定0;外定1;串定2;空空)
PX0(IP.0),外部中斷0優先順序設定位;
PT0(IP.1),定時/計數器T0優先順序設定位;
PX1(IP.2),外部中斷0優先順序設定位;
PT1(IP.3),定時/計數器T1優先順序設定位;
PS (IP.4),序列口優先順序設定位;
//PT2(IP.5) ,52晶片是無效位,定時/計數器T2優先順序設定位。
IP.6和IP.7沒有定義。
—中斷巢狀—
高優先順序能打斷低優先順序-》中斷巢狀;同優先順序則不能,按照預設級別響應,若設定優先順序,則按照設定順序相應。
—中斷函式—中斷函式是硬體或者作業系統自動呼叫的
也就是說只要滿足觸發條件,就會自動呼叫中斷函式(此時主函式是停止的)。
當中斷函式執行完畢,又返回主函式繼續執行主函式。
然後這樣不斷的迴圈,反正只要是觸發中斷的條件一滿足。
就會自動進入中斷(前提是你的中斷的配置是正確的)
實驗一
INT0中斷計數
流程圖
程式分析計數按鍵:P3.2引腳(INT0),IE=0x81(1000 0001對應:EA,EX0,ET0,EX1,ET1,ES):允許INT0中斷,
IT0=1:將INT0中斷觸發方式設為下降沿觸發:按鍵按下,P3.2由高到低觸發中斷;
未釋放,則不會持續觸發;
只有 釋放按鍵後再次按下,才會由跳變再次出發,累加計數值按鍵識別:
計數鍵:(中斷方式:interrupt 0)
中斷觸發識別,中斷觸發即表示計數鍵按下,中斷例程EX_INT0將自動呼叫,Count累加,INT0:interrupt 0清零鍵(查詢方式 while();)
while(1);實現,迴圈輪詢,不間斷檢視P3.4是否為0,若為0,清零鍵按下
擴充套件
可修改程式碼:交換計數鍵和清零鍵的工作方式。程式碼
/*每次按下計數鍵時,觸發INT0中斷,
中斷程式累加計數,
計數值顯示在3只數碼管上,按下清零鍵時數碼管清零。
*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[] = {
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x00
};//0~9的數字編碼,最後一位為黑屏
uint Count = 0;
sbit Clear_Key = P3 ^ 6;
void Show_Count_ON_DSY()//顯示計數值
{
Display_Buffer[2] = Count / 100;//獲取三個數位
Display_Buffer[1] = Count % 100 / 10;
Display_Buffer[0] = Count % 10;
if (Display_Buffer[2] == 0)//高位為0時不顯示
{
Display_Buffer[2] = 0x0a;//0x0a即是10號,對應0x00
//高位為0時,如果第二位為0,則同樣不顯示
if (Display_Buffer[2] == 0)
Display_Buffer[1] = 0x0a;
}
P0 = DSY_CODE[Display_Buffer[0]];
P1 = DSY_CODE[Display_Buffer[1]];
P2 = DSY_CODE[Display_Buffer[2]];
}
void main()
{
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
IE = 0x81;
IT0 = 1;
while (1)
{
if (Clear_Key == 0)
Count = 0;
Show_Count_ON_DSY();
}
}
void EX_INT0()interrupt 0
{
Count++;
}
後語
中斷是微控制器裡的重要組成部分,在感覺學習吃力的同時,要掌控好學習進度。(學習時間:大約5小時,注意效率!)