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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

6、 1. 當(dāng)時(shí)鐘計(jì)數(shù)滿溢時(shí), 就會(huì)產(chǎn)生時(shí)鐘中斷, 并跳到中斷向量 08H處. 中斷函式會(huì)對(duì)埠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 盛群半導(dǎo)體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)

7、處部 撰 寫(xiě) 人 : 文 件 編 號(hào) 程式語(yǔ)言及應(yīng)用范例(三) 版 別 1.10 日 期 2007/11/14 第 105 頁(yè) 共 189 頁(yè) 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 / 定義中斷服務(wù)函式 ISR 在位址 0x08 5 6 sec_count+ ; / 每 16 毫秒 (ms) 增加一 7 if( sec_count > 62 ) / 超過(guò) 16*62

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

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

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

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

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

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

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

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

17、 頁(yè) 1 #include “ht46r63.h” 2 / 標(biāo)頭檔中定義有 變數(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 時(shí)鐘來(lái)源及 fsys/8 6 #define CH_AN0 0 / ADC 轉(zhuǎn)換通道 7 #define ADC_2CH 2 / ADC 總通道個(gè)數(shù)

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

19、K SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫(xiě) 人 : 文 件 編 號(hào) 程式語(yǔ)言及應(yīng)用范例(三) 版 別 1.10 日 期 2007/11/14 第 112 頁(yè) 共 189 頁(yè) 13 adcvalue = _adr ; / 讀取轉(zhuǎn)換后的數(shù)值 14 15 / 啟動(dòng) 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è)定 時(shí)鐘來(lái)源及頻率 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 ; / 啟動(dòng) ADC 轉(zhuǎn)換 25 26 / 以下函式 (除了主函式 main) 與 第六章 6.7 節(jié)相同 27 / 定義數(shù)字 0 9 的 LCD RAM 資料, 7 個(gè)位元控制各段的顯示 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 = 寫(xiě)入 LCD RAM 的資料, bit02 寫(xiě)入 addr, bit35 寫(xiě)入 addr+1 39 / bit 6 寫(xiě)入 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位 盛群半導(dǎo)體股份有限公司 HOLTEK SEMICONDUCTOR INC C50微電腦工具事業(yè)處部 撰 寫(xiě) 人 : 文 件

24、 編 號(hào) 程式語(yǔ)言及應(yīng)用范例(三) 版 別 1.10 日 期 2007/11/14 第 113 頁(yè) 共 189 頁(yè) 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 中斷旗標(biāo) 56 StartADCTrans(FSY

25、S8, CH_AN0, ADC_2CH) ; / 開(kāi)始 ADC 轉(zhuǎn)換 57 while(1) / 無(wú)限回圈, 等候 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 ; / 取出個(gè)位數(shù) 67 DisplayLcd(0x140, digitk) ; 68 _delay(250000) ; / 延長(zhǎng) 1 秒 69 _delay(250000) ;

溫馨提示

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

評(píng)論

0/150

提交評(píng)論