找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 14793|回復(fù): 2
收起左側(cè)

第3章 單片機定時器/計數(shù)器、中斷系統(tǒng)

[復(fù)制鏈接]
ID:111078 發(fā)表于 2016-3-28 01:24 | 顯示全部樓層 |閱讀模式
51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全
編著:http://www.torrancerestoration.com/bbs/dpj-37954-1.html



(1) 定時器/計數(shù)器

1 單片機定時器/計數(shù)器工作原理概述
2 定時器/計數(shù)器的相關(guān)寄存器
3 初值計算
4 編程舉例
(2) 中斷系統(tǒng)
%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-4.jpg

1 中斷系統(tǒng)結(jié)構(gòu)圖
2 操作電路圖中的開關(guān)(相關(guān)寄存器介紹)
3 編寫中斷函數(shù)
4 中斷程序舉例
5 外中斷代碼調(diào)試(按鍵的防抖技術(shù))
(1) 定時器/計數(shù)器

IAP15W4K58S4單片機內(nèi)部包含了下面與定時中斷功能有關(guān)的模塊:

① 5個16位的定時器/計數(shù)器(T0、T1、T2、T3、T4),不僅可方便 的用于定時控制,而且還可以用于對外部脈沖信號進行計數(shù)。

② 6個引腳同時輸出時鐘功能(5路定時器時鐘 + 1路主時鐘),可給外部 器件提供時鐘脈沖信號(最高頻率可達13.5MHz)。
③ 2個引腳連接內(nèi)部PCA模塊, 通過功能選擇可將PCA模塊用作外部中

斷(2通道)、定時器、時鐘輸出和脈寬調(diào)制PWM輸出。

④ 5個外中斷輸入口(INT0、INT1、/INT2、/INT3、/INT4),INT0與 INT1既可上升沿觸發(fā)也可下降沿觸發(fā),/INT2、/INT3和/INT4只能 下降沿觸發(fā)。

1 單片機定時器/計數(shù)器工作原理概述
IAP15W4K58S4單片機定時器/計數(shù)器結(jié)構(gòu)示意圖如圖3-1所示,同一個模塊當(dāng)用 于內(nèi)部系統(tǒng)時鐘計數(shù)時稱為定時器,當(dāng)用于外部輸入脈沖計數(shù)時稱為計數(shù)器。

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-1.jpg

圖3-1 定時器/計數(shù)器原理示意圖( x = 0、1、2、3、4)

定時器/計數(shù)器的核心是一個加1計數(shù)器,加1計數(shù)器的脈沖有兩個來源,一個是 單片機引腳輸入的外部脈沖信號源,另一個是CPU實際運行的系統(tǒng)時鐘SYSclk,當(dāng) 程序中沒有對CPU的時鐘分頻器進行額外設(shè)置時,系統(tǒng)時鐘SYSclk就等于外部晶體 振蕩器或內(nèi)部R/C時鐘頻率,計數(shù)器對這兩個脈沖源之一進行輸入計數(shù),每輸入一 個脈沖,計數(shù)值加1,當(dāng)計數(shù)到計數(shù)器為全1時,再輸入一個脈沖就使計數(shù)值回零, 同時從最高位溢出一個脈沖使特殊功能寄存器TCON的TFx位置1,作為計數(shù)器的溢 出中斷標(biāo)志,當(dāng)脈沖源選擇內(nèi)部系統(tǒng)時鐘SYSclk時,在每個時鐘周期計數(shù)器加1或

12個時鐘周期計數(shù)器加1(默認值是12個時鐘周期加1 ),由于計數(shù)脈沖的周期是 固定的,所以脈沖數(shù)乘以脈沖周期就是定時時間,此為定時器功能。

允許外部最高輸入信號頻率:當(dāng)脈沖源選擇外部引腳輸入的脈沖時,就是對外部

事件計數(shù)的計數(shù)器,當(dāng)外部引腳上有一個從1到0的負跳變時計數(shù)值加1,由于系 統(tǒng)每個時鐘對外部計數(shù)器引腳采樣1次,當(dāng)前一次采樣到外部引腳為高電平而后 一次采樣到低電平則形成一個負跳變,因此確認外部輸入信號的一次負跳變至少 需要2個系統(tǒng)時鐘周期,實際上,引腳輸入通道中還有一個同步采樣與邊沿檢測 電路,致使外部輸入信號的最高允許頻率不能大于系統(tǒng)時鐘頻率SYSclk的1/4, 比如CPU運行的系統(tǒng)時鐘為22.1184MHz,允許外部最高輸入信號頻率為

