盛群c语言应用中断范例

上传人:痛*** 文档编号:72062992 上传时间:2022-04-07 格式:DOC 页数:14 大小:579.50KB
收藏 版权申诉 举报 下载
盛群c语言应用中断范例_第1页
第1页 / 共14页
盛群c语言应用中断范例_第2页
第2页 / 共14页
盛群c语言应用中断范例_第3页
第3页 / 共14页
资源描述:

《盛群c语言应用中断范例》由会员分享,可在线阅读,更多相关《盛群c语言应用中断范例(14页珍藏版)》请在装配图网上搜索。

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 的亮与灭 7.1.1 目的 本范例是使用时钟控制 LED 亮与灭的时间. 亮灭的时间相同并且固定. 是以C语言 撰写中断服务函式. 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 103 页 共 189 页 7.1.2 周边元件 使用单颗 LED 接到微控制器 HT48R10A-1 的埠 A, PA0 引脚 需要使用微控制器 HT

4、48R10A-1 的暂存器 INTC, TMRC 与 TMR 等, 定义如下 TMRC (Timer Control Register) 时钟控制暂存器控制时钟的功能与启动, TMR暂存器是储存时钟启始数值的地方. 当写入TMR暂存器时,也会存入preload 暂存器. 若此时时钟是在停止状态中, 则此数值会被写入时钟计数器(timer counter). 每当时钟被启动, 它便将时钟计数器的数值往上加, 一直加到 FF, 之后便发生时钟 满溢(timer overflow). 这时, 下列的事情会发生 产生中断讯号 (interrupt signal) 盛群半导体股份有限公司 HOLTEK

5、SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 104 页 共 189 页 将 preload 暂存器中的数值重新载入时钟计数器, 并且继续往上计数 如果需要时钟在每 count 个 clock 时产生满溢, 可将 256 count 写入 TMR 暂存器. 如需要正确的时间, 则需要设定根据系统频率设定TMRC暂存器中的 PSC0PSC2. 计算出对应的 count 并将 256 count 写入 TMR 暂存器 如需要产生时钟中断并处理之, 则需要在 INTC 暂存器

6、中打开时钟的中断功能, 将 ETI 设为 1. 当时钟计数满溢时, 就会产生时钟中断, 并跳到中断向量 08H处. 中断函式会对埠A, PA0 的 LED做亮灭的控制 7.1.3 电路图 将埠A 的 PA0 连接到 LED 的阴极 7.1.4 微控制器的架构设定 (configuration option) HT48R10A-1 的 configuration option 设定 WDT clock source : disable OSC : Ext. Crystal Pull-high PA : Pull-high Input type PA : Schmitt Trigger BZ/BZ

7、B : Disable Fsys = 4M 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 105 页 共 189 页 7.1.5 程式流程 7.1.6 原始程式 1 #include “ht48r10a-1.h” 2 #define _ton _0e_04 / 暂存器TMRC 的位元 4, TON 3 char sec_count ; / 记录秒数 4 void interrupt ISR_TIMER(void) 0x8 / 定义中

8、断服务函式 ISR 在位址 0x08 5 6 sec_count+ ; / 每 16 毫秒 (ms) 增加一 7 if( sec_count 62 ) / 超过 16*62 = 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

9、 页 共 189 页 14 15 _pac = 0x01; / 设定 PA0 为输出型态 16 _pa = 0xff ; / 熄灭 LED 17 _intc = 0x05 ; / 设定 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 7.1.7 程式说

