51單片機輕松入門—基于STC15W4K系列(C語言版)
李友全 編著:http://www.zg4o1577.cn/bbs/dpj-37954-1.html
(1) 定時器/計數器 1 單片機定時器/計數器工作原理概述 2 定時器/計數器的相關寄存器 3 初值計算 4 編程舉例 (2) 中斷系統
%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, 下載次數: 167)
下載附件
2016-3-28 01:40 上傳
1 中斷系統結構圖 2 操作電路圖中的開關(相關寄存器介紹) 3 編寫中斷函數 4 中斷程序舉例 5 外中斷代碼調試(按鍵的防抖技術) (1) 定時器/計數器 IAP15W4K58S4單片機內部包含了下面與定時中斷功能有關的模塊: ① 5個16位的定時器/計數器(T0、T1、T2、T3、T4),不僅可方便 的用于定時控制,而且還可以用于對外部脈沖信號進行計數。 ② 6個引腳同時輸出時鐘功能(5路定時器時鐘 + 1路主時鐘),可給外部 器件提供時鐘脈沖信號(最高頻率可達13.5MHz)。 ③ 2個引腳連接內部PCA模塊, 通過功能選擇可將PCA模塊用作外部中 斷(2通道)、定時器、時鐘輸出和脈寬調制PWM輸出。 ④ 5個外中斷輸入口(INT0、INT1、/INT2、/INT3、/INT4),INT0與 INT1既可上升沿觸發也可下降沿觸發,/INT2、/INT3和/INT4只能 下降沿觸發。 1 單片機定時器/計數器工作原理概述 IAP15W4K58S4單片機定時器/計數器結構示意圖如圖3-1所示,同一個模塊當用 于內部系統時鐘計數時稱為定時器,當用于外部輸入脈沖計數時稱為計數器。
%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, 下載次數: 177)
下載附件
2016-3-28 01:40 上傳
圖3-1 定時器/計數器原理示意圖( x = 0、1、2、3、4) 定時器/計數器的核心是一個加1計數器,加1計數器的脈沖有兩個來源,一個是 單片機引腳輸入的外部脈沖信號源,另一個是CPU實際運行的系統時鐘SYSclk,當 程序中沒有對CPU的時鐘分頻器進行額外設置時,系統時鐘SYSclk就等于外部晶體 振蕩器或內部R/C時鐘頻率,計數器對這兩個脈沖源之一進行輸入計數,每輸入一 個脈沖,計數值加1,當計數到計數器為全1時,再輸入一個脈沖就使計數值回零, 同時從最高位溢出一個脈沖使特殊功能寄存器TCON的TFx位置1,作為計數器的溢 出中斷標志,當脈沖源選擇內部系統時鐘SYSclk時,在每個時鐘周期計數器加1或 12個時鐘周期計數器加1(默認值是12個時鐘周期加1 ),由于計數脈沖的周期是 固定的,所以脈沖數乘以脈沖周期就是定時時間,此為定時器功能。 允許外部最高輸入信號頻率:當脈沖源選擇外部引腳輸入的脈沖時,就是對外部 事件計數的計數器,當外部引腳上有一個從1到0的負跳變時計數值加1,由于系 統每個時鐘對外部計數器引腳采樣1次,當前一次采樣到外部引腳為高電平而后 一次采樣到低電平則形成一個負跳變,因此確認外部輸入信號的一次負跳變至少 需要2個系統時鐘周期,實際上,引腳輸入通道中還有一個同步采樣與邊沿檢測 電路,致使外部輸入信號的最高允許頻率不能大于系統時鐘頻率SYSclk的1/4, 比如CPU運行的系統時鐘為22.1184MHz,允許外部最高輸入信號頻率為 22.1184MHz/4 = 5.5926 MHz,如果頻率高于這個值,輸入信號的部分脈沖在檢 測過程中會被丟失,若用著頻率計,表現結果是測量得到的頻率比真實頻率低。 特殊功能寄存器:從這個示意圖我們可以看到2個開關符號,后面將會介紹的 詳細結構圖中有更多的開關符號,我們使用單片機內部功能模塊就是要把這些 電路開關合上或斷開,這些開關的合上或斷開是直接由特殊功能寄存器控制 的,因此我們要控制開關實際是控特殊功能寄存器,為了方便,后面把特殊功 能寄存器簡稱為寄存器
%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, 下載次數: 157)
下載附件
2016-3-28 01:40 上傳
表3-1 定時器/計數器方式寄存器TMOD(地址89H,復位值為0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名 稱 | GATE | C/T | M1 | M0 | GATE | C/T | M1 | M0 |
T1 T0 GATE:門控位,用于外部引腳控制定時器啟動與停止。 0:每當TR0/TR1置位時,就啟動定時器工作。 1:外部引腳INT0/INT1為高電平且TR0/TR1置位時,啟動定時器工作。 GATE門控位實際中一般都不會使用,不管用于定時還是計數,都直接設為0 即可,在定時計數器T2、T3、T4干脆直接去掉了GATE門控位。 C/T : 設為0用于內部定時,設為1用于外部計數。 M1M0 : 00 : 16位自動重裝定時計數,當溢出時將RL_TH和RL_TL的值自動裝入 TH和TL 中,推薦使用首選(重點學習) 。 01 : 16位定時計數,傳統單片機使用得較普遍,在一些特殊運用場合比如后面章 節將會介紹的斷電存儲定時器,只能采用這種非自動重裝方式。 10 : 8位自動重裝定時計數,當溢出時將TH的值自動裝入TL中。 11 : 對于T1,停止計數,等同于將TR1設置為0。 對于T0,在運行過程中,中斷一旦開啟就無法關閉,稱為不可屏蔽中斷的16 位自動重裝定時器,可用于操作系統的節拍定時器。 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
定時.計數 中斷 TF1:T1溢出標志位,計數器溢出時此位自動置1,進入相應中斷函數后則由硬 件清零,若沒編寫中斷函數則必須由軟件清零。 TF0: T0溢出標志位,功能與TF1類似。 TR1:T1運行控制位,置1啟動定時器,置0關閉定時器。 TR0:T0運行控制位,置1啟動定時器,置0關閉定時器。 表3-3 輔助寄存器AUXR(地址8EH,復位值為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的通信速度設置位。 0:12分頻 ,1:6分頻 。 注:串口1模式0是移位寄存器方式,無實際用途,不用學 nT2R:定時器2運行控制位。置1啟動,置0關閉。 nT2_C/T :選擇定時器2作定時器或計數器。 0:用作定時器(計數脈沖從內部系統時鐘輸入)。 1:用作計數器(計數脈沖從P3.1/T2引腳輸入)。 nT2x12:定時器2速度控制位。 0:12分頻 ,1:不分頻 。 0:12分頻,定時器T2 每12個時鐘周期計數一次。 1:不分頻,定時器T2 每1個時鐘周期計數一次。 如果串口(UART1~UART4)用T2作為波特率發生器,T2x12位決定串口 是12T 還是1T(高速通信需要1T ,后面章節會講)。 nEXTRAM:用于設置是否允許使用內部3840字節的擴展RAM。 0:允許,1:禁止。 nS1ST2:串口1(UART1)選擇定時器2作為波特率發生器的控制位。 0:選擇定時器T1作為串口1(UART1)的波特率發生器 1:選擇定時器T2作為串口1(UART1)的波特率發生器,此時定時器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 (36.39 KB, 下載次數: 151)
下載附件
2016-3-28 01:40 上傳
定時器/計數器T3固定為16位自動重裝方式,電路原理如圖3-6所示,T3除可以 當作定時器/計數器使用外,還可以作串口3的波特率發生器或可編程時鐘輸出。 圖3-6 定時器/計數器3的工作模式固定為16位自動重裝方式 表3-4 定時器T4和T3控制寄存器T4T3M(地址D1H,復位值為0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | T4R | T4_C/T | T4xl2 | T4CLKO | T3R | T3_C/T | T3xl2 | T3CLKO |
定時器/計數器T4 定時器/計數器T3 n T4R:定時器4運行控制位, 置1啟動定時器,置0關閉定時器。 n T4_C/T:選擇定時器4用作定時器或計數器。設為0用于內部定時,設為1用 于外部計數(引腳T4/P0.7)。 n T4x12:定時器4速度控制位。 0:12分頻 (默認值),1:不分頻 。 n T4CLKO:是否允許將P0.6腳配置為定時器T4的時鐘輸出T4CLKO。1:允許 時鐘輸出,0:禁止時鐘輸出。 n T3R:定時器3運行控制位。置1啟動定時器,置0關閉定時器。 n T3_C/T:選擇定時器3用作定時器或計數器。設為0用于內部定時,設為1用于 外部計數(引腳T3/P0.5)。 n T3x12:定時器3速度控制位。 0:12分頻 (默認值),1:不分頻 。 n T3CLKO:是否允許將P0.4腳配置為定時器T3的時鐘輸出T3CLKO。1:允許 時鐘輸出,0:禁止時鐘輸出。 3 初值計算 l 計數器初值計算: M1M0=00 初值 = 65536 – 待計數值 M1M0=01 初值 = 65536 – 待計數值 M1M0=10 初值 = 256 – 待計數值 l 定時器初值計算: 單個定時脈沖周期Tin = 1/Fin 待計數值 = 定時時間/單個定時脈沖周期 = T/Tin = Fin*T M1M0=00 初值 = 65536 – 待計數值 = 65536 –Fin*T M1M0=01初值 = 65536 – 待計數值 = 65536 –Fin*T M1M0=10 初值 = 256 – 待計數值 = 256 - Fin*T 再把CPU工作的系統時鐘SYSclk(注意:SYSclk不等于內部R/C時鐘 或外部晶振頻率Fosc)是否12分頻考慮進去,得出計算初值的表格,見 表3-5。 表3-5 定時器初值計算公式表
| 12分頻(即12T,默認值) | 1分頻(即1T) | 16位定時器 | 預置初值 = 65536 – SYSclk/12*T | 預置初值 = 65536 – SYSclk*T | 8位定時器 | 預置初值 = 256 – SYSclk/12*T | 預置初值 = 256 – SYSclk*T |
公式中的T表示定時時間,單位是uS,系統時鐘SYSclk單位是MHz,如果T的單 位用Hz,則SYSclk單位用S,通過上面的計算公式我們可以精確計算出定時器預 置初值,為了快速簡便,我們也可以直接使用STC下載軟件中的輔助工具“定時器 計算器”直接生成定時器初始化函數。 4 編程舉例 例3.1 用定時器T0實現P0.0引腳LED亮30ms滅30ms方式閃爍(使用查詢方 式),使用單片機內部R/C時鐘,頻率22.1184MHz。 #include "STC15W4K.H" sbit P0_0=P0^0; void main() { P0=0xff; // 關閉P0口接的所有燈 TMOD=0x00; // 定時器0的16位自動重裝方式 TH0=0x28; // 定時器初值2800H TL0=0; TR0=1; for(;;) { if(TF0) // 如果TF0等于1 { TF0=0; // 清TF0 P0_0=!P0_0; // 執行燈亮或滅的動作 } } } 例3.2 用定時器T0實現P0.0引腳LED亮1秒滅1秒方式閃爍(使用查詢方式),R/C時鐘 22.1184MHz。 #include "STC15W4K.H" sbit LED=P0^0; unsigned char counter; // 軟件計數器 void main() { TMOD=0x01; // 定時器0_16位計數 TH0=0x70; // 經計算定時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(中斷時重裝定時常數占用時間忽略不計) { counter=0; LED=~LED; } } } 例3.3 使用T0作計數器對外部信號計數,計數值用P0口的LED顯示出來。本例使用第一章介紹的 二極管閃爍發光的實例在1號單片機P5.4輸出的低頻脈沖信號作為2號單片機T0(P3.4)引腳計 數脈沖輸入,有脈沖信號輸入后從P0口就可以看到LED按二進制遞增規律亮滅變化。 #include "STC15W4K.H" // include稱為文件包含命令,后面引號中內容稱為頭文件 void port_mode() // 端口模式 { // 同第一章流水燈程序 } void main() { unsigned char DispBuf; port_mode(); // 所有IO口設為準雙向弱上拉方式。 P0=0xff; // 關閉P0口接的所有燈 TMOD=0x05; // 確定計數工作模式為T0_16位計數,不需要重裝。 TR0=1; // 計數器T0開始運行 for(;;) { DispBuf=TL0; P0=~DispBuf; } } 例3.5 使用T2作計數器對外部信號計數,計數值用P0口的LED顯示出來。若使 用配套實驗板,需要用杜邦線將1號單片機P54連接到2號單片機P3.1/T2引腳 (22腳)上。 void main() { unsigned char DispBuf; port_mode(); // 所有IO口設為準雙向弱上拉方式。 P0=0xff; // 關閉P0口接的所有燈 AUXR|=0x18; // 定時器T2工作于計數方式并開始運行 for(;;) { DispBuf=T2L; P0=~DispBuf; } } 2 中斷系統 當單片機正在處理當前一段程序時,突然出現了另一個更重 要的事件需要處理,單片機可以暫停當前的程序段去執行 更重要的事件對應的程序代碼,當重要程序代碼執行完畢 后返回到原暫停程序處繼續執行原來的代碼,單片機暫停 當前程序去執行其它程序的過程就稱為中斷,當正在執行 重要程序代碼的過程中出現了更為重要的事件時,單片機 還可以暫停當前事件去執行更重要的事件的代碼,稱為中 斷嵌套。 IAP15W4K58S4單片機有21個中斷源,如圖3-11左邊部分所 示,包括5個外部中斷、5個片內定時器/計數器溢出中斷、 4個片內串行口(UART)中斷、1個ADC中斷、1個SPI中斷、 1個低電壓檢測中斷、1個PCA中斷、1個PWM中斷、1個PWM 異常中斷、1個比較器中斷。 2 中斷系統 當單片機正在處理當前一段程序時,突然出現了另一個更重要的事件需要處理,單片機 可以暫停當前的程序段去執行更重要的事件對應的程序代碼,當重要程序代碼執行完畢后 返回到原暫停程序處繼續執行原來的代碼,單片機暫停當前程序去執行其它程序的過程就 稱為中斷 ,簡單的說,中斷就是中途打斷。 當正在執行重要程序代碼的過程中出現了更為重要的事件時,單片機還可以暫停當前事 件去執行更重要事件的代碼,稱為中斷嵌套,IAP15W4K58S4單片機有21個中斷源,最常 用的是外部引腳中斷、定時器中斷、串行口(UART)中斷。 主程序 執行主 程序 中斷請求 執行 中斷 斷點 繼續執行 主程序
處理 函數 中斷返回
%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, 下載次數: 141)
下載附件
2016-3-28 01:40 上傳
中斷系統結構圖(各開關處于默認狀態) 2 操作電路圖中的開關(相關寄存器介紹) 表3-2 定時器/計數器控制寄存器TCON (地址:88H,復位值:0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | TF1 | TR1 | TF0 | TR0 | IE1 | IT1 | IE0 | IT0 |
定時.計數 中斷 ① IT0:INT0引腳觸發方式控制位,可由軟件置1或清“0”。 0:上升沿和下降沿都可以觸發中斷并置位IE0標志。 1:下降沿觸發中斷并置位IE0標志。 ② IE0:INT0中斷請求標志位,當INT0引腳產生中斷信號后由硬件將IE0置1(程序調 試過程中也可以使用軟件置1),CPU響應中斷并進入中斷程序入口地址后立即由硬件將 IE0清0。注意:在匯編語言中剛進入中斷入口地址或C語言中剛進入中斷函數,IE0即 被清零,所以無論匯編還是C語言在中斷程序調試過程中根本看不到IE0=1的情況,因 此,IE0和IE1只在查詢編程的方式上用得上。 ③ IT1:INT1引腳觸發方式控制位,與IT0類似。 ④ IE1:INT1中斷請求標志位,與IE0類似。 ⑤ TF0:定時器T0溢出中斷標志,T0溢出時由硬件將TF0置1, CPU響應中斷并進入中 斷程序入口地址后立即由硬件將TF0清0。注意:在匯編語言中剛進入中斷入口地址或C 語言中剛進入中斷函數,TF0即被清零,所以無論匯編還是C語言在中斷程序序調試過 程中根本看不到TF0=1的情況,因此,TF0和TF1只在查詢編程的方式上用得上。 ⑥ TF1,定時器T1溢出中斷標志,與TF0類似。 中斷允許寄存器IE、IE2、INT_CLKO共同完成中斷信號通路的接通與斷開控制。 表3-13 中斷允許寄存器IE(地址A8H,復位值是:0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | EA | ELVD | EADC | ES | ET1 | EX1 | ET0 | EX0 |
EA:總開關。EA=1,開總中斷,EA=0,關總中斷。 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:外部中斷INT1開關。EX1=1,開外部中斷INT1,EX1=0,關外部中斷INT1。 ET0和EX0與ET1和EX1功能類似。 優先級控制。 單片機對中斷優先級的處理原則是低優先級中斷可被高優先級中斷所中斷,反 之不能。任何一種中斷(不管是高優先級還是低優先級),一旦得到響應,不 會再被與它同級的中斷所中斷,同一優先級的中斷源同時申請中斷時,按照事 先約定的硬件查詢順序響應中斷,也就是說在每個優先級內,還同時存在一個 自然優先級,自然優先級順序見圖3-16右邊部分所示。 表3-16 中斷優先級控制寄存器IP (地址為D8H,復位值是:0000 0000B) 位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | 位名稱 | PPCA | PLVD | PADC | PS | PT1 | PX1 | PT0 | PX0 |
PPCA:PCA優先 (設為1 = 高級中斷,設為0 = 低級中斷) PLVD: 低壓檢測優先 (設為1 = 高級中斷,設為0 = 低級中斷) PADC:ADC優先 (設為1 = 高級中斷,設為0 = 低級中斷) PS:串口1優先 (設為1 = 高級中斷,設為0 = 低級中斷) PT1:定時器T1優先 (設為1 = 高級中斷,設為0 = 低級中斷) PX1:外中斷INT1優先 (設為1 = 高級中斷,設為0 = 低級中斷) PT0:定時器T0優先 (設為1 = 高級中斷,設為0 = 低級中斷) PX0 :外中斷INT0優先 (設為1 = 高級中斷,設為0 = 低級中斷)
3 編寫中斷函數 • 1、中斷函數格式:void 函數名() interrupt m [using n] • void : 返回值類型。由于中斷函數是CPU響應中斷時通過硬件自動調 用的,因此中斷函數的返回值和參數都只能是void(不能返回函數值, 也不能給中斷函數傳遞參數)。 • 函數名:可以隨便寫,只要方便自己識別此函數對應哪個中斷源即可。 • interrupt:指明此函數為中斷專用函數。 • m :中斷源編號(0~13、16~23)確定此函數對應哪一個硬件 中斷。 • using n:確定此中斷函數使用第幾組R0~R7寄存器組(n = 0~3), 通常不必去做工作寄存器組設定,而由編譯器自動選擇,避免產生不 必要的錯誤。 • 使用中斷函數時應注意: • ① 只要程序中開啟了中斷,就必須編寫對應的中斷函數,哪怕是空函 數也必須有(空函數自動執行RETI中斷返回指令),否則中斷產生時 卻找不到可執行的中斷函數,這樣必然引起程序功能錯亂或死機。 • ② 任何函數都不能直接調用中斷函數,另外中斷函數可放在程序中任 何位置而不需要聲明,只要產生中斷,程序就能自動跳入中斷函數執 行。 中斷函數名稱典型書寫格式如下。 • void INT0(void) interrupt 0{} // 外部中斷0中斷函數 • void Timer0(void) interrupt 1{} // 定時器T0 中斷函數 • void INT1(void) interrupt 2{} // 外部中斷1中斷函數 • void Timer1(void) interrupt 3{} // 定時器T1中斷函數 • void UART1(void) interrupt 4{} // 串行口1中斷函數 • void ADC(void) interrupt 5{} // ADC中斷函數 • void LVD(void) interrupt 6{} // 低電壓檢測LVD中斷函數 • void PCA(void) interrupt 7{} // PCA中斷函數 • void UART2(void) interrupt 8{} // 串行口2中斷函數 • void SPI(void) interrupt 9{} // SPI通信中斷函數 • void INT2(void) interrupt 10{} // 外部中斷2中斷函數 • void INT3(void) interrupt 11{} // 外部中斷3中斷函數 • void Timer2(void) interrupt 12{} // 定時器T2中斷函數 • void INT4(void) interrupt 16{} // 外部中斷4中斷函數 • void UART3(void) interrupt 17{} // 串行口3中斷函數 • void UART4(void) interrupt 18{} // 串行口4中斷函數 • void Timer3(void) interrupt 19{} // 定時器3中斷函數 • void Timer4(void) interrupt 20{} // 定時器4中斷函數 • void Comparator(void) interrupt 21{} // 比較器中斷函數 • void PWM(void) interrupt 22{} // PWM中斷函數 • void PWMFD(void) interrupt 23{} // PWM異常中斷函數 4 中斷程序舉例 例3.10 用定時器T0實現P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷方式),R/C 時鐘22.1184MHz。 // 預置初值 = 65536 – Fosc/12*T=65536-22.1184/12×30000 = 2800H #include "STC15W4K.H" sbit P0_0=P0^0; |
| // 包含 "STC15W4K.H"寄存器定義頭文件 | void main() |
|
| { |
|
| P0=0xff; | // | 關閉P1口接的所有燈 | TMOD=0x00; | // | 定時器0的16位自動重裝方式 | TH0=0x28; | // | 定時器初值2800H | TL0=0; |
|
| TR0=1; |
|
| ET0=1; | // | 開定時器0中斷開關 | EA=1; while(1); | // | 開總中斷開關 |
} void Timer0() interrupt 1 { P0_0=!P0_0; // 執行燈亮或滅的動作 } 例3.13 用定時器T2實現P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷方式), R/C時鐘22.1184MHz。 #include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定義頭文件 sbit P0_0=P0^0; void main() { P0=0xff; // 關閉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; // 執行燈亮或滅的動作 } 例3.14 用定時器T3實現P0.0引腳LED亮30ms滅30ms方式閃爍(使用中斷 方式),R/C時鐘22.1184MHz。 #include "STC15W4K.H" // 包含 "STC15W4K.H"寄存器定義頭文件 sbit P0_0=P0^0; void main() { P0=0xff; // 關閉P0口接的所有燈 T4T3M &= 0xFD; // 定時器3為12T模式 T3L = 0; // 初始化計時值, T3H = 0x28; T4T3M |= 0x08; // 定時器3開始計時 IE2 |= 0x20; // 開定時器3中斷 EA = 1; while(1); }
5 外中斷代碼調試技巧(按鍵的防抖技術)
%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, 下載次數: 148)
下載附件
2016-3-28 01:40 上傳
單片機外中斷輸入引腳:
%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, 下載次數: 175)
下載附件
2016-3-28 01:40 上傳
74LS00引腳圖
0.png (17.81 KB, 下載次數: 158)
下載附件
2016-3-28 01:28 上傳
|