目錄
0案例視頻效果展示
0.1例子1:INT0控制LED閃爍
0.2例子2:INT0中斷控制數碼管計數
0.3例子3:INT0中斷實現秒表功能
0.4例子4:INT0INT1中斷控制數碼管計數
1基礎知識補充——中斷系統
1.1 中斷源一覽
1.2 控制寄存器
1.3 優先級與嵌套規則?
1.4 外部中斷細節
1.5定時器中斷?
1.6串行口中斷
1.7 中斷響應流程(精簡記憶版)?
1.8 使用技巧?
2例子1: INT0控制LED閃爍
2.1電路原理圖
2.1.1電路組成及接線
2.2控制程序
2.2.1控制程序步驟
2.2.3源代碼
3例子2:INT0中斷控制數碼管計數
3.1電路原理圖
3.1.1電路組成及接線
3.2控制程序
3.2.1控制程序步驟
3.2.3源代碼
4例子3:INT0中斷實現秒表功能
4.1電路原理圖
4.1.1電路組成及接線
4.2控制程序
4.2.1控制程序步驟
4.2.3源代碼
5例子4:INT0INT1中斷控制數碼管計數
5.1電路原理圖
5.1.1電路組成及接線
5.2控制程序
5.2.1控制程序步驟
5.2.3源代碼
? 6??硬件工程師筆試面試相關文章鏈接(部分鏈接)
摘要:本文介紹了基于51單片機外部中斷(INT0/INT1)的四個實踐案例:1)INT0控制LED開關;2)INT0中斷實現數碼管計數/清零;3)INT0中斷構建秒表功能(啟動/暫停/清零);4)INT0/INT1雙中斷獨立控制兩組數碼管計數。每個案例包含電路原理圖、接線說明及完整源代碼,重點演示了外部中斷在硬件控制中的應用方法。附加硬件工程師筆試面試資料鏈接,涵蓋器件知識、Multisim教程等內容,適合嵌入式學習者參考實踐。
0案例視頻效果展示
0.1例子1:INT0控制LED閃爍
例子25:INT0控制LED閃爍
0.2例子2:INT0中斷控制數碼管計數
例子26:INT0中斷控制數碼管計數
0.3例子3:INT0中斷實現秒表功能
例子27:INT0中斷實現秒表功能
0.4例子4:INT0INT1中斷控制數碼管計數
例子28:INT0INT1中斷控制數碼管計數
1基礎知識補充——中斷系統
AT89C52的中斷系統=“6 組固定中斷向量 + 1 組共用中斷向量 + 2 級優先級管理”
1.1 中斷源一覽
編號 | 向量地址 | 標志位 | 源/功能 | 觸發方式 |
0 | 0003H | IE0 | 外部中斷 0 (INT0) | 低電平 / 下降沿 |
1 | 000BH | TF0 | 定時器 0 溢出 | 內部計數溢出 |
2 | 0013H | IE1 | 外部中斷 1 (INT1) | 低電平 / 下降沿 |
3 | 001BH | TF1 | 定時器 1 溢出 | 內部計數溢出 |
4 | 0023H | RI/TI | 串行口 (UART) | 收完/發完 1 字節 |
5 | 002BH | TF2+EXF2 | 定時器 2 | 溢出或捕獲/重載 |
共 8 個“物理”中斷源,但向量只有 6 個(T2 兩個標志共用 002BH)。
1.2 控制寄存器
1. IE(A8H)——總中斷允許?
?? EA? ES? ET2? ES? ET1? EX1? ET0? EX0?
?? 1 = 允許;0 = 屏蔽?
2. IP(B8H)——優先級(1 = 高優先級,0 = 低優先級)?
?? —?? —?? PT2? PS? PT1? PX1? PT0? PX0?
?? 8052 新增 PT2,其余位含義同 8051。?
3. T2CON(C8H)——T2 專用?
?? TF2、EXF2 由軟件清 0。?
1.3 優先級與嵌套規則?
兩級:高優先級可打斷低優先級,同級不嵌套。?
同優先級內部再按自然序號 0→5 排隊。?
1.4 外部中斷細節
IT0/IT1(TCON.0/TCON.2)?
0 = 低電平觸發(需手動撤除低電平才能再次觸發)?
1 = 下降沿觸發(自動鎖存,脈沖寬度 ≥ 1 機器周期即可)?
1.5定時器中斷?
TF0/TF1 在計數器溢出時置 1,CPU 響應后硬件自動清 0。?
TF2/EXF2 共用向量,中斷服務程序需判斷是溢出還是捕獲/重載,再分別清 0。
1.6串行口中斷
RI 和 TI 共用向量,進入服務程序后先讀 SCON 判定是“接收完”還是“發送完”,再清相應標志。
1.7 中斷響應流程(精簡記憶版)?
1. 標志置位 → 2. 總中斷 EA=1 且對應位允許 → 3. 優先級仲裁 → 4. 完成當前指令 → 5. 自動把 PC 壓棧 → 6. 裝入向量地址 → 7. 執行 ISR → 8. RETI 返回。
1.8 使用技巧?
下降沿觸發外部中斷時,ITn=1 可避免“電平保持”誤觸發。?
高優先級 ISR 里可再被更高優先級打斷,但同級或低優先級不能打斷。?
T2 的 TF2/EXF2 必須軟件清 0,否則會不停地進入中斷。
2例子1: INT0控制LED閃爍
實現功能:(外部INT0中斷控制LED):每次按鍵都會觸發INT0中斷,中斷發生時將LED狀態取反,產生LED狀態由按鍵控制的效果
本質:按鍵每次觸發INT0中斷,中斷服務程序將LED電平取反,實現按鍵控制LED開關。
2.1電路原理圖
2.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0—>LED燈 P3.2—>按鍵開關 |
復位電路 | |
晶振電路 | |
LED燈 | |
按鍵開關 |
2.2控制程序
2.2.1控制程序步驟
庫文件和引腳定義
主程序(LED閃爍)
INT0中斷函數
2.2.3源代碼
//(外部INT0中斷控制LED):每次按鍵都會觸發INT0中斷,中斷發生時將LED狀態取反,產生LED狀態由按鍵控制的效果#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P0^0;//主程序void main(){LED=1;EA=1;EX0=1;IT0=1;while(1);}//INT0中斷函數void EX_INT0() interrupt 0{LED=~LED; ???? //控制LED亮滅}
3例子2:INT0中斷控制數碼管計數
實現功能:每次按下計數鍵時觸發INT0中斷,中斷程序累加計數,? 計數值顯示在3只數碼管上,按下清零鍵時數碼管清零
本質:按鍵觸發INT0中斷即計數并刷新數碼管,清零鍵直接歸零。
3.1電路原理圖
3.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0-P0.7—>計數數碼管 P1.0-P1.7—>計數數碼管 P2.0-P2.7—>計數數碼管 P3.2/P3.6—>按鍵開關 |
復位電路 | |
晶振電路 | |
計數數碼管 | |
按鍵開關 | |
排阻 |
3.2控制程序
3.2.1控制程序步驟
庫文件
段碼
分解顯示數位
示數
主程序(數值顯示)
INT0中斷函數
3.2.3源代碼
//計數:每次按下計數鍵時觸發INT0中斷,中斷程序累加計數,? 計數值顯示在3只數碼管上,按下清零鍵時數碼管清零#include<reg51.h>#define uchar unsigned char#define uint unsigned int//0~9的段碼uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//計數值分解后各個待顯示的數位uchar DSY_Buffer[]={0,0,0};uchar Count=0;sbit Clear_Key=P3^6;//數碼管上顯示計數值void Show_Count_ON_DSY(){DSY_Buffer[2]=Count/100;????? //獲取3個數DSY_Buffer[1]=Count%100/10;DSY_Buffer[0]=Count%10;if(DSY_Buffer[2]==0)?? //高位為0時不顯示{DSY_Buffer[2]=0x0a;if(DSY_Buffer[1]==0)?? //高位為0,若第二位為0同樣不顯示DSY_Buffer[1]=0x0a;}P0=DSY_CODE[DSY_Buffer[0]];P1=DSY_CODE[DSY_Buffer[1]];P2=DSY_CODE[DSY_Buffer[2]];}//主程序void main(){P0=0x00;P1=0x00;P2=0x00;IE=0x81;? //允許INT0中斷IT0=1;?????????????? //下降沿觸發while(1){if(Clear_Key==0) Count=0;????? //清0Show_Count_ON_DSY();}}//INT0中斷函數void EX_INT0() interrupt 0{Count++; ??????? //計數值遞增}
4例子3:INT0中斷實現秒表功能
實現功能:能夠實現秒表作用,首次按鍵計時開始,再次按鍵暫停,第三次按鍵清零。
本質:按鍵循環控制:首次啟動計,再次暫停,第三次清零,實現秒表功能。
4.1電路原理圖
4.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P0.0-P0.7—>計數數碼管/排阻 P1.0-P1.7—>計數數碼管 P3.7—>按鍵開關 |
復位電路 | |
晶振電路 | |
兩個數碼管 | |
按鍵開關 | |
排阻 |
4.2控制程序
4.2.1控制程序步驟
庫文件和引腳定義
段碼
延時函數
按鍵處理函數
主程序(數值顯示)
INT0中斷函數
4.2.3源代碼
//功能:首次按鍵計時開始,再次按鍵暫停,第三次按鍵清零。#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K1=P3^7;uchar i,Second_Counts,Key_Flag_Idx;bit Key_State;uchar DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//延時void DelayMS(uint ms){uchar t;while(ms--) for(t=0;t<120;t++);}//處理按鍵事件void Key_Event_Handle(){if(Key_State==0){Key_Flag_Idx=(Key_Flag_Idx+1)%3;switch(Key_Flag_Idx){case 1:???? EA=1;ET0=1;TR0=1;break;case 2:???? EA=0;ET0=0;TR0=0;break;case 0:???? P0=0x3f;P2=0x3f;i=0;Second_Counts=0;}}}//主程序void main(){P0=0x3f;?????????????????? ????? //顯示00P2=0x3f;i=0;Second_Counts=0;?Key_Flag_Idx=0;????????????? ????? //按鍵次數(取值0,1,2,3)Key_State=1;?????????? ????? //按鍵狀態TMOD=0x01;??????????????????????????? //定時器0方式1TH0=(65536-50000)/256;?????????????? //定時器0:15msTL0=(65536-50000)%256;while(1){if(Key_State!=K1){DelayMS(10);Key_State=K1;Key_Event_Handle();}}}//INT0中斷函數void DSY_Refresh() interrupt 1{TH0=(65536-50000)/256;?????????????? //恢復定時器0初值TL0=(65536-50000)%256;if(++i==2)????????????????????????? //50ms*2=0.1s轉換狀態{i=0;Second_Counts++;P0=DSY_CODE[Second_Counts/10];P2=DSY_CODE[Second_Counts%10];if(Second_Counts==100) Second_Counts=0; //滿100(10s)后顯示00}}
5例子4:INT0INT1中斷控制數碼管計數
實現功能:每次按下第1個計數鍵時,第1組計數值累加并顯示在右邊3只數碼管上, 每次按下第2個計數鍵時,第2組計數值累加并顯示在左邊3只數碼管上,后兩個按鍵分別清零。
本質:左右各三管,分別由兩鍵獨立計數與清零,互不干擾。
5.1電路原理圖
5.1.1電路組成及接線
名稱 | 接線 |
AT89C51單片機 | XTAL1/XTAL2—>連接晶振電路 RST—>連接復位電路 P2.0-P1.3—>6位數碼管 P3.2-P3.5—>按鍵 |
復位電路 | |
晶振電路 | |
6位數碼管 | |
按鍵 |
5.2控制程序
5.2.1控制程序步驟
庫文件和引腳定義
數碼管段碼和位碼定義
數據顯示函數
主程序(數值顯示)
INT0中斷函數
INT1中斷函數
5.2.3源代碼
//功能:每次按下第1個計數鍵時,第1組計數值累加并顯示在右邊3只數碼管上,每次按下第2個計數鍵時,第2組計數值累加并顯示在左邊3只數碼管上,后兩個按鍵分別清零。#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit K3=P3^4;? //2個清零鍵sbit K4=P3^5;//數碼管段碼與位碼uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};uchar code DSY_Scan_Bits[]={0x20,0x10,0x08,0x04,0x02,0x01};//2組計數的顯示緩沖,前3位一組,后3位一組uchar data Buffer_Counts[]={0,0,0,0,0,0};uint Count_A,Count_B=0;//延時void DelayMS(uint x){uchar t;while(x--) for(t=0;t<120;t++);}//數據顯示void Show_Counts(){uchar i;Buffer_Counts[2]=Count_A/100;Buffer_Counts[1]=Count_A%100/10;Buffer_Counts[0]=Count_A%10;if(???? Buffer_Counts[2]==0){Buffer_Counts[2]=0x0a;if(???? Buffer_Counts[1]==0)Buffer_Counts[1]=0x0a;}Buffer_Counts[5]=Count_B/100;Buffer_Counts[4]=Count_B%100/10;Buffer_Counts[3]=Count_B%10;if(???? Buffer_Counts[5]==0){Buffer_Counts[5]=0x0a;if(???? Buffer_Counts[4]==0)Buffer_Counts[4]=0x0a;}for(i=0;i<6;i++){P2=DSY_Scan_Bits[i];P1=DSY_CODE[Buffer_Counts[i]];DelayMS(1);}}//主程序void main(){IE=0x85;PX0=1;???? //中斷優先IT0=1;IT1=1;while(1){if(K3==0) Count_A=0;if(K4==0) Count_B=0;Show_Counts();}}//INT0中斷函數void EX_INT0() interrupt 0{Count_A++; ??}//INT1中斷函數void EX_INT1() interrupt 2{Count_B++; ??}
? 6??硬件工程師筆試面試相關文章鏈接(部分鏈接)
更多文章可前往主頁觀看
1、硬件工程師筆面試真題匯總(2025版本)_硬件工程師面試題-CSDN博客https://blog.csdn.net/XU157303764/article/details/140742900?spm=1011.2415.3001.5331硬件工程師筆試面試高頻考點匯總——(2025版)_電容或者電感對鎖存器的影響-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1488349782、硬件工程師筆試面試匯總(2025版本)_硬件工程師面試題-CSDN博客
https://blog.csdn.net/XU157303764/article/details/1419048583、硬件工程師筆試面試學習匯總——器件篇目錄(2025版本)_【【硬件工程師煉成之路】器件篇(更新中。。。)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/142316204
硬件工程師筆記——電子器件匯總大全-CSDN博客https://blog.csdn.net/XU157303764/article/details/147342935?spm=1011.2415.3001.5331Multisim14使用教程詳盡版--(2025最新版)-CSDN博客
https://blog.csdn.net/XU157303764/article/details/147197406?spm=1011.2415.3001.5331