⑴ 51單片機中斷筆記
51單片機中斷筆記一、中斷的概念
中斷是指在CPU處理某一事件時,另一事件請求CPU迅速去處理,CPU中斷當前的工作,轉去處理該請求(中斷響應和中斷服務),待處理完畢後,再回到原來被中斷的地方繼續處理原事件(中斷返回)。這一過程類似於在看電視時,突然蹦出一個廣告,廣告播放完畢後繼續之前的節目。
二、基本中斷源
51單片機中的5個重要中斷源包括:
三、中斷結構圖
(此處插入中斷結構圖,markdown格式如下)
四、特殊功能寄存器
51單片機中與中斷相關的特殊功能寄存器主要包括:
中斷控制寄存器(IE)
EA:中斷總開關。EA=1時,CPU開放中斷;EA=0時,CPU屏蔽所有中斷申請。
ELVD:低壓檢測中斷允許位。ELVD=1時,允許低壓檢測中斷;ELVD=0時,禁止低壓檢測中斷。
EADC:ADC中斷允許位。EADC=1時,允許ADC中斷;EADC=0時,禁止ADC中斷。
ES:串列口1中斷允許位。ES=1時,允許串列口1中斷;ES=0時,禁止串列口1中斷。
ET1:定時/計數器T1的溢出中斷允許位。ET1=1時,允許T1中斷;ET1=0時,禁止T1中斷。
EX1:外部中斷1中斷允許位。EX1=1時,允許外部中斷1中斷;EX1=0時,禁止外部中斷1中斷。
ET0:定時/計數器T0的溢出中斷允許位。ET0=1時,允許T0中斷;ET0=0時,禁止T0中斷。
EX0:外部中斷0中斷允許位。EX0=1時,允許外部中斷0中斷;EX0=0時,禁止外部中斷0中斷。
中斷優先順序控制寄存器(IP)
PT1:定時器1中斷優先順序控制位。PT1=1時,定時器1中斷為最高優先順序;PT1=0時,定時器1中斷為最低優先順序。
PX1:外部中斷1優先順序控制位。PX1=1時,外部中斷1為最高優先順序;PX1=0時,外部中斷1為最低優先順序。
PT0:注意此處應為「定時器0中斷優先順序控制位」,而非原文中的「定時器1中斷優先順序控制位」。PT0=1時,定時器0中斷為最高優先順序;PT0=0時,定時器0中斷為最低優先順序。
PX0:外部中斷0優先順序控制位。PX0=1時,外部中斷0為最高優先順序;PX0=0時,外部中斷0為最低優先順序。
TCON:定時器/計數器控制寄存器
TF1:T1溢出中斷標志。TF1=1時,表示T1計數器溢出;TF1=0時,表示T1計數器未溢出。
TR1:定時器1運行控制位。TR1=1時,啟動定時器1;TR1=0時,關閉定時器1。
TF0:T0溢出中斷標志。TF0=1時,表示T0計數器溢出;TF0=0時,表示T0計數器未溢出(原文中「TF10計數器未溢出」應為筆誤,應為「TF0計數器未溢出」)。
TR0:定時器0運行控制位。TR0=1時,啟動定時器0;TR0=0時,關閉定時器0。
IE1:外部中斷1中斷請求標志位。
IT1:外部中斷1觸發方式選擇位。IT1=1時,下降沿觸發;IT1=0時,低電平觸發。
IE0:外部中斷0中斷請求標志位。
IT0:外部中斷0觸發方式選擇位。IT0=1時,下降沿觸發;IT0=0時,低電平觸發。
SCON:串口控制寄存器
SM0、SM1:串口工作模式選擇位。
SM2:多機通信控制位。
REN:串列接收允許位。
TB8:發送數據的第9位(奇偶校驗位)。
RB8:接收數據的第9位(奇偶校驗位)。
TI:發送完成中斷標志位。發送完數據後由硬體置1,進入中斷程序後需手動軟體清0。
RI:接收完成中斷標志位。接收完數據後由硬體置1,進入中斷程序後需手動軟體清0。
PCON:電源控制寄存器
SMOD:波特率選擇位。SMOD=1時,方式1、2、3的波特率加倍。
AUXR:輔助寄存器
T(0/1/2)x12:定時器(0/1/2)速度控制位。為0時,定時器是傳統8051速度,12T;為1時,定時器是傳統8051速度的12倍,1T。
UART_M0x6:串口1模式0的通信速度設置位。為0時,串口1模式0是傳統8051單片機串口速度,12T;為1時,串口1模式0是傳統8051單片機串口速度的6倍,2T。
T2R:定時器2允許控制位。為1時,允許定時器2工作。
T2_C/~T:控制定時器2作為定時器還是計數器。為0時作為定時器,為1時用作計數器。
EXTRAM:內部/外部RAM存取控制位。0時,允許使用邏輯上在片外、物理上在片內的擴展RAM;1時,禁止使用邏輯上在片外、物理上在片內的擴展RAM。
SIST2:串口1(UART1)選擇定時器2作波特率發生器的控制位。為0時,選擇定時器1作為串口1(UART1)的波特率發生器;為1時,選擇定時器2作為串口1(UART1)的波特率發生器,此時定時器1得到釋放,可以作為獨立定時器使用。
五、定時器/計數器
計數
計數是指對外部事件進行計數,外部事件的發生以輸入脈沖的形式表示。計數功能的實質是對外部脈沖進行計數,在單片機中對應引腳T0和T1兩個脈沖輸入端。外部輸入的脈沖在負跳變時有效(即外部脈沖由1變化到0),計數器加1。
定時
定時器是通過計數器的計數來實現的,不過定時器的計數脈沖來自單片機的內部,因此定時器的實質是對內部脈沖的計數。
根據單片機晶振、所選TMOD的工作方式、所要定的時間,來確定TH0和TL0所要賦予的初值。以12MHz晶振、工作方式1、16位計數器為例,設所定時間為Xus(16位計數器最大數65536,即65536us,若所定時間大於65535,則要用if語句控制,現假設X<65535):
時鍾周期的時間:t=1/12MHz=1/12us
機器周期的時間:T=12*1/12=1us
因為每經過一個機器周期計數器+1,所以計數器+1經過的時間為1us。
若所定時間為X,則要求經過Xus中斷響應,又因為16位計數器要全部置1(即達到65535+1)後,中斷才會響應,所以初值=(65536-X),將初值轉化為16進制碼,分別賦給TH0和TL0。
例如:所定時間5ms,則:
初值=(65536-5000)=60536=EC78TH0=
⑵ 51單片機如何用一個按鍵控制一段程序的運行與停止
在51單片機編程中,通過一個按鍵實現程序的運行與停止功能,操作步驟如下:首先,你需要為你的項目創建一個新的文件,這是基礎步驟,它將承載你的代碼邏輯(
1、在51單片機項目中,新建一個文件用於存放程序代碼。
)。接著,配置你的按鍵和LED。假設你選擇的按鍵S1連接到P3的第2引腳,當按鍵按下時,可以通過編程使其對應P1的第5引腳點亮LED(
2、按鍵S1的輸入設置為P3^2,LED的控制輸出則連接到P1^5,以便通過按鍵操作來控制LED的亮滅。
)。然後,進入主函數的編寫,這是程序的核心部分(
3、在C語言中,設計並實現主函數,用於程序的流程式控制制。
)。通常,我們會用一個無限循環(4、使用while(1){}結構創建循環,以實現程序的持續運行。
)來模擬程序的基本運行狀態。在主循環中,你可以選擇輸出不同的效果。然而,關鍵在於如何處理按鍵事件。當按鍵S1被按下時,程序會檢測到這一事件,並執行相應的操作(
5、在主循環中,設置按鍵S1的中斷或事件處理,使其在按下時控制LED關閉,程序開始運行。
)。再次按下按鍵,會觸發中斷,使得LED重新點亮,程序暫停(
6、再次按下S1,中斷執行,LED重新點亮,程序進入暫停狀態,等待下一次按鍵指令。
)。通過這種方式,一個簡單的按鍵就能控制51單片機程序的運行與停止,實現了用戶與硬體的交互。
⑶ 51單片機ec11編碼器中斷法
配置一個1ms定時器,並設置為自動清零模式,配置好後記得打開定時器中斷。首先要開啟定時器TIM3,我們使用這個 HAL_TIM_IC_Start_IT(htim, Channel);啟動定時器。
使用定時器回調函數
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
在裡面編寫上面的程序,因為我們將B相接在PA7引腳,所以我們使用switch case語句進行判斷引腳電平,如果單片機檢測到A相為高電平就會進入這個中斷判斷B相電平,低電平為反轉,高電平極為正轉(程序中的cnt為計數作用)。
⑷ 51單片機中的外部中斷有什麼作用
可以打個比方,每天上班你都隨時需要知道你同事的工作進度情況,你是希望你不停地打個電話去問「你做完了嗎」,還是希望他做完了主動打個電話給你講「我做完了,我們談談吧」。這就是中斷的意義,在不需要的時候不影響處理 器做其它的事情,提高效率,增強程序的實時性。
⑸ 51單片機如何用一個按鍵控制一段程序的運行與停止
1、創建項目文件。
6、當按下一個按鍵時,關閉燈,整個程序運行,再按一次,程序停止。
⑹ 關於51單片機的外部中斷使用方法
使用方法:
單片機的P2.5,P2.6,P2.7口分別接三位動態數碼管的位選端,P0口接動態數碼管的段選端。然後,P1.0口接一個電阻串聯一個LED燈然後接地,電阻取200~470歐之間就行,是一個限流電阻。
中斷用的是外部中斷0,要觸發中斷的時候,就用一根杜邦線一端接地,一端接到單片機的P3.2口就行,這樣,就滿足了你的要求了。
外部中斷的觸發方式有低電平觸發和下降沿觸發。到底是那種觸發方式,要設置中斷允許寄存器中IT0的值,如果IT0=0,像我寫的程序,就是低電平觸發,如果為1,就是下降沿觸發。
燈不是一定要接到P3.2口上的。中斷要執行的任務是在中斷函數中寫代碼控制的,就像我寫的代碼中,你只需要控制LED燈接的那個IO口就行了。
代碼如下:
#include
#define
uchar
unsigned
char
sbit
led=P1^0;
uchar
code
an[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar
code
wei[3]={0x06,0x05,0x03};
void
delay(uchar
c);
void
ini_()
//初始化函數,設置中斷觸發方式,開中斷
{
EA=1;
IT0=0;
EX0=1;
}
void
main()
{
uchar
i;
ini_();
led=0;
//由於單片機上電之後,所有的IO口默認是高電平,而要求是開始不亮,所以要將P1.0口開始設置為低電平。
while(1)
{
for(i=0;i<3;i++)
動態數碼管閃爍
{
P2=wei[i];
P0=an[i];
delay(35);
}
}
}
void
led_()
interrupt
0
//外部中斷0函數,中斷函數不需要申明
{
uchar
i;
led=1;
//在中斷中讓燈亮起來
while(1)
{
for(i=0;i<3;i++)
{
P2=wei[i];
P0=an[i];
delay(1);
}
}
}
void
delay(uchar
c)
{
uchar
a,b;
for(c;c>0;c--)
for(a=38;a>0;a--)
for(b=80;b>0;b--);
}