一点点学pic单片机,如何设计pic单片机中断程序
pic单片机使用很多,但pic单片机的学习存在一定难度。为帮助大家稳步提高对pic单片机的认识,本文将对pic单片机引脚中断程序设计技巧加以介绍。如果你正在学习pic单片机,或对本文即将讲解的内容存在兴趣,都不妨继续往下阅读哦。
所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。
在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。
引脚中断程序设计
在主程序里先设置有关的寄存器。
◇设置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单片机中断程序相关推荐
- 单片机课程设计-基于单片机直流电机控制器设计
本科单片机课程设计,附Proteus仿真效果图 要求: 思路很简单,使用定时器0控制单片机IO口输出不同占空比的触发脉冲即可控制转速 代码参考: #include <reg52.h>#de ...
- 太原工业学院单片机课程设计_单片机智能小车毕业设计论文
一.单片机智能小车毕业设计论文 已录入:205499篇 热门排序 推荐排序 此频道包含与小车和单片机和毕业设计相关的例文,免费为你学单片机毕业设计论文提供有关参考文献. [小车语音](沈阳师范大学物理 ...
- python基于svm项目+课程设计报告_单片机课程设计教学模式研究
单片机课程设计教学模式研究 摘要:在分析单片机课程设计现状的基础上,提出将先进的CDIO工程教育理念应用到单片机课程设计教学中,对课程设计的时间安排.选题.组织实施.考核等方面进行改革与创新,构建新的 ...
- ioca0中断 pic单片机_单片机入门知识-PIC为例程序.ppt
PIC单片机原理及应用 内容提要 单片机概述 PIC单片机的特色 PIC单片机的程序设计 单片机概述 单片机正名为:微控制器 --MCU ,MicroController Unit 单片机概述 何为单 ...
- PIC单片机之中断程序
什么是中断程序呢? 形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章.烤地瓜这件事就好比中断程序,他中断了你看 ...
- 单片机学不会怎么办?单片机从哪里开始学?
大家好,我是无际单片机编程的徐导. 说起单片机学不会怎么办?就想起我自己一些学习的辛酸史. 我做单片机开发10余年了,单片机硬软件开发自然是很熟练了. 但做其他的工作可是一窍不通,在上家公司工作的时候 ...
- 学单片机之前要学什么?C语言和单片机有什么关系?
学习单片机之前要学什么?提起这个就想起我当年开始学习单片机的血泪史了. 08年我加入学校的电子实验室,为08年的全国电子大赛做准备. 08年的电子大赛分类3类,硬件设计类.单片机软件类.产品的调试动手 ...
- 单片机怎么学?新手怎么快速学会单片机?
"初听不懂曲中意,听懂已是曲中人". 不知不觉跟单片机.Keil.C语言.AD.烙铁.风枪.示波器.元器件-打了10年的交道. 这10年,经历了很多的产品的磨练,也熬过了很多孤独的 ...
- Android课程设计倒计时app,单片机课程设计-可调倒计时器.doc
PAGE PAGE 2 课 程 设 计 设计名称 单片机可调倒计时器 全套设计加扣?3012250582 学年学期 2013 -2014学年第 二 学期 课程名称 单片机原理及应用 专业年级 电气11 ...
最新文章
- 分享:手把手教你如何免费且光荣地使用正版IntelliJ IDEA
- 那些年让你迷惑的阻塞、非阻塞、异步、同步
- (原创)JS兼容性笔记(更新)
- Openstack平台搭建(先电版)
- 深度学习网络backbone?head、neck、bottleneck、GAP、Embedding、pretext task、downstream task、temperature parameter
- session 原理
- 大数据分析实战-信用卡欺诈检测
- 【java】我工作三年了,该懂并发了!
- 光模块自动测试系统软件,可插拔收发光模块自动化检测系统
- Python下的中文分词实现
- c语言中内存分配方式
- 制作属于你的终端词典
- cmake Could NOT find Boost (missing: xxx 的问题 已解决
- groovy+grails+gradle开发
- 超强悍抓包工具和万能视频下载工具
- 台式计算机驱动程序未被安装,计算机图形驱动程序安装失败的原因及其解决方法...
- 三姬分金/四姬分金/五姬分金(海盗分金币)等经典博弈论问题
- 从零开始学Python爬虫系列:Matplotlib FuncAnimation这1个功能,加1个更新函数,画出最简单的动图,让你爬取的数据动起来。(附:图片上加弹幕功能)
- 数据库中 PK FK UK CK DF 的意思
- html画布里增添颜色,在HTML5画布中更改笔触颜色
热门文章
- sqlserver怎么连接mysql,sqlserver连接mysql
- 面试题:一个TCP连接可以发多少个HTTP请求?
- 挠痒要挠到痒处——了解你的孩子
- 猴子吃桃问题 php,趣味算法:猴子吃桃问题
- I/O流之进步认识、InputStream以及FileInputStream
- Linux下载工具photon,Photon v0.3.1 免费开源下载软件,替代迅雷的下载利器
- Windows电脑挂载阿里云盘为本地磁盘(网络磁盘)
- 编译原理总结(《编译与反编译技术》)
- 1-【先导片】给年轻人的跨学科通识课-360P 流畅-AVC
- 初学nodejs——实现一个简易论坛(完成简单的登录、注册、发帖、评论功能)