PIC单片机中断程序的设计技巧.doc_第1页
PIC单片机中断程序的设计技巧.doc_第2页
PIC单片机中断程序的设计技巧.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

PIC单片机中断程序的设计技巧所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。2 引脚中断程序设计在主程序里先设置有关的寄存器。 设置TRISB寄存器,使RB7RB4相关的引脚处于输入状态; 如果需要弱上拉,通过OPTION_REG的第7位设置; RBIF=O; RBIE=1;GIF=1。响应状态变化后的中断服务程序。检查RBIF是否为l,为l则是引脚变化引起的中断;调用延时程序,延时2030 ms,目的是为了按键去抖;判断是引脚出现上升沿还是下降沿引起的中断;调用按键处理程序;读PORTB口的值,取消状态变化的硬件信号;清除RBIF标志。笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。下面给出笔者设计程序时的思路。当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:else if(RBIE&RBlF)=1) 如果引脚变化引起中断 if(RB4=0) RB4上的按钮接地 key=1; 按键标志位置位 RBIF=0; 清除引脚中断标志位 其中,if(RB4=0)语句相当于读取了PORTB端口数据寄存器,取消了状态变化的硬件信号。下面详细介绍怎么样进行按键去抖。首先,在定时器中断里设置一个lms的时间基准标志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:unsigned char count; if(ToIE&TOIF)=1) 定时器中断 TMRO+=0x09; 每250s中断一次 if(count=4) count=0; SYSlms=l; /系统时间标志 couot+; T0IF=0; 清除时钟中断标志位有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志SYSTime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能定义了如下一个宏:bit SYSTime;#defincTimeEnahle()SYSTime=0,if(SYSlms)SYSTime=l;SYSlms=0;可以把TimeEnable()放到主程序死循环的任何地方,每当程序执行这个宏,SYSTime就会清零,这就是标志位的自我消失如果在定时器时间基准标志位SYSlms已经置位的话,SYSTime就会置1,这样别的程序就可以利用这个时间消息了,这就是消息的自我发布。下面就是利用这个时间消息来进行按键延时去抖的,首先看一下按键扫描子程序;void seaakey() unsigned char KeyTime,KeyTask;定义任务时间参数、 任务参数 switch(KeyTask) case0:if(key) KeyTime=30; 准备延时30 ms KeyTask+; 准备好下一个任务 kcy=0; break; case I:KeyTime-; 延时30 ms if(KeyTime=0)Key+ask+; break; case2;if(RB4=o) 调按键处理程序 KeyTask=0; else KeyTask=0;退出任务 break; 在主程序的死循环中这样用: while(1) TimeEnable(); If(SYSTime=1)scankey();在此可以添加其他程序只有有时问消息的时候才执行按键扫描程序。可以看到,进入扫描程序执行第一次的时候,程序首先判断按键标志位有没有置位,置位的话(也就是有按键按下的话),任务时间参数(KeyTime)赋值为30,这是延时30ms,去抖,当然你也可以设置为其他的时间值;同时任务参数 (KeyTask)加1。1ms后,再进入扫描程序,这个时候扫描程序执行casel的语句,这样30次后(延时了30ms),任务参数(KeyTask)加1,值为2。lms后,再进入扫描程序,将执行case 2的语

温馨提示

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

评论

0/150

提交评论