盛群c語言應用中斷范例_第1頁
盛群c語言應用中斷范例_第2頁
盛群c語言應用中斷范例_第3頁
盛群c語言應用中斷范例_第4頁
盛群c語言應用中斷范例_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第七章 應用范例 中斷程式 本章介紹以C 語言程式處理微控制器的中斷事件. 第四章 4.7 中斷服務函式 中說明如何 撰寫中斷服務函式以及注意事項. 必須遵照下列的規(guī)則來定義中斷服務函式 函式的返回值型態(tài)必須是 void interrupt 函式不可有參數(shù) (argument) 設(shè)定中斷服務函式的中斷向量 (interrupt vector) 使用 指定中斷向量 最好不要從程式的其他地方呼叫中斷服務函式 不要在中斷服務函式內(nèi)做開啟本中斷功能 (interrupt reentrance) 相同的中斷不要重復進入 格式 void interrupt ISR_Timer(void) 0x08 / 定

2、義 : 返回值的型態(tài), 沒有參數(shù), 設(shè)定中斷向量為 0x08 C 編譯器會根據(jù)中斷服務函式對暫存器的需要, 在進入中斷服務函式后, 將這些暫存器的內(nèi) 容儲存. 等執(zhí)行完中斷服務函式的工作后, 再恢復先前所儲存的暫存器內(nèi)容. 最后回要被中 斷的地方繼續(xù)執(zhí)行, 同時中斷功能也打開, 允許中斷產(chǎn)生. 如果為了節(jié)省程式編碼的大小, 在 中斷服務函式中也可不要保存某些暫存器, 例如 BP, MP0, MP1.可參考第四章的 4.9 節(jié)關(guān)于 #pragma 的說明及使用. 在中斷服務函式中不要將自身的中斷功能再打開, 避免重復進入同一 個中斷服務函式. 但是可以打開其他的中斷功能, 只是要特別注意兩個中斷

3、服務函式有無呼叫 到相同函式的狀態(tài), 以致發(fā)生變數(shù)共用造成資料錯誤的風險. 7.1. 用時鐘控制 LED 的亮與滅 本范例是使用時鐘控制 LED 亮與滅的時間. 亮滅的時間相同并且固定. 是以C語言 撰寫中斷服務函式. 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 103 頁 共 189 頁 使用單顆 LED 接到微控制器 HT48R10A-1 的埠 A, PA0 引腳 需要使用微控制器 HT48R10A-1 的暫存器 INTC,

4、TMRC 與 TMR 等, 定義如下 TMRC (Timer Control Register) 時鐘控制暫存器控制時鐘的功能與啟動, TMR暫存器是儲存時鐘啟始數(shù)值的地方. 當寫入TMR暫存器時,也會存入preload 暫存器. 若此時時鐘是在停止狀態(tài)中, 則此數(shù)值會被寫入時鐘計數(shù)器(timer counter). 每當時鐘被啟動, 它便將時鐘計數(shù)器的數(shù)值往上加, 一直加到 FF, 之后便發(fā)生時鐘 滿溢(timer overflow). 這時, 下列的事情會發(fā)生 產(chǎn)生中斷訊號 (interrupt signal) 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C5

5、0微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 104 頁 共 189 頁 將 preload 暫存器中的數(shù)值重新載入時鐘計數(shù)器, 并且繼續(xù)往上計數(shù) 如果需要時鐘在每 count 個 clock 時產(chǎn)生滿溢, 可將 256 count 寫入 TMR 暫存器. 如需要正確的時間, 則需要設(shè)定根據(jù)系統(tǒng)頻率設(shè)定TMRC暫存器中的 PSC0PSC2. 計算出對應的 count 并將 256 count 寫入 TMR 暫存器 如需要產(chǎn)生時鐘中斷并處理之, 則需要在 INTC 暫存器中打開時鐘的中斷功能, 將 ETI 設(shè)為

