




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 应用范例 中断程式 本章介绍以C 语言程式处理微控制器的中断事件. 第四章 4.7 中断服务函式 中说明如何 撰写中断服务函式以及注意事项. 必须遵照下列的规则来定义中断服务函式 函式的返回值型态必须是 void interrupt 函式不可有参数 (argument) 设定中断服务函式的中断向量 (interrupt vector) 使用 指定中断向量 最好不要从程式的其他地方呼叫中断服务函式 不要在中断服务函式内做开启本中断功能 (interrupt reentrance) 相同的中断不要重复进入 格式 void interrupt ISR_Timer(void) 0x08 / 定
2、义 : 返回值的型态, 没有参数, 设定中断向量为 0x08 C 编译器会根据中断服务函式对暂存器的需要, 在进入中断服务函式后, 将这些暂存器的内 容储存. 等执行完中断服务函式的工作后, 再恢复先前所储存的暂存器内容. 最后回要被中 断的地方继续执行, 同时中断功能也打开, 允许中断产生. 如果为了节省程式编码的大小, 在 中断服务函式中也可不要保存某些暂存器, 例如 BP, MP0, MP1.可参考第四章的 4.9 节关于 #pragma 的说明及使用. 在中断服务函式中不要将自身的中断功能再打开, 避免重复进入同一 个中断服务函式. 但是可以打开其他的中断功能, 只是要特别注意两个中断
3、服务函式有无呼叫 到相同函式的状态, 以致发生变数共用造成资料错误的风险. 7.1. 用时钟控制 LED 的亮与灭 本范例是使用时钟控制 LED 亮与灭的时间. 亮灭的时间相同并且固定. 是以C语言 撰写中断服务函式. 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 103 页 共 189 页 使用单颗 LED 接到微控制器 HT48R10A-1 的埠 A, PA0 引脚 需要使用微控制器 HT48R10A-1 的暂存器 INTC,
4、TMRC 与 TMR 等, 定义如下 TMRC (Timer Control Register) 时钟控制暂存器控制时钟的功能与启动, TMR暂存器是储存时钟启始数值的地方. 当写入TMR暂存器时,也会存入preload 暂存器. 若此时时钟是在停止状态中, 则此数值会被写入时钟计数器(timer counter). 每当时钟被启动, 它便将时钟计数器的数值往上加, 一直加到 FF, 之后便发生时钟 满溢(timer overflow). 这时, 下列的事情会发生 产生中断讯号 (interrupt signal) 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C5
5、0微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 104 页 共 189 页 将 preload 暂存器中的数值重新载入时钟计数器, 并且继续往上计数 如果需要时钟在每 count 个 clock 时产生满溢, 可将 256 count 写入 TMR 暂存器. 如需要正确的时间, 则需要设定根据系统频率设定TMRC暂存器中的 PSC0PSC2. 计算出对应的 count 并将 256 count 写入 TMR 暂存器 如需要产生时钟中断并处理之, 则需要在 INTC 暂存器中打开时钟的中断功能, 将 ETI 设为
6、 1. 当时钟计数满溢时, 就会产生时钟中断, 并跳到中断向量 08H处. 中断函式会对埠A, PA0 的 LED做亮灭的控制 将埠A 的 PA0 连接到 LED 的阴极 HT48R10A-1 的 configuration option 设定 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微电脑工具事业
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 ; / 记录秒数 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微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 106 页 共 189 页 14 15 _pac = 0x01; / 设定 PA0 为输出型态 16 _pa = 0xff ; / 熄灭 LED 17 _intc = 0x05
9、; / 设定 EMI, ETI 致能. 打开中断功能 18 _tmrc = 0x87 ; / 设定时钟控制暂存器, fint=fsys/256, timer mode 19 _tmr = (256 250) ; / 每 250 clock 产生一次时钟中断 20 sec_count = 0 ; / 设定初始值 21 _ton = 1 ; / 启动时钟开始计时 22 while(1) ; / 无限回圈 23 2 定义变数 _ton 为时钟控制暂存器 TMRC 的位元 4, TON 控制时钟的开始或停止 3 定义变数 sec_count 记录秒数 412 定义时钟中断服务函式 ISR_TIMER(
10、void) 放置于位址 0x08 处 6 每 16 毫秒 (ms) 增加一 7 如果累计的毫秒数超过 62 次 (超过 16*62 = 992 毫秒, 一秒) 9 sec_count 重设为 0, 重开始计数 10 toggle LED, 每一秒会轮流为亮灭 1223 主程式 main(void) 15 将 PA0 设为为输出型态, PA0 接到 LED 16 设定 PA0 为 1, 熄灭 LED 17 设定中断控制暂存器 (INTC) 的 EMI 及 ETI, 让中断致能 18 设定时钟控制暂存器 (TMRC), fint=fsys/256, timer mode, fsys = 4MHz,
11、 1 clock=64us 时钟频率 = 4M /256, clock = 1/时钟频率 = 64 us 19 设定时钟每隔 250 clock, 产生一次时钟中断. 250 * 64us = 16ms 20 设定初始值 21 设定 _ton = 1 , 启动时钟开始计时 22 无限回圈 while(1) 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 107 页 共 189 页 7.2 类比/数位转换 (ADC) 的应用 本范例利用
12、 HT46R63 微控制器的类比/数位转换电路(analog to digital converter) 将外界的类比讯号转换为数位,并从 LCD 面板显示其值. 以C语言撰写 ADC 中断 服务函式 (ISR) 及 LCD 显示程式 LCD 可使用盛群公司 HT-IDE3000 所附之 LCD Simulator 的液晶模拟面板档 LcdDemo.lcd 及 LCD 各段码图案以方便调试, 参阅第六章 6.7 节的 LCD 显示 HT46R63 的类比/数位转换电路, 包含下列的暂存器, 使用前必须先设定 ADR 暂存器 (22H) 类比讯号转换为数位的数值会储存在 ADR 暂存器中. 转换
13、的数值从 0 255. ACSR 暂存器 (23H) 设定A/D转换的速度 ADCR 暂存器 (22H) 选定A/D转换的输入通道, 埠 B 的设定及启动转换的控制 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 108 页 共 189 页 当要做 A/D 转换时, 需要先选定转换通道, 埠 B 的设定及时钟选取. 之后要将 ADCR 暂存器 (22H) 的位元 7 (START) 设为 0 -> 1 -> 0, 则 A/
14、D 转换器就开始 做转换的动作. 当转换完成时, ADCR 暂存器的位元 6 (EOCB)会被清为 0, 若A/D 转换的中断功能是致能的 (enable), 则同时会产生中断. 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 109 页 共 189 页 如果变更转换通或埠 B 的设定, 则需对 A/D 做初始化的动作, 如下 在变更埠 B 设定的 10 个指令周期内将 ADCR 暂存器的位元 7 (START) 设为 1 再清为 0
15、 即可 为了要利用 HT46R62 A/D 转换器的中断功能, 也需要设定中断向量及中断控制. INTC0 暂存器 位元 0 (EMI) 需要设为 1, 打开中断的总开关 INTC1 暂存器 位元 1 需要设为 1, 将 A/D 转换器的中断功能致能(enable) 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 110 页 共 189 页 HT46R63 的 configuration option 设定 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微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 111 页 共 189
17、 页 1 #include “ht46r63.h” 2 / 标头档中定义有 变数 _emi = _intc0.0 , _eadi = _1e_1 (INTC1 bit 1) , 3 / A/D 转换器的暂存器 _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 转换通道 7 #define ADC_2CH 2 / ADC 总通道个数
18、 : 2, AN0 (PB0), AN1 (PB1) 8 char intflag = 0 ; / ADC 中断旗标 9 unsigned char adcvalue = 0 ; / ADC 转换后的数值 10 void interrupt ADC_ISR(void) 0x14 / ADC 中断服务函式, 中断向量为 0x14 11 12 intflag = 1 ; / 设定ADC 中断旗标 LCD RAM清为 0, 不显示 打开 ADC中断及总中断功能 设定 ADC 时钟,频率,转换通道, 总通道数, 启动 AD 转换 将转换完成的数值显示在 LCD面板上 盛群半导体股份有限公司 HOLTE
19、K SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 112 页 共 189 页 13 adcvalue = _adr ; / 读取转换后的数值 14 15 / 启动 ADC 转换功能 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 ; / 设定 时钟来源及频率 22 adcr = (port_cfg << 3) | channel ; / 设定通道, 埠B设定 23 adc_start = 1 ; adc_start = 0 ; / 改变 ADC通道及埠B 设定 24 adc_start = 0 ; adc_start = 1 ;
21、adc_start = 0 ; / 启动 ADC 转换 25 26 / 以下函式 (除了主函式 main) 与 第六章 6.7 节相同 27 / 定义数字 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微电脑工具事业处部 撰 写 人 : 文 件
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 ; / 停止所有中断的发生 53 _eadi = 1 ; / ADC 中断功能生效 54 _emi = 1 ; / 所有中断功能生效 55 intflag = 0 ; / ADC 中断旗标 56 StartADCTrans(FSY
25、S8, CH_AN0, ADC_2CH) ; / 开始 ADC 转换 57 while(1) / 无限回圈, 等候 ADC 中断产生 58 59 if( intflag = 1 ) break ; / ADC 中断产生, 跳出回圈 60 61 / 将转换好的数字显示于 LCD 面板 62 k = adcvalue / 100 ; / 取出百位数字 63 DisplayLcd(0x146, digitk) ; / 显示百位数字 64 k = (adcvalue / 10) % 10 ; / 取出十位数字 65 DisplayLcd(0x143, digitk) ; / 显示数字 66 k = adcvalue % 10 ; / 取出个位数 67 DisplayLcd(0x140, digitk) ; 68 _delay(250000) ; / 延长 1 秒 69 _delay(250000) ;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 武汉外语外事职业学院《投资学实验》2023-2024学年第二学期期末试卷
- 成都理工大学工程技术学院《无机及分析》2023-2024学年第二学期期末试卷
- 雅安职业技术学院《施肥原理与技术》2023-2024学年第二学期期末试卷
- 乐山师范学院《名著导读》2023-2024学年第二学期期末试卷
- 湖北三峡职业技术学院《仪表自动化与过程控制》2023-2024学年第二学期期末试卷
- 遵义医科大学《大数据开源架构》2023-2024学年第二学期期末试卷
- 皖西卫生职业学院《项目策划与管理》2023-2024学年第二学期期末试卷
- 山东理工职业学院《大气污染控制课程设计》2023-2024学年第二学期期末试卷
- 温州职业技术学院《计算机网络与通信技术》2023-2024学年第二学期期末试卷
- 西安工程大学《发电厂电气主系统》2023-2024学年第二学期期末试卷
- 腰椎骨关节炎诊断和治疗
- (正式版)HGT 20593-2024 钢制化工设备焊接与检验工程技术规范
- 宁工院油库设计与管理专题讲座:石油形势与运输概况
- 中考数学选择、填空压轴题
- MOOC 儿科学-四川大学 中国大学慕课答案
- 超声在康复医学中的应用
- 汽车吊吊装施工方案及流程
- 国家版图知识竞赛样题库(试题及答案)
- 物业服务管理培训课件
- 2024年山西省华远国际陆港集团有限公司招聘笔试参考题库含答案解析
- 10kV供配电系统电气设备改造 投标方案(技术方案)
评论
0/150
提交评论