22.1184MHz/4 = 5.5926 MHz,如果頻率高于這個值,輸入信號的部分脈沖在檢 測過程中會被丟失,若用著頻率計,表現(xiàn)結(jié)果是測量得到的頻率比真實頻率低。

特殊功能寄存器:從這個示意圖我們可以看到2個開關(guān)符號,后面將會介紹的 詳細結(jié)構(gòu)圖中有更多的開關(guān)符號,我們使用單片機內(nèi)部功能模塊就是要把這些 電路開關(guān)合上或斷開,這些開關(guān)的合上或斷開是直接由特殊功能寄存器控制 的,因此我們要控制開關(guān)實際是控特殊功能寄存器,為了方便,后面把特殊功 能寄存器簡稱為寄存器

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-5.jpg
表3-1 定時器/計數(shù)器方式寄存器TMOD(地址89H,復(fù)位值為0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名 稱

GATE

C/T

M1

M0

GATE

C/T

M1

M0

T1 T0
GATE:門控位,用于外部引腳控制定時器啟動與停止。
0:每當(dāng)TR0/TR1置位時,就啟動定時器工作。
1:外部引腳INT0/INT1為高電平且TR0/TR1置位時,啟動定時器工作。
GATE門控位實際中一般都不會使用,不管用于定時還是計數(shù),都直接設(shè)為0
即可,在定時計數(shù)器T2、T3、T4干脆直接去掉了GATE門控位。

C/T : 設(shè)為0用于內(nèi)部定時,設(shè)為1用于外部計數(shù)。

M1M0 :

00 : 16位自動重裝定時計數(shù),當(dāng)溢出時將RL_TH和RL_TL的值自動裝入 TH和TL
中,推薦使用首選(重點學(xué)習(xí)) 。
01 : 16位定時計數(shù),傳統(tǒng)單片機使用得較普遍,在一些特殊運用場合比如后面章 節(jié)將會介紹的斷電存儲定時器,只能采用這種非自動重裝方式。
10 : 8位自動重裝定時計數(shù),當(dāng)溢出時將TH的值自動裝入TL中。
11 : 對于T1,停止計數(shù),等同于將TR1設(shè)置為0。 對于T0,在運行過程中,中斷一旦開啟就無法關(guān)閉,稱為不可屏蔽中斷的16
位自動重裝定時器,可用于操作系統(tǒng)的節(jié)拍定時器。
D7
D6
D5
D4
D3
D2
D1
D0
位名稱
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
定時.計數(shù) 中斷
TF1:T1溢出標(biāo)志位,計數(shù)器溢出時此位自動置1,進入相應(yīng)中斷函數(shù)后則由硬 件清零,若沒編寫中斷函數(shù)則必須由軟件清零。
TF0: T0溢出標(biāo)志位,功能與TF1類似。
TR1:T1運行控制位,置1啟動定時器,置0關(guān)閉定時器。
TR0:T0運行控制位,置1啟動定時器,置0關(guān)閉定時器。
表3-3 輔助寄存器AUXR(地址8EH,復(fù)位值為0000 0001B)
D7
D6
D5
D4
D3
D2
D1
D0
位名稱
T0x12
T1x12
UART_M0x6
T2R
T2_C/T
T2x12
EXTRAM
S1ST2
T0x12:定時器0速度控制位。 0:12分頻 ,1:不分頻 。

T1x12:定時器1速度控制位。 0:12分頻 ,1:不分頻 。

nUART_M0x6:串口1模式0的通信速度設(shè)置位。 0:12分頻 ,1:6分頻 。
注:串口1模式0是移位寄存器方式,無實際用途,不用學(xué)
nT2R:定時器2運行控制位。置1啟動,置0關(guān)閉。
nT2_C/T :選擇定時器2作定時器或計數(shù)器。
0:用作定時器(計數(shù)脈沖從內(nèi)部系統(tǒng)時鐘輸入)。
1:用作計數(shù)器(計數(shù)脈沖從P3.1/T2引腳輸入)。
nT2x12:定時器2速度控制位。 0:12分頻 ,1:不分頻 。
0:12分頻,定時器T2 每12個時鐘周期計數(shù)一次。
1:不分頻,定時器T2 每1個時鐘周期計數(shù)一次。 如果串口(UART1~UART4)用T2作為波特率發(fā)生器,T2x12位決定串口
是12T 還是1T(高速通信需要1T ,后面章節(jié)會講)。
nEXTRAM:用于設(shè)置是否允許使用內(nèi)部3840字節(jié)的擴展RAM。
0:允許,1:禁止。
nS1ST2:串口1(UART1)選擇定時器2作為波特率發(fā)生器的控制位。
0:選擇定時器T1作為串口1(UART1)的波特率發(fā)生器
1:選擇定時器T2作為串口1(UART1)的波特率發(fā)生器,此時定時器T1
得到釋放,可作為獨立定時器使用。

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-6.jpg 定時器/計數(shù)器T3固定為16位自動重裝方式,電路原理如圖3-6所示,T3除可以 當(dāng)作定時器/計數(shù)器使用外,還可以作串口3的波特率發(fā)生器或可編程時鐘輸出。

圖3-6 定時器/計數(shù)器3的工作模式固定為16位自動重裝方式
表3-4 定時器T4和T3控制寄存器T4T3M(地址D1H,復(fù)位值為0000 0000B)
D7
D6
D5
D4
D3
D2
D1
D0
位名稱
T4R
T4_C/T
T4xl2
T4CLKO
T3R
T3_C/T
T3xl2
T3CLKO
定時器/計數(shù)器T4 定時器/計數(shù)器T3
n T4R:定時器4運行控制位, 置1啟動定時器,置0關(guān)閉定時器。
n T4_C/T:選擇定時器4用作定時器或計數(shù)器。設(shè)為0用于內(nèi)部定時,設(shè)為1用 于外部計數(shù)(引腳T4/P0.7)。

n T4x12:定時器4速度控制位。 0:12分頻 (默認值),1:不分頻 。

n T4CLKO:是否允許將P0.6腳配置為定時器T4的時鐘輸出T4CLKO。1:允許 時鐘輸出,0:禁止時鐘輸出。

n T3R:定時器3運行控制位。置1啟動定時器,置0關(guān)閉定時器。

n T3_C/T:選擇定時器3用作定時器或計數(shù)器。設(shè)為0用于內(nèi)部定時,設(shè)為1用于 外部計數(shù)(引腳T3/P0.5)。

n T3x12:定時器3速度控制位。 0:12分頻 (默認值),1:不分頻 。

n T3CLKO:是否允許將P0.4腳配置為定時器T3的時鐘輸出T3CLKO。1:允許 時鐘輸出,0:禁止時鐘輸出。
3 初值計算
l 計數(shù)器初值計算:
M1M0=00 初值 = 65536 – 待計數(shù)值
M1M0=01 初值 = 65536 – 待計數(shù)值
M1M0=10 初值 = 256 – 待計數(shù)值

l 定時器初值計算: 單個定時脈沖周期Tin = 1/Fin

待計數(shù)值 = 定時時間/單個定時脈沖周期 = T/Tin = Fin*T M1M0=00 初值 = 65536 – 待計數(shù)值 = 65536 –Fin*T M1M0=01初值 = 65536 – 待計數(shù)值 = 65536 –Fin*T M1M0=10 初值 = 256 – 待計數(shù)值 = 256 - Fin*T

再把CPU工作的系統(tǒng)時鐘SYSclk(注意:SYSclk不等于內(nèi)部R/C時鐘 或外部晶振頻率Fosc)是否12分頻考慮進去,得出計算初值的表格,見 表3-5。

表3-5 定時器初值計算公式表


12分頻(即12T,默認值)

1分頻(即1T)

16位定時器

預(yù)置初值 = 65536 – SYSclk/12*T

預(yù)置初值 = 65536 – SYSclk*T

8位定時器

預(yù)置初值 = 256 – SYSclk/12*T

預(yù)置初值 = 256 – SYSclk*T

公式中的T表示定時時間,單位是uS,系統(tǒng)時鐘SYSclk單位是MHz,如果T的單
位用Hz,則SYSclk單位用S,通過上面的計算公式我們可以精確計算出定時器預(yù) 置初值,為了快速簡便,我們也可以直接使用STC下載軟件中的輔助工具“定時器
計算器”直接生成定時器初始化函數(shù)。
4 編程舉例
例3.1 用定時器T0實現(xiàn)P0.0引腳LED亮30ms滅30ms方式閃爍(使用查詢方
式),使用單片機內(nèi)部R/C時鐘,頻率22.1184MHz。

#include "STC15W4K.H" sbit P0_0=P0^0;

void main()

{
P0=0xff; // 關(guān)閉P0口接的所有燈
TMOD=0x00; // 定時器0的16位自動重裝方式
TH0=0x28; // 定時器初值2800H

TL0=0; TR0=1; for(;;)

{
if(TF0) // 如果TF0等于1
{
TF0=0; // 清TF0
P0_0=!P0_0; // 執(zhí)行燈亮或滅的動作

}

}

}

例3.2 用定時器T0實現(xiàn)P0.0引腳LED亮1秒滅1秒方式閃爍(使用查詢方式),R/C時鐘
22.1184MHz。

#include "STC15W4K.H" sbit LED=P0^0;

unsigned char counter; // 軟件計數(shù)器

void main()

{
TMOD=0x01; // 定時器0_16位計數(shù)
TH0=0x70; // 經(jīng)計算定時20ms初值是0x7000

TL0=0x00;

TR0=1; // 定時器開始運行

while(1)

{

if(TF0==1)

{

}

TF0=0; // 沒使用中斷的情況下必定會用軟件查詢清零

TH0=0x70; TL0=0x00; counter++;

if(50==counter) // 20ms×50=1000ms即1S(中斷時重裝定時常數(shù)占用時間忽略不計)
{

counter=0; LED=~LED;

}

}

}

例3.3 使用T0作計數(shù)器對外部信號計數(shù),計數(shù)值用P0口的LED顯示出來。本例使用第一章介紹的 二極管閃爍發(fā)光的實例在1號單片機P5.4輸出的低頻脈沖信號作為2號單片機T0(P3.4)引腳計 數(shù)脈沖輸入,有脈沖信號輸入后從P0口就可以看到LED按二進制遞增規(guī)律亮滅變化。

#include "STC15W4K.H" // include稱為文件包含命令,后面引號中內(nèi)容稱為頭文件

void port_mode() // 端口模式
{ // 同第一章流水燈程序
}
void main()
{
unsigned char DispBuf;
port_mode(); // 所有IO口設(shè)為準雙向弱上拉方式。 P0=0xff; // 關(guān)閉P0口接的所有燈
TMOD=0x05; // 確定計數(shù)工作模式為T0_16位計數(shù),不需要重裝。 TR0=1; // 計數(shù)器T0開始運行
for(;;)
{
DispBuf=TL0; P0=~DispBuf;
}
}
例3.5 使用T2作計數(shù)器對外部信號計數(shù),計數(shù)值用P0口的LED顯示出來。若使

用配套實驗板,需要用杜邦線將1號單片機P54連接到2號單片機P3.1/T2引腳

(22腳)上。

void main()

{

unsigned char DispBuf;

port_mode(); // 所有IO口設(shè)為準雙向弱上拉方式。 P0=0xff; // 關(guān)閉P0口接的所有燈

AUXR|=0x18; // 定時器T2工作于計數(shù)方式并開始運行

for(;;)

{

DispBuf=T2L;

P0=~DispBuf;

}

}

2 中斷系統(tǒng)

當(dāng)單片機正在處理當(dāng)前一段程序時,突然出現(xiàn)了另一個更重 要的事件需要處理,單片機可以暫停當(dāng)前的程序段去執(zhí)行 更重要的事件對應(yīng)的程序代碼,當(dāng)重要程序代碼執(zhí)行完畢 后返回到原暫停程序處繼續(xù)執(zhí)行原來的代碼,單片機暫停 當(dāng)前程序去執(zhí)行其它程序的過程就稱為中斷,當(dāng)正在執(zhí)行 重要程序代碼的過程中出現(xiàn)了更為重要的事件時,單片機 還可以暫停當(dāng)前事件去執(zhí)行更重要的事件的代碼,稱為中 斷嵌套。

IAP15W4K58S4單片機有21個中斷源,如圖3-11左邊部分所 示,包括5個外部中斷、5個片內(nèi)定時器/計數(shù)器溢出中斷、
4個片內(nèi)串行口(UART)中斷、1個ADC中斷、1個SPI中斷、
1個低電壓檢測中斷、1個PCA中斷、1個PWM中斷、1個PWM 異常中斷、1個比較器中斷。
2 中斷系統(tǒng)

當(dāng)單片機正在處理當(dāng)前一段程序時,突然出現(xiàn)了另一個更重要的事件需要處理,單片機 可以暫停當(dāng)前的程序段去執(zhí)行更重要的事件對應(yīng)的程序代碼,當(dāng)重要程序代碼執(zhí)行完畢后 返回到原暫停程序處繼續(xù)執(zhí)行原來的代碼,單片機暫停當(dāng)前程序去執(zhí)行其它程序的過程就 稱為中斷 ,簡單的說,中斷就是中途打斷。

當(dāng)正在執(zhí)行重要程序代碼的過程中出現(xiàn)了更為重要的事件時,單片機還可以暫停當(dāng)前事

件去執(zhí)行更重要事件的代碼,稱為中斷嵌套,IAP15W4K58S4單片機有21個中斷源,最常 用的是外部引腳中斷、定時器中斷、串行口(UART)中斷。

主程序
執(zhí)行主 程序
中斷請求 執(zhí)行
中斷
斷點
繼續(xù)執(zhí)行 主程序

處理 函數(shù)
中斷返回
%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-7.jpg
1

中斷系統(tǒng)結(jié)構(gòu)圖(各開關(guān)處于默認狀態(tài))

2 操作電路圖中的開關(guān)(相關(guān)寄存器介紹)
表3-2 定時器/計數(shù)器控制寄存器TCON (地址:88H,復(fù)位值:0000 0000B)
D7
D6
D5
D4
D3
D2
D1
D0
位名稱
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
定時.計數(shù) 中斷

① IT0:INT0引腳觸發(fā)方式控制位,可由軟件置1或清“0”。

0:上升沿和下降沿都可以觸發(fā)中斷并置位IE0標(biāo)志。
1:下降沿觸發(fā)中斷并置位IE0標(biāo)志。
② IE0:INT0中斷請求標(biāo)志位,當(dāng)INT0引腳產(chǎn)生中斷信號后由硬件將IE0置1(程序調(diào)
試過程中也可以使用軟件置1),CPU響應(yīng)中斷并進入中斷程序入口地址后立即由硬件將
IE0清0。注意:在匯編語言中剛進入中斷入口地址或C語言中剛進入中斷函數(shù),IE0即
被清零,所以無論匯編還是C語言在中斷程序調(diào)試過程中根本看不到IE0=1的情況,因
此,IE0和IE1只在查詢編程的方式上用得上。
③ IT1:INT1引腳觸發(fā)方式控制位,與IT0類似。
④ IE1:INT1中斷請求標(biāo)志位,與IE0類似。
⑤ TF0:定時器T0溢出中斷標(biāo)志,T0溢出時由硬件將TF0置1, CPU響應(yīng)中斷并進入中
斷程序入口地址后立即由硬件將TF0清0。注意:在匯編語言中剛進入中斷入口地址或C
語言中剛進入中斷函數(shù),TF0即被清零,所以無論匯編還是C語言在中斷程序序調(diào)試過
程中根本看不到TF0=1的情況,因此,TF0和TF1只在查詢編程的方式上用得上。
⑥ TF1,定時器T1溢出中斷標(biāo)志,與TF0類似。
中斷允許寄存器IE、IE2、INT_CLKO共同完成中斷信號通路的接通與斷開控制。
表3-13 中斷允許寄存器IE(地址A8H,復(fù)位值是:0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名稱

EA

ELVD

EADC

ES

ET1

EX1

ET0

EX0

EA:總開關(guān)。EA=1,開總中斷,EA=0,關(guān)總中斷。
ELVD:低電壓檢測中斷允許控制位。ELVD =1,允許低電壓檢測中斷,ELVD
=0,禁止低電壓檢測中斷。
EADC:ADC中斷允許控制位。EADC = 1,允許ADC中斷,EADC = 0,禁止
ADC中斷。
ES:串口1中斷開關(guān)。ES=1,允許串口1中斷,ES=0,禁止串口1中斷。
ET1:定時器T1中斷開關(guān)。ET1=1,允許T1中斷,ET1=0,禁止T1中斷。
EX1:外部中斷INT1開關(guān)。EX1=1,開外部中斷INT1,EX1=0,關(guān)外部中斷INT1。
ET0和EX0與ET1和EX1功能類似。
優(yōu)先級控制。

單片機對中斷優(yōu)先級的處理原則是低優(yōu)先級中斷可被高優(yōu)先級中斷所中斷,反 之不能。任何一種中斷(不管是高優(yōu)先級還是低優(yōu)先級),一旦得到響應(yīng),不 會再被與它同級的中斷所中斷,同一優(yōu)先級的中斷源同時申請中斷時,按照事 先約定的硬件查詢順序響應(yīng)中斷,也就是說在每個優(yōu)先級內(nèi),還同時存在一個 自然優(yōu)先級,自然優(yōu)先級順序見圖3-16右邊部分所示。

表3-16 中斷優(yōu)先級控制寄存器IP (地址為D8H,復(fù)位值是:0000 0000B)

D7

D6

D5

D4

D3

D2

D1

D0

位名稱

PPCA

PLVD

PADC

PS

PT1

PX1

PT0

PX0

PPCA:PCA優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PLVD: 低壓檢測優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PADC:ADC優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PS:串口1優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PT1:定時器T1優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PX1:外中斷INT1優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PT0:定時器T0優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)
PX0 :外中斷INT0優(yōu)先 (設(shè)為1 = 高級中斷,設(shè)為0 = 低級中斷)

3 編寫中斷函數(shù)

• 1、中斷函數(shù)格式:void 函數(shù)名() interrupt m [using n]

• void : 返回值類型。由于中斷函數(shù)是CPU響應(yīng)中斷時通過硬件自動調(diào) 用的,因此中斷函數(shù)的返回值和參數(shù)都只能是void(不能返回函數(shù)值, 也不能給中斷函數(shù)傳遞參數(shù))。

• 函數(shù)名:可以隨便寫,只要方便自己識別此函數(shù)對應(yīng)哪個中斷源即可。
• interrupt:指明此函數(shù)為中斷專用函數(shù)。

• m :中斷源編號(0~13、16~23)確定此函數(shù)對應(yīng)哪一個硬件 中斷。

• using n:確定此中斷函數(shù)使用第幾組R0~R7寄存器組(n = 0~3), 通常不必去做工作寄存器組設(shè)定,而由編譯器自動選擇,避免產(chǎn)生不 必要的錯誤。

• 使用中斷函數(shù)時應(yīng)注意:

• ① 只要程序中開啟了中斷,就必須編寫對應(yīng)的中斷函數(shù),哪怕是空函 數(shù)也必須有(空函數(shù)自動執(zhí)行RETI中斷返回指令),否則中斷產(chǎn)生時 卻找不到可執(zhí)行的中斷函數(shù),這樣必然引起程序功能錯亂或死機。

• ② 任何函數(shù)都不能直接調(diào)用中斷函數(shù),另外中斷函數(shù)可放在程序中任 何位置而不需要聲明,只要產(chǎn)生中斷,程序就能自動跳入中斷函數(shù)執(zhí) 行。

中斷函數(shù)名稱典型書寫格式如下。
• void INT0(void) interrupt 0{} // 外部中斷0中斷函數(shù)
• void Timer0(void) interrupt 1{} // 定時器T0 中斷函數(shù)
• void INT1(void) interrupt 2{} // 外部中斷1中斷函數(shù)
• void Timer1(void) interrupt 3{} // 定時器T1中斷函數(shù)
• void UART1(void) interrupt 4{} // 串行口1中斷函數(shù)
• void ADC(void) interrupt 5{} // ADC中斷函數(shù)
• void LVD(void) interrupt 6{} // 低電壓檢測LVD中斷函數(shù)
• void PCA(void) interrupt 7{} // PCA中斷函數(shù)
• void UART2(void) interrupt 8{} // 串行口2中斷函數(shù)
• void SPI(void) interrupt 9{} // SPI通信中斷函數(shù)
• void INT2(void) interrupt 10{} // 外部中斷2中斷函數(shù)
• void INT3(void) interrupt 11{} // 外部中斷3中斷函數(shù)
• void Timer2(void) interrupt 12{} // 定時器T2中斷函數(shù)
• void INT4(void) interrupt 16{} // 外部中斷4中斷函數(shù)
• void UART3(void) interrupt 17{} // 串行口3中斷函數(shù)
• void UART4(void) interrupt 18{} // 串行口4中斷函數(shù)
• void Timer3(void) interrupt 19{} // 定時器3中斷函數(shù)
• void Timer4(void) interrupt 20{} // 定時器4中斷函數(shù)
• void Comparator(void) interrupt 21{} // 比較器中斷函數(shù)
• void PWM(void) interrupt 22{} // PWM中斷函數(shù)
• void PWMFD(void) interrupt 23{} // PWM異常中斷函數(shù)
4 中斷程序舉例

例3.10 用定時器T0實現(xiàn)P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷方式),R/C 時鐘22.1184MHz。

