pic单片机中断程序设计技巧

pic单片机中断程序设计技巧

ID:24209735

大小:26.00 KB

页数:3页

时间:2018-11-13

pic单片机中断程序设计技巧_第1页
pic单片机中断程序设计技巧_第2页
pic单片机中断程序设计技巧_第3页
资源描述:

《pic单片机中断程序设计技巧》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、PIC单片机中断程序的设计技巧所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断

2、,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。2引脚中断程序设计在主程序里先设置有关的寄存器。◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态;◇如果需要弱上拉,通过OPTION_REG的第7位设置;◇RBIF=O;◇RBIE=1;◇GIF=1。响应状态变化后的中断服务程序。◇检查RBIF是否为l,为l则是引脚变化引起的中断;◇调用延时程序,延时20~30ms,目的是为了按键去抖;◇判断是引脚出现上升沿还是下降沿引起的中断;◇调用按键处

3、理程序;◇读PORTB口的值,取消状态变化的硬件信号;◇清除RBIF标志。笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。下

4、面给出笔者设计程序时的思路。当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:elseif((RBIE&RBlF)==1){//如果引脚变化引起中断if(RB4==0){//RB4上的按钮接地key=1;//按键标志位置位}RBIF=0;//清除引脚中断标志位}其中,if(RB4==0)语句相当于读取了PORTB端口数据寄存器,取消了状态变化的硬件信号。下面详细介绍怎么样进行按键去抖。首先,在定时器中断里设置一个lms的时间基准标志位“

5、SYSlms”,每到lms,“SYSlms”便置位。程序如下:unsignedcharcount;if((ToIE&TOIF)==1){//定时器中断TMRO+=0x09;//每250μs中断一次if(count==4){count=0;SYSlms=l;//系统时间标志couot++;}T0IF=0;//清除时钟中断标志位}有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志SYSTime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能.定义了如下一个宏:bitSYSTime;#defincTimeE

6、nahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;}可以把TimeEnable()放到主程序死循环的任何地方,每当程序执行这个宏,SYSTime就会清零,这就是标志位的自我消失.如果在定时器时间基准标志位SYSlms已经置位的话,SYSTime就会置1,这样别的程序就可以利用这个时间消息了,这就是消息的自我发布。下面就是利用这个时间消息来进行按键延时去抖的,首先看一下按键扫描子程序;voidseaakey(){unsignedcharKeyTime,KeyTask;//定义任务时间参数、//任务参数switch(KeyT

7、ask){case0:if(key){KeyTime=30;//准备延时30msKeyTask++;//准备好下一个任务kcy=0;}break;caseI:KeyTime--;//延时30msif(KeyTime==0)Key+ask++;break;case2;if(RB4==o){//调按键处理程序KeyTask=0;}elseKeyTask=0;//退出任务break;}}在主程序的死循环中这样用:while(1){TimeEnable();If(SYSTime==1){scankey();}//在此可以添加其他程序只有有时问消息的时候才执行按键扫描程序。

8、可以看到,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。