6、 1. 當時鐘計數(shù)滿溢時, 就會產(chǎn)生時鐘中斷, 并跳到中斷向量 08H處. 中斷函式會對埠A, PA0 的 LED做亮滅的控制 將埠A 的 PA0 連接到 LED 的陰極 HT48R10A-1 的 configuration option 設(shè)定 WDT clock source : disable OSC : Ext. Crystal Pull-high PA : Pull-high Input type PA : Schmitt Trigger BZ/BZB : Disable Fsys = 4M 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)

7、處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 105 頁 共 189 頁 1 #include “ht48r10a-1.h” 2 #define _ton _0e_04 / 暫存器TMRC 的位元 4, TON 3 char sec_count ; / 記錄秒數(shù) 4 void interrupt ISR_TIMER(void) 0x8 / 定義中斷服務函式 ISR 在位址 0x08 5 6 sec_count+ ; / 每 16 毫秒 (ms) 增加一 7 if( sec_count > 62 ) / 超過 16*62

8、 = 992 毫秒, 一秒 8 9 sec_count = 0 ; / 重開始 10 _pa0 = 0x01 ; / toggle LED, 每一秒, 輪流亮滅 11 12 13 void main(void) 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 106 頁 共 189 頁 14 15 _pac = 0x01; / 設(shè)定 PA0 為輸出型態(tài) 16 _pa = 0xff ; / 熄滅 LED 17 _intc = 0x05

9、; / 設(shè)定 EMI, ETI 致能. 打開中斷功能 18 _tmrc = 0x87 ; / 設(shè)定時鐘控制暫存器, fint=fsys/256, timer mode 19 _tmr = (256 250) ; / 每 250 clock 產(chǎn)生一次時鐘中斷 20 sec_count = 0 ; / 設(shè)定初始值 21 _ton = 1 ; / 啟動時鐘開始計時 22 while(1) ; / 無限回圈 23 2 定義變數(shù) _ton 為時鐘控制暫存器 TMRC 的位元 4, TON 控制時鐘的開始或停止 3 定義變數(shù) sec_count 記錄秒數(shù) 412 定義時鐘中斷服務函式 ISR_TIMER(

10、void) 放置于位址 0x08 處 6 每 16 毫秒 (ms) 增加一 7 如果累計的毫秒數(shù)超過 62 次 (超過 16*62 = 992 毫秒, 一秒) 9 sec_count 重設(shè)為 0, 重開始計數(shù) 10 toggle LED, 每一秒會輪流為亮滅 1223 主程式 main(void) 15 將 PA0 設(shè)為為輸出型態(tài), PA0 接到 LED 16 設(shè)定 PA0 為 1, 熄滅 LED 17 設(shè)定中斷控制暫存器 (INTC) 的 EMI 及 ETI, 讓中斷致能 18 設(shè)定時鐘控制暫存器 (TMRC), fint=fsys/256, timer mode, fsys = 4MHz,

11、 1 clock=64us 時鐘頻率 = 4M /256, clock = 1/時鐘頻率 = 64 us 19 設(shè)定時鐘每隔 250 clock, 產(chǎn)生一次時鐘中斷. 250 * 64us = 16ms 20 設(shè)定初始值 21 設(shè)定 _ton = 1 , 啟動時鐘開始計時 22 無限回圈 while(1) 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 107 頁 共 189 頁 7.2 類比/數(shù)位轉(zhuǎn)換 (ADC) 的應用 本范例利用

12、 HT46R63 微控制器的類比/數(shù)位轉(zhuǎn)換電路(analog to digital converter) 將外界的類比訊號轉(zhuǎn)換為數(shù)位,并從 LCD 面板顯示其值. 以C語言撰寫 ADC 中斷 服務函式 (ISR) 及 LCD 顯示程式 LCD 可使用盛群公司 HT-IDE3000 所附之 LCD Simulator 的液晶模擬面板檔 LcdDemo.lcd 及 LCD 各段碼圖案以方便調(diào)試, 參閱第六章 6.7 節(jié)的 LCD 顯示 HT46R63 的類比/數(shù)位轉(zhuǎn)換電路, 包含下列的暫存器, 使用前必須先設(shè)定 ADR 暫存器 (22H) 類比訊號轉(zhuǎn)換為數(shù)位的數(shù)值會儲存在 ADR 暫存器中. 轉(zhuǎn)換