// 預(yù)置初值 = 65536 – Fosc/12*T=65536-22.1184/12×30000 = 2800H
#include "STC15W4K.H" sbit P0_0=P0^0;


// 包含 "STC15W4K.H"寄存器定義頭文件
void main()



{



P0=0xff;
//
關(guān)閉P1口接的所有燈
TMOD=0x00;
//
定時器0的16位自動重裝方式
TH0=0x28;
//
定時器初值2800H
TL0=0;



TR0=1;



ET0=1;
//
開定時器0中斷開關(guān)
EA=1;
while(1);
//
開總中斷開關(guān)
}
void Timer0() interrupt 1
{
P0_0=!P0_0; // 執(zhí)行燈亮或滅的動作
}

例3.13 用定時器T2實現(xiàn)P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷方式), R/C時鐘22.1184MHz。

#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定義頭文件

sbit P0_0=P0^0;
void main()
{
P0=0xff; // 關(guān)閉P1口接的所有燈 AUXR = 0x00; // 定時器2為12T模式
T2L = 0; // 初始化計時值,
T2H = 0x28;
AUXR |= 0x10; // 定時器2開始計時 IE2 |= 0x04; // 開定時器2中斷
EA = 1;
while(1);
}
void Timer2() interrupt 12
{
P0_0=!P0_0; // 執(zhí)行燈亮或滅的動作
}

