PIC 单片机引脚中断程序的设计技巧

发布者:数字梦想最新更新时间:2020-02-18 来源: eefocus关键字:PIC  单片机引脚  中断程序 手机看文章 扫描二维码
随时随地手机看文章

简介:主要介绍PIC 单片机引脚中断程序的设计技巧, 这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。


1 、简 述

所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。


在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器 PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。


2 、引脚中断程序设计

在主程序里先设置有关的寄存器。

◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态;

◇如果需要弱上拉,通过OPTION_REG的第7位设置;

◇RBIF=O;

◇RBIE=1;

◇GIF=1。


响应状态变化后的中断服务程序。

◇检查RBIF是否为l,为l则是引脚变化引起的中断;

◇调用延时程序,延时20~30 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; //每250μs中断一次

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的语句,首先在这里再次判断是不是按键还在按下,如果是就调按键的处理程序,如果不是。就退出按键扫描程序。在这里,还可以加入按键是否抬起的判断程序。


这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。

关键字:PIC  单片机引脚  中断程序 引用地址:PIC 单片机引脚中断程序的设计技巧

上一篇:PIC8位单片机芯片引脚功能
下一篇:PIC16C5X 单片机睡眠状态的退出方法

推荐阅读最新更新时间:2024-11-06 11:29

基于PIC单片机的摩托车防盗器设计
R3EQU0X03PORT5EQU0X05PORT6EQU0X06R3EQU0X03KEY_STATUSEQU0X10;低半字节为按键标志,高半字节为控制标志SIGNAL_LOWEQU0X11;信号电平低计数器SIGNAL_HIGHEQU0X12;信号电平高计数器DATA_RECORDEREQU0X1 R3EQU0X03 PORT5EQU0X05 PORT6EQU0X06 R3EQU0X03 KEY_STATUSEQU0X10;低半字节为按键标志,高半字节为控制标志 SIGNAL_LOWEQU0X11;信号电平低计数器 SIGNAL_HIGHEQU0X12;信号电平高计数器 DATA_RECORDEREQU0X13;接收码数
[单片机]
基于<font color='red'>PIC</font><font color='red'>单片机</font>的摩托车防盗器设计
基于PIC单片机通信适配卡设计
  CAN总线-控制器局部网(CAN)国际标准(ISO11898)。CAN总线与一般的通信总线相比,它的数据通信具有突出的可靠性、实时性和灵活性。   其特点可概括如下:CAN为多主方式工作。在报文标识符上,各节点分成不同的优先级。采用非破坏总线仲裁技术。只需通过对报文的标识符滤波即可实现点对点、一点对多点方式传送接收数据。直接通信距离最远可达零10km(速率5kbps以下);通信速率最高可达到1Mbps(此时通讯距离最长为40m)。CAN上的节点数主要取决于总线驱动电路,目前可达110个。报文采用短帧结构,传输时间短,受到干扰的概率低。每帧信息都有CRC校验及其他检错措施,具有极好的检错效果。通信介质可为双绞线、同轴电缆或光纤
