久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 14809|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
51單片機(jī)輕松入門—基于STC15W4K系列(C語(yǔ)言版)
李友全
編著:http://m.zg4o1577.cn/bbs/dpj-37954-1.html



(1) 定時(shí)器/計(jì)數(shù)器

1 單片機(jī)定時(shí)器/計(jì)數(shù)器工作原理概述
2 定時(shí)器/計(jì)數(shù)器的相關(guān)寄存器
3 初值計(jì)算
4 編程舉例
(2) 中斷系統(tǒng)


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

M1M0 :

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

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

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

定時(shí)器/計(jì)數(shù)器T3固定為16位自動(dòng)重裝方式,電路原理如圖3-6所示,T3除可以 當(dāng)作定時(shí)器/計(jì)數(shù)器使用外,還可以作串口3的波特率發(fā)生器或可編程時(shí)鐘輸出。

圖3-6 定時(shí)器/計(jì)數(shù)器3的工作模式固定為16位自動(dòng)重裝方式
表3-4 定時(shí)器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í)器/計(jì)數(shù)器T4 定時(shí)器/計(jì)數(shù)器T3
n T4R:定時(shí)器4運(yùn)行控制位, 置1啟動(dòng)定時(shí)器,置0關(guān)閉定時(shí)器。
n T4_C/T:選擇定時(shí)器4用作定時(shí)器或計(jì)數(shù)器。設(shè)為0用于內(nèi)部定時(shí),設(shè)為1用 于外部計(jì)數(shù)(引腳T4/P0.7)。

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

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

n T3R:定時(shí)器3運(yùn)行控制位。置1啟動(dòng)定時(shí)器,置0關(guān)閉定時(shí)器。

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

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

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

l 定時(shí)器初值計(jì)算: 單個(gè)定時(shí)脈沖周期Tin = 1/Fin

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

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

表3-5 定時(shí)器初值計(jì)算公式表


12分頻(即12T,默認(rèn)值)

1分頻(即1T)

16位定時(shí)器

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

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

8位定時(shí)器

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

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

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

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

void main()

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

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

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

}

}

}

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

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

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

void main()

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

TL0=0x00;

TR0=1; // 定時(shí)器開始運(yùn)行

while(1)

{

if(TF0==1)

{

}

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

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

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

counter=0; LED=~LED;

}

}

}

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

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

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

用配套實(shí)驗(yàn)板,需要用杜邦線將1號(hào)單片機(jī)P54連接到2號(hào)單片機(jī)P3.1/T2引腳

(22腳)上。

void main()

{

unsigned char DispBuf;

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

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

for(;;)

{

DispBuf=T2L;

P0=~DispBuf;

}

}

2 中斷系統(tǒng)

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

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

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

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

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

主程序
執(zhí)行主 程序
中斷請(qǐng)求 執(zhí)行
中斷
斷點(diǎn)
繼續(xù)執(zhí)行 主程序

處理 函數(shù)
中斷返回
1

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

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

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

0:上升沿和下降沿都可以觸發(fā)中斷并置位IE0標(biāo)志。
1:下降沿觸發(fā)中斷并置位IE0標(biāo)志。
② IE0:INT0中斷請(qǐng)求標(biāo)志位,當(dāng)INT0引腳產(chǎn)生中斷信號(hào)后由硬件將IE0置1(程序調(diào)
試過程中也可以使用軟件置1),CPU響應(yīng)中斷并進(jìn)入中斷程序入口地址后立即由硬件將
IE0清0。注意:在匯編語(yǔ)言中剛進(jìn)入中斷入口地址或C語(yǔ)言中剛進(jìn)入中斷函數(shù),IE0即
被清零,所以無(wú)論匯編還是C語(yǔ)言在中斷程序調(diào)試過程中根本看不到IE0=1的情況,因
此,IE0和IE1只在查詢編程的方式上用得上。
③ IT1:INT1引腳觸發(fā)方式控制位,與IT0類似。
④ IE1:INT1中斷請(qǐng)求標(biāo)志位,與IE0類似。
⑤ TF0:定時(shí)器T0溢出中斷標(biāo)志,T0溢出時(shí)由硬件將TF0置1, CPU響應(yīng)中斷并進(jìn)入中
斷程序入口地址后立即由硬件將TF0清0。注意:在匯編語(yǔ)言中剛進(jìn)入中斷入口地址或C
語(yǔ)言中剛進(jìn)入中斷函數(shù),TF0即被清零,所以無(wú)論匯編還是C語(yǔ)言在中斷程序序調(diào)試過
程中根本看不到TF0=1的情況,因此,TF0和TF1只在查詢編程的方式上用得上。
⑥ TF1,定時(shí)器T1溢出中斷標(biāo)志,與TF0類似。
中斷允許寄存器IE、IE2、INT_CLKO共同完成中斷信號(hào)通路的接通與斷開控制。
表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:低電壓檢測(cè)中斷允許控制位。ELVD =1,允許低電壓檢測(cè)中斷,ELVD
=0,禁止低電壓檢測(cè)中斷。
EADC:ADC中斷允許控制位。EADC = 1,允許ADC中斷,EADC = 0,禁止
ADC中斷。
ES:串口1中斷開關(guān)。ES=1,允許串口1中斷,ES=0,禁止串口1中斷。
ET1:定時(shí)器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)先級(jí)控制。

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