例3.14 用定時器T3實現(xiàn)P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷 方式),R/C時鐘22.1184MHz。

#include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定義頭文件

sbit P0_0=P0^0;
void main()
{
P0=0xff; // 關(guān)閉P0口接的所有燈 T4T3M &= 0xFD; // 定時器3為12T模式 T3L = 0; // 初始化計時值,
T3H = 0x28;
T4T3M |= 0x08; // 定時器3開始計時 IE2 |= 0x20; // 開定時器3中斷
EA = 1;
while(1);
}

5 外中斷代碼調(diào)試技巧(按鍵的防抖技術(shù))

%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-2.jpg




單片機外中斷輸入引腳:





%E7%AC%AC3%E7%AB%A0--%E5%AE%9A%E6%97%B6%E5%99%A8_%E8%AE%A1%E6%95%B0%E5%99%A8_%E4%B8%AD%E6%96%AD%E7%B3%BB%E7%BB%9F-8.jpg
74LS00引腳圖
0.png
回復(fù)

使用道具 舉報

ID:425919 發(fā)表于 2019-10-31 11:00 | 顯示全部樓層
不努力學(xué)習(xí)都不懂呀
回復(fù)

使用道具 舉報

ID:424788 發(fā)表于 2023-7-3 11:00 | 顯示全部樓層
還要更加努力才能看的懂  目前似懂非懂.....
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表