[单片机]
基于<font color='red'>PIC</font><font color='red'>单片机</font>通信适配卡设计
PIC单片机循环程序应用实例
在这里介绍一种定时程序,说明循环程序在PIC单片机上的应用。笔者仍以PIC16F84单片机为例建立其定时源程序清单。该定时器源程序只需改变一条指令的常数设置,即可使定时时间从分钟级到38小时的连续变化(4MHz晶振条件)。PIC16F84单片机的硬件电路,请见本报第32期实验编程器101实验板电路。在该实验板电路上,若读者改变晶振的频率(2MHz、1MHz、500kHz)等,很易直观看出定时时间成比例相应地增加,这对了解PIC单片机的性能十分直观有趣。若在该源程序上再多设置一次循环,可使定时时间长达1月以上。   该PIC16F84单片机定时源程序可直接在MPLAB集成开发环境软件下进行汇编,其汇编后生成的HEX文件可在实验编程
[单片机]
PIC单片机三个定时器中断同时定时
16F877A有三个定时器,中断方式都调试出来了,想把它们整合到一块同时工作,可搞了半天,就是不干。最后整明白了,PIC16系列单片机的中断入口中有一个。PIC的功能是很强大,外围模块也多,速度也较快,但PIC的这个中断方案不好,应该改进。以下是三个定时中断同时工作的调试代码。 #include pic.h #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void init(); uint Timer0Num,Timer1Num,Timer2Num;// void timer0(); void timer1(); void timer
[单片机]
单片机引脚信号检测分析
检测对象 单片机AT89C2051,使用6MHz石英晶体,控制三个发光二极管各自渐变亮,渐熄灭。 三个LED共组成七种亮灭情况(没有全部熄灭的状态),分别对应二进制数的一到七。依序变化一个周期约49秒,每种变化历时七秒。 所用的示波器,标称电压是实际电压的十分之一。 检测过程 1 用示波器看5脚信号,是标准的正弦波形,周期约160ns,即六兆的频率,振幅是2V(即幅度4V),都位于横轴的上方,即5脚电势总高于电源负极。其4脚信号与5脚相似,但略有些变形,可见是带有杂波。 2.I/O口输出的是矩形波,矩形波周期8ms(即48000个时钟脉冲),幅值3V。使用最快的扫描速度,可以看到矩形波上升沿,高5V,宽400ns。 3
[单片机]
51的中断程序用C怎么写
用c语言的话中断程序是单独写在中断服务函数中的,51单片机的中断服务函数的定义: void functionname(void) interrupt num //functionname是自己定义的函数名字,num对应实际的中断向量号 进入中断要执行中断子程序,不同的中断源要进入不同的中断子程序。对于51的C编程,可以用中断标号,如‘interrupt 0 ’来使中断进入不同的中断。 中断标号与它们的中断优先级一致,即 外部中断0 interrupt 0 定时器中断0 interrupt 1 外部中断1 interrupt 2 定时器中断1 interrupt 3 串行中断 interrupt 4
[单片机]
PIC单片机控制DDS芯片AD9852实现雷达跳频系统
摘要:DDS具有分辨率高、转换速度快的优点。在一些需要高频分辨率、设置转换度的应用场合,尤其是雷达及通信系统中的跳频信号源中,DDS技术具有其它频率合成方法无法比拟的优势,是一种很有发展前途的技术。介绍了DDS的基本原理及DDS芯片功能特点以及DDS芯片AD9852的结构、特点,并采用PIC单片机控制AD9852,实现了跳频频率合成器。 关键词:DDS 频率分辨率 转换速度 频率合成 PIC单片机 在研制雷达系统时,常常需要应用频率合成技术来实现跳频信号源。频率合成是指从一个高稳定的参考频率,经过各种技术处理,生成一系列稳定的频率输出。现在应用最广的是锁相环(PLL)频率合成技术,它是通过变化PLL中的分频比N来实现输出频率的
[单片机]
PIC单片机的可编程电源的设计
        引言   随着各种电器和仪表设备的日渐丰富,对电源应用的灵活性提出了更高的要求。设计一款使用灵活、方便且价格相对便宜的通用电源,正越来越成为市场所需。现代单片机正朝着处理速度越来越快,外设资源越来越丰富,价格越来越便宜的方向发展,将单片机融入电源的设计中可以极大地提升电源的性能和灵活性。本文介绍了一种单片机加PWM芯片的开关电源设计方法,既可以保留PWM芯片带来的稳定工作性能,又可以利用单片机的控制能力提供各种人机交互和通信接口。笔者设计的电源作为通用电源使用,可以提供灵活可编程的电压电流输出,另外还可以设置成铅酸电池充电器的模式,具有广阔的应用前景。   1 系统功能   通过对电源的编程,可以方便地实现图
[电源管理]
<font color='red'>PIC</font><font color='red'>单片机</font>的可编程电源的设计
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved