你不知道的PIC单片机中断程序的设计技巧_第1页
全文预览已结束

下载本文档

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

文档简介

1、你不知道的pic单片机中断程序的设计技巧全部的中档系列,portb端口最高的4个引脚(rb7rb4)在设为输入模式时,当输入电平由高到低或由低到高发生变幻时,可以让单片机产生中断。这就是通常所说的引脚状态变幻中断。在设计引脚中断程序时,有三个需要特殊注重的地方。一是,在清除p0rtb中断标记位rbif之前,必需支配一条必不行少的,以portb端口数据寄存器portb为源寄存器的读操作命令。放置这一命令的目的有时并不只是为了读取实用的数据,而是为了取消状态变幻的硬件信号,以便顺当清除rbif标记位,为下一次中断做好预备。二是,因为端口portb是引脚变幻中断,即无论引脚浮现升高沿还是下降沿都会产

2、生中断哀求,所以必需处理好不需要的虚假中断。三是,普通都利用pic单片机的引脚功能来检测按键,所以必需处理好按键消抖的问題。2 引脚中断程序设计在主程序里先设置有关的寄存器。设置trisb寄存器,使rb7rb4相关的引脚处于输入状态;假如需要弱上拉,通过option_reg的第7位设置;rbif=o;rbie=1;gif=1。响应状态变幻后的中断服务程序。检查rbif是否为l,为l则是引脚变幻引起的中断;调用延时程序,延时2030 ms,目的是为了按键去抖;推断是引脚浮现升高沿还是下降沿引起的中断;调用按键处理程序;读portb口的值,取消状态变幻的硬件信号;清除rbif标记。笔者认为上面程序

3、设计最大的问题是在中断程序里调用延时程序。大家知道,中档pic单片机惟独8层深度的硬件堆栈,在中断里调用于程序浮现极易堆栈溢出的状况。另外,pic单片机中断程序人口惟独一个,在响应中断的哀求时,pic单片机就会自动把全局中断的使能位(intcon的第7位gif)清除,这样其他中断就临时不能被响应(此时,假如别的中断发出的中断哀求,标记位将向来保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必需尽量短,避开调用子程序,更不要在中断里举行复杂的运算。下面给出笔者设计程序时的思路。当引脚状态变幻引起中断时,在中断子程序里首先推断引起中断的缘由是不是我们需要的变幻引起的中断

4、。假如是,不要在这里延时,而是设置一个标记位,接着清除中断标记,退出中断。中断程序如下: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+

5、=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就会清零,这就是标记位

6、的自我消逝假如在定时器时光基准标记位syslms已经置位的话,systime就会置1,这样别的程序就可以利用这个时光消息了,这就是消息的自我发布。下面就是利用这个时光消息来举行按键延时去抖的,首先看一下按键扫描子程序;void seaakey()unsigned char keytime,keytask;定义任务时光参数、任务参数switch(keytask)case0:if(key)keytime=30; 预备延时30 mskeytask+; 预备好下一个任务kcy=0;break;case i:keytime-; 延时30 msif(keytime=0)key+ask+;break;cas

7、e2;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

提交评论