10、明 2 定义变数 _ton 为时钟控制暂存器 TMRC 的位元 4, TON 控制时钟的开始或停止 3 定义变数 sec_count 记录秒数 412 定义时钟中断服务函式 ISR_TIMER(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

11、 设定中断控制暂存器 (INTC) 的 EMI 及 ETI, 让中断致能 18 设定时钟控制暂存器 (TMRC), fint=fsys/256, timer mode, fsys = 4MHz, 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微电脑工具事业处部

12、 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 107 页 共 189 页 7.2 类比/数位转换 (ADC) 的应用 7.2.1 目的 本范例利用 HT46R63 微控制器的类比/数位转换电路(analog to digital converter) 将外界的类比讯号转换为数位,并从 LCD 面板显示其值. 以C语言撰写 ADC 中断 服务函式 (ISR) 及 LCD 显示程式 7.2.2 周边元件 LCD 可使用盛群公司 HT-IDE3000 所附之 LCD Simulator 的液晶模拟面板档 LcdDemo.lcd 及 L

13、CD 各段码图案以方便调试, 参阅第六章 6.7 节的 LCD 显示 HT46R63 的类比/数位转换电路, 包含下列的暂存器, 使用前必须先设定 ADR 暂存器 (22H) 类比讯号转换为数位的数值会储存在 ADR 暂存器中. 转换的数值从 0 255. ACSR 暂存器 (23H) 设定A/D转换的速度 ADCR 暂存器 (22H) 选定A/D转换的输入通道, 埠 B 的设定及启动转换的控制 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/

14、14 第 108 页 共 189 页 当要做 A/D 转换时, 需要先选定转换通道, 埠 B 的设定及时钟选取. 之后要将 ADCR 暂存器 (22H) 的位元 7 (START) 设为 0 - 1 - 0, 则 A/D 转换器就开始 做转换的动作. 当转换完成时, ADCR 暂存器的位元 6 (EOCB)会被清为 0, 若A/D 转换的中断功能是致能的 (enable), 则同时会产生中断. 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/1

15、4 第 109 页 共 189 页 如果变更转换通或埠 B 的设定, 则需对 A/D 做初始化的动作, 如下 在变更埠 B 设定的 10 个指令周期内将 ADCR 暂存器的位元 7 (START) 设为 1 再清为 0 即可 为了要利用 HT46R62 A/D 转换器的中断功能, 也需要设定中断向量及中断控制. INTC0 暂存器 位元 0 (EMI) 需要设为 1, 打开中断的总开关 INTC1 暂存器 位元 1 需要设为 1, 将 A/D 转换器的中断功能致能(enable) 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 :

16、 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 110 页 共 189 页 7.2.3 电路图 7.2.4 微控制器的架构设定 (Configuration Options) HT46R63 的 configuration option 设定 WDT clock source : disable OSC : Ext. Crystal Fsys = 4M LCD duty: 3 COM LCD segment: 20 segments SEG7-SEG10: LCD output SEG11-SEG14: Logical output SEG15-

17、SEG18: Logical output Comparator : disable 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 111 页 共 189 页 7.2.5 程式流程 7.2.6 原始程式 1 #include “ht46r63.h” 2 / 标头档中定义有 变数 _emi = _intc0.0 , _eadi = _1e_1 (INTC1 bit 1) , 3 / A/D 转换器的暂存器 _adr (0x21), _

18、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 总通道个数 : 2, AN0 (PB0), AN1 (PB1) 8 char intflag = 0 ; / ADC 中断旗标 9 unsigned char adcvalue = 0 ; / ADC 转换后的数值 10 void interrup

19、t ADC_ISR(void) 0x14 / ADC 中断服务函式, 中断向量为 0x14 11 12 intflag = 1 ; / 设定ADC 中断旗标 LCD RAM清为 0, 不显示 打开 ADC中断及总中断功能 设定 ADC 时钟,频率,转换通道, 总通道数, 启动 AD 转换 将转换完成的数值显示在 LCD面板上 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 112 页 共 189 页 13 adcvalue = _ad

20、r ; / 读取转换后的数值 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_cfg = port B setting (bit 35 of ADCR) 19 void StartADCTrans(char adc_clk, unsigned char channel, unsigned char port_cfg)

21、20 21 _acsr = adc_clk ; / 设定 时钟来源及频率 22 adcr = (port_cfg 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(unsigned char addr, unsigned char datal) 41 42 LcdRamadd

22、r - 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微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 113 页 共 189 页 45 46 / 主函式 47 void main(void) 48

23、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(FSYS8, CH_AN0, ADC_2CH) ; / 开始 ADC 转换 57 while(1) / 无限回圈, 等候 ADC 中断产生 58 59 if( intflag = 1 ) break

24、; / 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(2500

25、00) ; 70 _delay(250000) ; 71 _delay(250000) ; 72 for( k=0 ; k 20 ; k+ ) LcdRamk = 0 ; / 将 LCD记忆体清为0, LCD不显示 73 盛群半导体股份有限公司 HOLTEK SEMICONDUCTOR INC C50微电脑工具事业处部 撰 写 人 : 文 件 编 号 程式语言及应用范例(三) 版 别 1.10 日 期 2007/11/14 第 114 页 共 189 页 7.2.7 程式说明 4 定义 暂存器 ADCR 的位元 7 (START) 57 定义本范例使用的 ADC 时钟来源及频率, 转换通道及通

26、道总个数 8 定义 ADC 中断旗标, 当等于 1 时表示 ADC 转换成功 9 定义变数, 储存 ADC 转换后的数值 1014 定义 ADC 中断服务函式 ADC_ISR(void)及中断向量为 0x14 12 设定 ADC 中断旗标 13 从暂存器读出转换后的数值并存入变数 1925 定义函式 StartADCTrans() 执行 ADC转换 21 设定 ADC 转换时钟及频率 22 选定 ADC 转换通道及通道总数 23 埠 B 设定更改 24 启动 ADC 转换功能 2645 与第六章 6.7 节相同, LCD 显示函式 4773 主函式, 设定及启动 ADC 转换并将转换后的数值从 LCD 面板显示 51 将 LCD记忆体清为0, LCD不显示 52 停止所有中断的发生 53 ADC 中断功能生效 54 所有中断功能有效 55 ADC 中断旗标清为 0 56 开始 ADC 转换 5760 无限回圈, 等候 ADC 中断产生则跳出回圈 59 产生 ADC 中断, 跳出回圈 6267 将转换后的数值显示在 LCD 面板 6263 取出百位数字, 显示百位数字 6465 取出十位数字, 显示数字 6667 取出个位数, 显示数字 6869 延长显示时间为 1 秒 72 将 LCD显示器关闭

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!