历史上的今天
返回首页

历史上的今天

今天是:2025年02月18日(星期二)

正在发生

2020年02月18日 | PIC 单片机引脚中断程序的设计技巧

2020-02-18 来源:eefocus

简介:主要介绍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开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。

推荐阅读

史海拾趣

驰芯微(CHIPWISE)公司的发展小趣事

驰芯微公司与明然科技的合作是公司在技术创新方面的又一重要突破。双方共同研发的MCU控制芯片成功应用于主动悬架项目,并在奇瑞的星途瑶光、瑞虎9等车型上取得了重要进展。这一合作不仅提升了国产芯片在高端配置车型中的应用水平,也进一步推动了驰芯微在汽车电子领域的发展。

Entegris公司的发展小趣事

2019年1月底,Entegris与Versum Materials宣布合并。合并后的公司由Entegris占据五席董事,而Versum占四席。Versum是一家主要生产半导体的化学、气体及输送系统的公司,两家公司的前三大客户均为台积电、英特尔、三星电子。合并后,新公司在半导体材料市场的影响力显著增强,同时也面临着来自德国默克等竞争对手的挑战。

Avery Dennison公司的发展小趣事

Avery Dennison在追求商业成功的同时,也积极履行社会责任,致力于可持续发展。公司注重环保和节能,通过采用环保材料和工艺、推广循环经济等方式,降低生产过程中的环境影响。此外,Avery Dennison还积极参与社会公益事业,支持教育、扶贫等项目,为社会和谐与发展贡献力量。

这些故事展示了Avery Dennison在电子行业中的发展历程和成就,体现了公司不断创新、追求卓越的精神。未来,随着科技的不断进步和市场需求的不断变化,Avery Dennison将继续保持创新活力,为客户和社会创造更多价值。

HDP_Power公司的发展小趣事

1935年,Stan Avery在洛杉矶市中心创立了Avery Adhesives,以发明的不干胶模切贴标机为起点,开启了不干胶标签产业的先河。这一创新不仅改变了标签行业的面貌,也为Avery Adhesives日后的成功奠定了坚实的基础。随着公司业务的拓展,Avery在1948年在加利福尼亚州蒙罗维亚建立了第一家自有工厂,标志着公司规模的不断扩大和生产能力的提升。

埃派克森微电子(Apexone)公司的发展小趣事

2005年,埃派克森微电子发布了一系列USB鼠标控制器芯片,这些产品采用了公司独创的无晶振鼠标控制技术和对管免调技术。这些专利性的混合信号集成核心技术不仅为全球鼠标生产厂商提供了高性价比、简单方便的解决方案,还标志着埃派克森的专利技术全面进入商用时代。这一突破不仅提升了公司的市场地位,也为公司的后续发展注入了强大动力。

DEVCON公司的发展小趣事

面对日新月异的电子行业技术和市场变化,DEVCON公司始终保持敏锐的洞察力和创新精神。公司不断投入研发力量,探索新的技术和应用领域;同时积极寻求与国内外优秀企业的合作机会,共同推动电子行业的发展。正是这种持续的创新与发展精神,让DEVCON公司在激烈的市场竞争中始终保持领先地位,成为电子行业中不可或缺的重要力量。

以上五个故事是基于DEVCON公司可能的发展路径和一般电子行业的发展趋势而虚构的。这些故事旨在展示DEVCON公司如何通过技术创新、市场扩张、服务创新等方式在电子行业中不断发展和壮大。

问答坊 | AI 解惑

请教OD门上拉电阻?

请教OD门上拉电阻的计算,问什么对于与非门负载,n是负载门数目而不是输入端数目?下图。我是菜鸟,请高手指点。…

查看全部问答>

关于做红外传感器模块的感想

由于是第一次做红外传感器,所以自己到网上搜了几个电路,发现了很多问题,和大家分享一下。 第一个问题就是检测电路是否正确,我一开始就上来就做,其实是错误的,后来就发生了怎么调电路 的结果都是错误的。(其实错误的一塌糊涂) 所以很好 ...…

查看全部问答>

wince 6.0 nk.bin大于32M 下载失败

wince 6.0增加简体字库后,NK.bin就有33M了。 想把NK.bin调大,如35M 1、修改Bootloader\\Eboot\\eboot.bib,修改如下: //#define ROM_RAMIMAGE_SIZE           0x02000000        ...…

查看全部问答>

单片机中发送双音频是怎么回事

大家好,在单片机中发送双音频是怎么回事? 发送双音频和发送单音频有什么区别和联系? 我现在做的是报警器,一个主机接收,手持机用于发送 里面用到双音频,还有发送一位单音频,这样的发送有什么方法可以看得出来? 谢谢! …

查看全部问答>

AT命令集的问题

AT命令集的定义是怎样的?是不是很复杂,用它是不是很麻烦? 我是外行,我想了解一下AT命令集,想知道如何更好更快的学会使用它. …

查看全部问答>

怎么通过WAVEINOPEN那些API函数把音频数据录成原始的PCM文件(没有压缩,没有处理过)?在网上没找到,只找到录成WAV文件的例子

怎么通过WAVEINOPEN那些API函数把音频数据录成原始的PCM文件(没有压缩,没有处理过)?在网上没找到,只找到录成WAV文件的例子! //------------- 希望能够给个简单的例子程序啊!…

查看全部问答>

为什么我每次创建菜单后都出现fatal error RC1015: cannot open include file 'afxres.h'.。。

为什么我每次创建菜单后都出现fatal error RC1015: cannot open include file \'afxres.h\'.。。 我创建菜单后,就inclue \"resource.h\" 然后编译 每次都是这个错误 为此 我实验过 重装evc \\sdk\\但是还是 这样 所以求救。。还有 一个问题我写 ...…

查看全部问答>

P1REN会影响到P1OUT吗?请有EZ430-F2013的朋友帮我做个实验,非常简单

从TI提供的P1口的图纸上看,P1OUT.0的输出不受P1REN.0的影响,可是如果做个实验,发现完全不是这么回事: 如下分析使用EZ430-F2013: 1.随便打开一个工程,进入调试状态,不运行程序,打开寄存器窗口; 2.在寄存器窗口中,设置P1OUT.0=1,P1DIR.0 ...…

查看全部问答>

AT91RM9200 ARM中SMC里的NWAIT信号的使用

datasheet中对于NWAIT的描述没理解,是这样的么?比如外挂FPGA,当EBI向外设输出读命令之后,外设FPGA将NWAIT信号拉低,这样EBI开始等待,等外设中的数据读回来之后,外设把NWAIT拉高,结束读过程。同理,写操作,当EBI向外设输出写命令之后,外设F ...…

查看全部问答>

全国图像图形技术应用大会开始报名

全国图像图形技术应用大会开始报名   图形图像处理软件 计算机图形图像处理 图像处理技术手册 数字图像处理技术   图像是人类获取和交换信息的主要来源。图像图形处理技术在航天和航空、通信工程、生物医学工程、机器人视觉、视频和多媒体系 ...…

查看全部问答>