中断功能的应用举例.ppt

上传人:牧羊曲112 文档编号:5170580 上传时间:2023-06-10 格式:PPT 页数:15 大小:297.50KB
返回 下载 相关 举报
中断功能的应用举例.ppt_第1页
第1页 / 共15页
中断功能的应用举例.ppt_第2页
第2页 / 共15页
中断功能的应用举例.ppt_第3页
第3页 / 共15页
中断功能的应用举例.ppt_第4页
第4页 / 共15页
中断功能的应用举例.ppt_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《中断功能的应用举例.ppt》由会员分享,可在线阅读,更多相关《中断功能的应用举例.ppt(15页珍藏版)》请在三一办公上搜索。

1、9.6 中断功能的应用举例,由于中断功能是一种应用比较广发的功能,在绝大多数的单片机控制项目中几乎都会用到此功能,因此,我们在本节中尽量利用ICD配套演示板上不算很多的硬件资源,通过灵活配置和辅以必要的附加条件,尽可能多样化的设计几个实验范例,以便充分展现中断功能的不同用法和编程技巧。下面的3个范例中,第1个范例中着重应用的一个中断源是TMR0;第2个实验中则重应用的中断源是外部中断INT;第3个实验中着重应用RB端口电平变化中断,并且有2个中断源(外部INT和端口RB)同时在活动.9.6.1 TMR0溢出中断 如何以中断方式利用模块产生延时?与查询方式相比,以中断方式利用TMR0模块产生延时

2、是如何分解CPU负担的?下面的实验范例会使读者得到答案。例9.1闪烁跑马灯 实验项目实现的功能,把演示板上的8只LED发光二极管,规划为跑马等方式轮流闪烁发光。也就是8只LED中只有一只点亮,亮灯的位置以循环方式不停的移动,移动的速度取决于在各个位置上停留的时间,即在两步之间插入一个约96ms的延时,并且在每一个位置上LED都保持快速闪烁。硬件电路规划 流水灯电路如图9.3所示(电路图总各个元器件的标号保持与MAPLABICD用户指南中提供的电路图中各元器件标号一致)。利用端口RC上现有的8只发光二极管LED作为显示部件,各只LED均有限流电阻,主要为的是对单片机端口引脚内部电路起保护作用。单

3、片机的时钟振荡器工作模式选用RC阻容振荡方式(将跳线JP1插接到演示板标有RC一侧的接线针上),根据电路中给定的R3和R4阻容值,时钟频率大约为4MHz。万一单片机脱离正常工作状态,而进入失控状态(或出现非正常现象),就可以利用复位按钮SW2,对单片机实施人工强行复位。利用片内的定时器/计数器TMR0模块和中断逻辑功能部件,让TMR0工作于定时器模式,并且在超时溢出时向CPU发送中断请求信号。,图9.3 闪烁式跑马灯电路,软件设计思路 驱动8只LED的显示码的形成,采用一次性向端口寄存器赋初值,然后循环移动的方式。在本例的程序中,需要加入2段延时,一个使LED灯每向前移动一步都要延迟一会(记为

4、T1),另一个是LED还要亮、灭频繁切换形成闪烁,在亮态和灭态上都保留一个延时(记为T2)。我们打算T1延时用软件手段实现,T2延时以硬件措施完成,分频器配置给TMR0使用,并且分频比设定为最大(1:256),利用TMR0编制一段大约66ms的延时子程序。TMR0延时时长的计算式为256*(256-0)指令周期=65536指令周期=65536 s=65.536ms。其中,前面的256是分频比,括号内的256是TMR0的最大技术值;0是每次循环累加计数开始时需要向TMR0填写的初始值,直到计数到256时产生溢出。即从00H开始经过256次加1后,累计到100H便产生高位溢出,并且发出中断请求。程

5、序流程图 如图9.4所是,包含主程序和中断服务子程序的流程图,延时子程序再次不再赘述,可以参见“PIC汇编语言程序设计基础”一部分中关于岩石子程序的介绍。,图 9.4 程序流程图,程序清单;*;闪烁式跑马灯;程序文件名为“INTEXP.ASM”;*tmr0 equ 01h;定义定时器/计数器0寄存器地址 pcl equ 02h;定义程序计数器低字节寄存器地址 status equ 3h;定义状态寄存器地址 option_reg equ 81h;定义选项寄存器地址 intcon equ 0bh;定义中断控制寄存器地址 portc equ 07h;定义端口C的数据寄存器地址 trisc equ 8

6、7h;定义端口C的方向控制寄存器地址 tmer0_b equ 0;定义TMR0寄存器初始值(256=256-0)dly1 equ 20h;定义一个延时变量寄存器 dly2 equ 21h;定义另一个延时变量寄存器 w equ 0;定义传送目标寄存器为W的指示位 f equ 1;定义传送目标寄存器为RAM的指示位 rp0 equ 5;定义状态寄存器中的预选位RP0 t0if equ 2;定义TMR0的中断标志位 w_temp equ 7fh;在体0上定义临时备份寄存器 portc_c equ 23h;定义一个显示缓冲区寄存器,flag equ 24h;定义一个亮灭标志位(只用寄存器的末位);*复

7、 位 向 量*org 000h;定义程序存放区域的启示地址 nop;设置一条ICD必需的空操作指令 goto main;*中断向量和中断服务子程序*org 004h;中断向量,中断服务程序入口地址 tmr0serv;中断服务程序名称 movwf w_temp;复制W到他的临时备份寄存器W_TEMP bcf intcon,t0if;清除TMR0溢出中断标志位 incf flag,f;亮灭标志位(寄存器末位)反转 btfss flag,0;标志位=1?是!跳一步到“熄灭”goto jump0;否!跳到“点亮”clrf portc;熄灭 goto jump1;跳过下面的程序 jump0 movf p

8、ortc_b;点亮,即将缓冲区内容先传入W movwf portc;再由W转入端口寄存器,送显 jump1 movlw tmr0_b;TMR0赋初值 movwf tmr0;并(重新)启动定时计算 movf w_temp,w:恢复现场 retfie:中断返回,;*主程序*main bsf status,rp0;设置文件寄存器的体1 movlw 0;将端口C的方向控制00h码先送W movwf trisc;再转到方向寄存器,RC全部设为输出 movlw 07h;设置选项寄存器内容:分频器给TMR0 movwf option_reg;分频比值设为1:256 bcf status,rp0;恢复到文件寄

9、存器的体0 movlw 0a0h;开放TMR0中断使能位 movwf intcon;开放全局中断使能位 bcf intcon,t0if;清除TMR0溢出中断标志位 movlw tmr0_b;TMR0赋初值 movwf tmr0;并启动定时计数 movlw b10000000;显示驱动码送入W movwf portc_b;将驱动码送入显示缓冲区寄存器 loop cal l delay;调用延时子程序 rrf portc_b,f;带进位标志位右移缓冲区寄存器 goto loop;跳转回去;*软件延时子程序*delay;子程序名,也是子程序入口地址 movlw 0fh;将外层循环参数值经过W,movwf dly1;送入用作外循环变量的dly1 lp0 movlw offh;将内层循环参数值FFH送入W movwf dly2;送入用作内循环变量的dly2 lp1 decfsz dly2,f;内层变量dly2内容递减,若为0跳跃 goto lp1;跳转到lp1处 decfsz dly1,f;外层变量dly1内容递减,若为0跳跃 goto lp0;跳转到lp0处 return;返回主程序 end;源程序结束,图9.2 INT外部中断时序图,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号