13、的數(shù)值從 0 255. ACSR 暫存器 (23H) 設(shè)定A/D轉(zhuǎn)換的速度 ADCR 暫存器 (22H) 選定A/D轉(zhuǎn)換的輸入通道, 埠 B 的設(shè)定及啟動轉(zhuǎn)換的控制 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 108 頁 共 189 頁 當要做 A/D 轉(zhuǎn)換時, 需要先選定轉(zhuǎn)換通道, 埠 B 的設(shè)定及時鐘選取. 之后要將 ADCR 暫存器 (22H) 的位元 7 (START) 設(shè)為 0 -> 1 -> 0, 則 A/

14、D 轉(zhuǎn)換器就開始 做轉(zhuǎn)換的動作. 當轉(zhuǎn)換完成時, ADCR 暫存器的位元 6 (EOCB)會被清為 0, 若A/D 轉(zhuǎn)換的中斷功能是致能的 (enable), 則同時會產(chǎn)生中斷. 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 109 頁 共 189 頁 如果變更轉(zhuǎn)換通或埠 B 的設(shè)定, 則需對 A/D 做初始化的動作, 如下 在變更埠 B 設(shè)定的 10 個指令周期內(nèi)將 ADCR 暫存器的位元 7 (START) 設(shè)為 1 再清為 0

15、 即可 為了要利用 HT46R62 A/D 轉(zhuǎn)換器的中斷功能, 也需要設(shè)定中斷向量及中斷控制. INTC0 暫存器 位元 0 (EMI) 需要設(shè)為 1, 打開中斷的總開關(guān) INTC1 暫存器 位元 1 需要設(shè)為 1, 將 A/D 轉(zhuǎn)換器的中斷功能致能(enable) 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 110 頁 共 189 頁 HT46R63 的 configuration option 設(shè)定 WDT clock sou

16、rce : disable OSC : Ext. Crystal Fsys = 4M LCD duty: 3 COM LCD segment: 20 segments SEG7-SEG10: LCD output SEG11-SEG14: Logical output SEG15-SEG18: Logical output Comparator : disable 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 111 頁 共 189

17、 頁 1 #include “ht46r63.h” 2 / 標頭檔中定義有 變數(shù) _emi = _intc0.0 , _eadi = _1e_1 (INTC1 bit 1) , 3 / A/D 轉(zhuǎn)換器的暫存器 _adr (0x21), _adcr (0x22), _acsr (0x23) 4 #define adc_start _22_7 / bit 7 (START) of ADCR 暫存器 5 #define FSYS8 0x01 / ADC 時鐘來源及 fsys/8 6 #define CH_AN0 0 / ADC 轉(zhuǎn)換通道 7 #define ADC_2CH 2 / ADC 總通道個數(shù)

18、 : 2, AN0 (PB0), AN1 (PB1) 8 char intflag = 0 ; / ADC 中斷旗標 9 unsigned char adcvalue = 0 ; / ADC 轉(zhuǎn)換后的數(shù)值 10 void interrupt ADC_ISR(void) 0x14 / ADC 中斷服務函式, 中斷向量為 0x14 11 12 intflag = 1 ; / 設(shè)定ADC 中斷旗標 LCD RAM清為 0, 不顯示 打開 ADC中斷及總中斷功能 設(shè)定 ADC 時鐘,頻率,轉(zhuǎn)換通道, 總通道數(shù), 啟動 AD 轉(zhuǎn)換 將轉(zhuǎn)換完成的數(shù)值顯示在 LCD面板上 盛群半導體股份有限公司 HOLTE

19、K SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 112 頁 共 189 頁 13 adcvalue = _adr ; / 讀取轉(zhuǎn)換后的數(shù)值 14 15 / 啟動 ADC 轉(zhuǎn)換功能 16 / adc_clk = clock source of ADC, fsys/2, fsys/8, fsys/32 (bit01 of ACSR) 17 / channel = channel number of AN, 0 7 (bit 02 of ADCR) 18 / port_cf

20、g = port B setting (bit 35 of ADCR) 19 void StartADCTrans(char adc_clk, unsigned char channel, unsigned char port_cfg) 20 21 _acsr = adc_clk ; / 設(shè)定 時鐘來源及頻率 22 adcr = (port_cfg << 3) | channel ; / 設(shè)定通道, 埠B設(shè)定 23 adc_start = 1 ; adc_start = 0 ; / 改變 ADC通道及埠B 設(shè)定 24 adc_start = 0 ; adc_start = 1 ;

21、adc_start = 0 ; / 啟動 ADC 轉(zhuǎn)換 25 26 / 以下函式 (除了主函式 main) 與 第六章 6.7 節(jié)相同 27 / 定義數(shù)字 0 9 的 LCD RAM 資料, 7 個位元控制各段的顯示 28 / 圖樣各段 gacf bdc 29 char digit10 = 0b01111101, 0b00011000, 0b01110011, 0b01111010, /0, 1,2,3 30 0b00011110, 0b01101110, 0b01101111, 0b00111000, / 4,5,6,7 31 0b01111111, 0b01111110 ; / 8, 9

22、32 char LcdRam20 0x140 ; / LCD RAM 記憶體 33 void DelayTime(unsigned int count) / 10 * count + 11, if count > 256 34 35 while( count != 0 ) count- ; 36 37 / addr (IN) = LCD RAM 位址 = 0x140+x 38 / datal = 寫入 LCD RAM 的資料, bit02 寫入 addr, bit35 寫入 addr+1 39 / bit 6 寫入 addr+2 的 bit2 40 void DisplayLcd(uns

23、igned char addr, unsigned char datal) 41 42 LcdRamaddr - 0x140 = datal & 0x7 ; / 取位元 0 2 43 LcdRamaddr - 0x140+1 = (data1 >> 3) & 0x7 ; / 取位元 35 44 LcdRamaddr 0x140+2 = (data >> 6) & 0x7) << 2 ; / 取位元6, 在左移2位 盛群半導體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫 人 : 文 件

24、 編 號 程式語言及應用范例(三) 版 別 1.10 日 期 2007/11/14 第 113 頁 共 189 頁 45 46 / 主函式 47 void main(void) 48 49 int k ; 50 51 for( k=0 ; k < 20 ; k+ ) LcdRamk = 0 ; / 將 LCD記憶體清為0, LCD不顯示 52 _emi = 0 ; / 停止所有中斷的發(fā)生 53 _eadi = 1 ; / ADC 中斷功能生效 54 _emi = 1 ; / 所有中斷功能生效 55 intflag = 0 ; / ADC 中斷旗標 56 StartADCTrans(FSY

25、S8, CH_AN0, ADC_2CH) ; / 開始 ADC 轉(zhuǎn)換 57 while(1) / 無限回圈, 等候 ADC 中斷產(chǎn)生 58 59 if( intflag = 1 ) break ; / ADC 中斷產(chǎn)生, 跳出回圈 60 61 / 將轉(zhuǎn)換好的數(shù)字顯示于 LCD 面板 62 k = adcvalue / 100 ; / 取出百位數(shù)字 63 DisplayLcd(0x146, digitk) ; / 顯示百位數(shù)字 64 k = (adcvalue / 10) % 10 ; / 取出十位數(shù)字 65 DisplayLcd(0x143, digitk) ; / 顯示數(shù)字 66 k = adcvalue % 10 ; / 取出個位數(shù) 67 DisplayLcd(0x140, digitk) ; 68 _delay(250000) ; / 延長 1 秒 69 _delay(250000) ;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論