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)
%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 (12.65 KB, 下載次數(shù): 167)
下載附件
2016-3-28 01:40 上傳
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ù)器。
%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 (24.93 KB, 下載次數(shù): 177)
下載附件
2016-3-28 01:40 上傳
圖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)稱為寄存器
%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 (49.27 KB, 下載次數(shù): 157)
下載附件
2016-3-28 01:40 上傳
表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í)器使用。
%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 (36.39 KB, 下載次數(shù): 151)
下載附件
2016-3-28 01:40 上傳
定時(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ù) 中斷返回
%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 (97.8 KB, 下載次數(shù): 141)
下載附件
2016-3-28 01:40 上傳
中斷系統(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ù))
%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 (12.04 KB, 下載次數(shù): 148)
下載附件
2016-3-28 01:40 上傳
單片機(jī)外中斷輸入引腳:
%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 (16.35 KB, 下載次數(shù): 175)
下載附件
2016-3-28 01:40 上傳
74LS00引腳圖
0.png (17.81 KB, 下載次數(shù): 158)
下載附件
2016-3-28 01:28 上傳
|