表3-16 中斷優(yōu)先級(jí)控制寄存器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 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PLVD: 低壓檢測(cè)優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PADC:ADC優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PS:串口1優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PT1:定時(shí)器T1優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PX1:外中斷INT1優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PT0:定時(shí)器T0優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)
PX0 :外中斷INT0優(yōu)先 (設(shè)為1 = 高級(jí)中斷,設(shè)為0 = 低級(jí)中斷)

3 編寫中斷函數(shù)

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

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

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

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

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

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

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

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

中斷函數(shù)名稱典型書寫格式如下。
• void INT0(void) interrupt 0{} // 外部中斷0中斷函數(shù)
• void Timer0(void) interrupt 1{} // 定時(shí)器T0 中斷函數(shù)
• void INT1(void) interrupt 2{} // 外部中斷1中斷函數(shù)
• void Timer1(void) interrupt 3{} // 定時(shí)器T1中斷函數(shù)
• void UART1(void) interrupt 4{} // 串行口1中斷函數(shù)
• void ADC(void) interrupt 5{} // ADC中斷函數(shù)
• void LVD(void) interrupt 6{} // 低電壓檢測(cè)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{} // 定時(shí)器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{} // 定時(shí)器3中斷函數(shù)
• void Timer4(void) interrupt 20{} // 定時(shí)器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 用定時(shí)器T0實(shí)現(xiàn)P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷方式),R/C 時(shí)鐘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;
//
定時(shí)器0的16位自動(dòng)重裝方式
TH0=0x28;
//
定時(shí)器初值2800H
TL0=0;



TR0=1;



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

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

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

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

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

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

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

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




單片機(jī)外中斷輸入引腳:





74LS00引腳圖

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂1 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:425919 發(fā)表于 2019-10-31 11:00 | 只看該作者
不努力學(xué)習(xí)都不懂呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:424788 發(fā)表于 2023-7-3 11:00 | 只看該作者
還要更加努力才能看的懂  目前似懂非懂.....
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区国产 | 天天夜碰日日摸日日澡 | 毛片一级片 | 精品视频在线观看 | 福利影院在线看 | 亚洲黄色成人网 | 久久久婷 | 日日夜夜精品视频 | 亚洲一区二区中文字幕 | 91色在线 | 国产精品视屏 | 国产乱码久久久 | 免费在线观看成人av | 久久精品国产久精国产 | 中文字幕免费 | 99re6热在线精品视频播放 | 四虎影视免费观看 | 久久一二区 | 国产精品乱码一二三区的特点 | 亚洲精品日韩在线 | 成人h动漫精品一区二区器材 | 中文字幕精品一区久久久久 | 99亚洲精品| 国产清纯白嫩初高生在线播放视频 | 秋霞a级毛片在线看 | 在线观看国产精品一区二区 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 久久精选 | 亚洲一区二区三区高清 | 欧美不卡一区 | 久久大| 鸡毛片 | 日韩欧美亚洲综合 | 国产综合精品一区二区三区 | 国产在线一区二区 | 一级a爱片性色毛片免费 | 在线一区二区三区 | 亚洲国产精品久久久久 | 日日天天| 又黄又色 | 国产高清视频在线观看 |