導航:首頁 > 操作系統 > 51單片機中斷編程方法

51單片機中斷編程方法

發布時間:2023-06-01 05:45:54

① 51單片機中斷編程

外部中斷信號接到P3.3口,為INT0中斷,程序如下
#include<reg51.h>
sbit X0=P1^0; //用X0表示P1.0
sbit X1=P1^1; //用X0表示P1.1
sbit X2=P1^2; //用X0表示P1.2
void main(void)
{
P1=0x00; //將P1口初始化位高電平,如果沒有這句,初始化為低電平,這里可根據需要選擇
EA=1; //中斷允許
IT1=1; //觸發方式為下降沿觸發
EX1=1; //外部中斷允許

while(1); //這里可以隨便寫你需要的主程序,我用了個死循環,目的是等待中斷
}

void counter1(void) interrupt 2 //INT1中斷
{
EX1=0; //禁止外部中斷
ET0=1; //計時器中斷0允許
ET1=1; //計時器中斷1允許
TMOD=0x21; //T1用模式2、T0用模式1
IP=0x0a; //T1、T0為高優先順序
X2=~X2; //每次中斷就取反P1.2引腳
X1=1; //P1.1輸出低電平0.3ms
X0=1; //P1.0輸出低電平1.5ms
TH0=0xfd; //T0用模式1,16位計時器,在1.5ms後執行時間中斷0
TL0=0x12;
TH1=0x6a; //T1用模式2,8位計時器,在0.3ms執行時間中斷1
TL1=0x6a;
TR1=1; //啟動計時器T1
TR0=1; //啟動計時器T0
while(X0==1); //等待中斷響應完成
EX1=1; //允許外部中斷

}
void counter2(void) interrupt 1 //定時器0中斷
{
X0=0;
}
void counter3(void) interrupt 3 //定時器1中斷
{
X1=0;
}
程序已經經過模擬調試,可以完成你的要求,等待加分中。。。。
PS一下,如果滿意的話,十分期待給好評,謝謝了

② 51單片機中斷程序怎麼寫

用c語言的話中斷程序是單獨寫在中斷服務函數中的,51單片機的中斷服務函數的定義:
void functionname(void) interrupt num //functionname是自己定義的函數名字,num對應實際的中斷向量號

③ 51單片機中斷程序怎麼寫

主函數:
EX0=1;
//外部中斷0
IT0=1;
//
1:下降沿觸發、0:低電平觸發
EA=1;
//開啟總中斷
中斷子程序:
void
inter0()
interrupt
0
{}
外部中斷1將0換成1。

④ 51單片機中斷執行過程坐等!!!

51單片機中斷執行過程, 如外部中斷。
當 CPU 檢測到 有 中斷觸發 信號後,
首先 執行完成 當前執行的指令,將下一條指令 的 地址 壓入堆棧,
CPU 進入中斷 入口 地址,開始 執行 中斷服務程序,
(當然在中斷服務程序中不能破壞正常運行 程序的各種 寄存器的 狀態 和 數據,)
中斷服務 程序執行 完成, 最後 執行 一條 RETI 的中斷返回指令,
堆棧 彈出 原先保存的 地址,完成中斷服務程序,返回中斷前的 下一條指令地址
繼續執行 正常程序。

⑤ 關於51單片機的中斷。

、中斷的概念
CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理(中斷發生);
CPU暫時中斷當前的工作,轉去處理事件B(中斷響應和中斷服務);
待CPU將事件B處理完畢後,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷

二、中斷源
在51單片機中有5個中斷源
中斷號 優先順序 中斷源 中斷入口地址
0 1(最高) 外部中斷0 0003H
1 2 定時器0 000BH
2 3 外部中斷1 0013H
3 4 定時器1 0018H
4 5 串口總段 0023H

三、中斷寄存器
單片機有10個寄存器主要與中斷程序的書寫控制有關
1.中斷允許控制寄存器IE
2.定時器控制寄存器TCON
3.串口控制寄存器SCON
4.中斷優先控制寄存器IP
5.定時器工作方式控制寄存器TMOD
6.定時器初值賦予寄存器(TH0/TH1,TL0/TL1)
寄存器詳細說明:http://blog.sina.com.cn/s/blog_a05b986d0101545c.html

四、寄存器功能與賦值說明
註:在用到中斷時,必須要開總中斷EA,即EA=1。 //開總中斷
1.中斷允許控制寄存器IE

EX0(EX1):外部中斷允許控制位
EX0=1 外部中斷0開關閉合 //開外部0中斷
EX0=0 外部中斷0開關斷開
ET0(ET1):定時中斷允許控制位
ET0=1 定時器中斷0開關閉合 //開內部中斷0
ET0=0 定時器中斷0開關斷開
ES: 串口中斷允許控制位
ES=1 串口中斷開關閉合 //開串口中斷
ES=0 串口中斷開關斷開
2.定時器控制寄存器 TCON //控制外部中斷和定時器中斷

外部中斷:
IE0(IE1):外部中斷請求標志位
當INT0(INT1)引腳出現有效的請求信號,此位由單片機自動置1,cpu開始響應,處理終端,而當入
中斷程序後由單片機自動置0.
//外部中斷,即外部中斷相應的引腳接入低電平或下降沿信號時,中斷開始響應。
IT0(IT1):外部中斷觸發方式控制位 //選擇有效信號
IT0(IT1)=1:脈沖觸發方式,下降沿有效。
IT0(IT1)=0:電平觸發方式,低電平有效。
內部中斷:
TF0(TF1):內部定時器/計數器溢出中斷標志位
當定時器、計數器計數溢出的時候,此位由單片機自動置1,cup開始響應,處理中斷,而當進入中
斷程序後由單片機自動置0.
//內部中斷實際上就是利用內部的計數器,只不過提供計數的脈沖來自單片機自身。
TRO(TR1):定時器/計數器啟動位 //啟動定時器
TRO(TR1)=1; 啟動定時器/計數器0
TR0(TR1)=0; 關閉定時器/計數器0
3.串口控制寄存器SCON

TI:串列口發送中斷標志位
當單片機串口發送完一幀數據後,此位由單片機自動置1,而當進入中斷服務程序後是不會自動清0的,
必須由用戶在中斷服務中用軟體清0.
RI:串列口接收中斷標志位
當單片機串口接收完一幀數據後,此位由單片機自動置1,而當進入中斷服務程序後是不會自動清0的,
必須由用戶在中斷服務軟體中用軟體清0.
(IP以後補上,TMOD,TL0/TH0 在定時器/計數器中講)

五、中斷結構圖:

六、定時器/計數器
1.計數的定義:
計數是指對外部事件進行計數,外部事件的發生以輸入脈沖的形式表示,因此計數功能的實質就是對外來
的脈沖進行計數,在單片機中對應引腳T0和T1,兩個脈沖輸入端。
外部輸入的脈沖在負跳變時有效(即外部脈沖由1變化到0),計數器加1.
2.定時器:
定時器是通過計數器的計數來實現的,不過此時的計數脈沖來自單片機的內部,因此定時器的實質是對內
部脈沖的計數,在單片機中,每個機器周期產生一次計數脈沖,計數器加1.
3.工作方式控制寄存器TMOD:

TMOD的低半位元組(D0,D1,D2,D3)用來控制定時器/計數器0
TMOD的高半位元組(D4,D5,D6,D7)用來控制定時器/計數器1
對TMOD中的內容說明:
GATE——門控制。
GATE=1時,由外部中斷引腳INT0、INT1來啟動定時器T0、T1。
當INT0引腳為高電平時TR0置位,啟動定時器T0;
當INT1引腳為高電平時TR1置位,啟動定時器T1。
GATE=0時,僅由TR0,TR1置位分別啟動定時器T0、T1。
C/T——功能選擇位
C/T=0時為定時功能,C/T=1時為計數功能。
M0、M1——方式選擇功能
由於有2位,因此有4種工作方式

4.根據單片機晶振,所選TMOD的的工作方式,所要定的時間,來確定THO和TLO所要賦予的初值
(以12M晶振,工作方式1,16位計數器為例,設所定時間為Xus(16為計數器最大數65536,即65536us,若所
定時間大於65535,則要用if語句控制,現假設X<65535))
1.時鍾周期的時間t=1/12M=1/12 us
2.機器周期的時間T=12*1/12=1 us
3.因為每經過一個機器周期計數器+1,所以,計數器+1,經過的時間為 1 us。
若所定時間為X,則要求經過Xus,中斷響應,又因為16為計數器要全部置1(即達到65535)+1後,中斷才會
響應,所以,初值=(65536-X)
4.將初值轉化為16進制碼,分別付給THO和TLO
eg:所定時間5ms
初值=(65536-5000)=60536=EC78
TH0=0XEC; TL0=0X78;
(當工作方式不同時,TH0/TL0的賦值也不同,個人覺得有了16位計數器了,其餘的沒什麼用,不介紹了)
5.寫程序時另一種THO/TLO賦值方法
TH0=(65536-20000)/256;
TL0=(65536-20000)%6;
這樣設置,每經過20ms,發生一次中斷,中斷時間一般以秒為單位,所以經過n次中斷即可。

⑥ c51單片機如何使用中斷

將按鍵接到P3.2(INT0)或P3.3(INT1)

main(){
EA=1;//EA總中斷控制,EA=0關,EA=1開
EX0=1;//INT0中斷控制。0關1開,按鍵接P3.2用這個
EX1=1;//INT1中斷控制。0關1開,按鍵接P3.3用這個
//默認情況下,直接使EX0=1或EX1=1來打開中斷,INT0、INT1中斷是電平觸發的
while(1){
//主程序寫這里
}
}

/**外部中斷0服務程序,按下接P3.2的開關k=0下面程序被執行**/
int0()interrupt0
{
//程序代碼寫這裡面
}

/**外部中斷1服務程序,按下接P3.3的開關k=0下面程序被執行**/
int1()interrupt2
{
//程序代碼寫這裡面
}

注意,上面的中斷程序,如果執行完後,按鍵k還沒有放開,則中斷程序會再次被執行。為了防止這種情況發生,有以下幾種處理辦法以:

(1)可以在中斷程序中進行判斷,只有放開了按鈕k=1了中斷函數才返回。

(2)可以在進入中斷後關閉中斷,讓EX0或EX1=0。然後在主程序中,需要的時候再開起。

⑦ 51單片機匯編語言定時器的使用(中斷方式)

(1)
COUNT_INTEQU30H
LEDVALUEEQU31H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt

START:
MOVSP,#60H
MOVCOUNT_INT,#0
MOVLEDVALUE,#01H
LCALLInitTimer1

LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP

InitTimer1:
MOVTMOD,#10H;定時器T1為工作方式1,產生50ms定時
MOVTH1,#3CH
MOVTL1,#0B0H
SETBEA
SETBET1
SETBTR1
RET

Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#3CH
MOVTL1,#0B0H
;========================
INCCOUNT_INT
MOVA,COUNT_INT;每50ms加1,
CJNEA,#2,Timer1Interrupt_EXIT;100ms
MOVCOUNT_INT,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI

END
(2)
COUNT_INT_LEQU30H
COUNT_INT_HEQU31H
LEDVALUEEQU32H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt

START:
MOVSP,#60H
MOVCOUNT_INT_L,#0
MOVCOUNT_INT_H,#0
MOVLEDVALUE,#01H
LCALLInitTimer1

LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP

InitTimer1:
MOVTMOD,#20H;定時器T1為工作方式2,產生250us定時
MOVTH1,#00H
MOVTL1,#06H
SETBEA
SETBET1
SETBTR1
RET

Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#00H
MOVTL1,#06H
;========================
INCCOUNT_INT_L
MOVA,COUNT_INT_L;每250us加1,
CJNEA,#40,Timer1Interrupt_EXIT;250US*40=10ms
MOVCOUNT_INT_L,#0
INCCOUNT_INT_H
MOVA,COUNT_INT_H;每10Ms加1,
CJNEA,#10,Timer1Interrupt_EXIT;10ms*10=100MS
MOVCOUNT_INT_H,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI

END

⑧ 51單片機定時中斷C語言的寫法步驟,可追加分數

程序說明:51單片機定時器0工作於方式一,定時50ms中斷一次
晶振為12M
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
ET0
=
1;
//開定時器0中斷
EA
=
1;
//開總中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
(65536-50000)/256;
//高八位裝入初值
TL1
=
(65536-50000)%256;
//低八位裝入初值
}
/***************************************************************************************************************/
上面是比較好理解的。如果實在要求簡潔的話,看下面的,跟上面功能一樣
#include

void
main
{
TOMD
=
0X01;
//配置定時器0工作於方式一
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值
IE
=
0x82;//開總中斷並開定時器0中斷
TR0
=
1;
//啟動定時器0
while(1)
{

}
}
void
Timer0_int()
interrupt
1
{
//重新裝初值
TH1
=
0x3c;
//高八位裝入初值
TL1
=
0xb0;
//低八位裝入初值}

⑨ 51單片機中斷程序怎麼寫

//sbit zd=P3^2; //外部中斷口 //unsigned char a; void main(void)//主函數{TCON=0x01;EX0=1; //外部中斷允許 EA=1;//開總中斷while(1){//其他程序}} void int0(void) interrupt 0 //外部中斷0 中斷子程序{//這裡面可以寫中斷子程序/*a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //開關計時器 else TR0=0;*/} 由於對你的要求「按下INTO接的按鍵,使單片機執行間隔四燈輪流閃爍的中斷子程序」不夠理解,只能給你這樣一個程序框架了 進入中斷要執行中斷子程序,不同的中斷源要進入不同的中斷子程序。對於51的C編程,可以用中斷標號,如『interrupt 0』來使中斷進入不同的中斷。 中斷標號與它們的中斷優先順序一致,即 外部中斷0 interrupt 0 定時器中斷0 interrupt 1 外部中斷1 interrupt 2 定時器中斷1 interrupt3

閱讀全文

與51單片機中斷編程方法相關的資料

熱點內容
加密思維幣 瀏覽:686
魅族訪客文件夾 瀏覽:48
添加的文件夾怎麼找 瀏覽:613
程序員涉黃 瀏覽:698
maven編譯resources下的js 瀏覽:519
ubuntu文件移動命令 瀏覽:227
安卓i怎麼查找蘋果手機 瀏覽:949
雲伺服器宕機概率 瀏覽:229
在線買葯用什麼app知乎 瀏覽:813
ubuntu解壓xz文件 瀏覽:674
宏傑加密時電腦關機 瀏覽:388
自己寫單片機編譯器 瀏覽:598
單片機按鍵閃爍 瀏覽:380
為什麼icloud總是顯連接伺服器失敗 瀏覽:888
如何設置域控伺服器 瀏覽:738
想在上海租房子什麼app好 瀏覽:185
編譯程序各部分是必不可少的嗎 瀏覽:886
編程不超過十行 瀏覽:764
數電編譯器的作用 瀏覽:338
時間演算法與現在有什麼區別 瀏覽:164