如何在PIC16F877A微控制器中使用中断
来源:互联网发布者:萌面大虾 关键词: PIC16F877A PIC微控制器 外部中断 更新时间: 2024/02/06
在本教程中,我们将学习如何 在PIC微控制器中使用外部中断 ,以及为什么/在哪里需要它们。
所需材料:
- PIC16F877A 性能板
- 16x2 液晶显示屏
- 按钮
- 连接线
- 面包板
- 图片套件 3
什么是中断以及在哪里使用它们:
在介绍如何对PIC微控制器中断进行编程之前,让我们了解中断实际上是什么以及我们需要在哪里使用它们。此外,微控制器中有很多类型的中断,PIC16F877A大约有15种中断。让我们暂时不要将它们全部混淆到我们的脑海中。
所以!什么是微控制器中的中断?
众所周知,微控制器用于执行一组预定义(编程)激活,根据输入触发必要的输出。但是,当您的微控制器忙于执行一段代码时,可能会出现需要立即关注另一段代码的紧急情况。另一段需要立即注意的代码应被视为中断。
例如:让我们考虑您正在手机上玩自己喜欢的游戏,而手机内的控制器(假设)正忙于抛出您享受游戏所需的所有图形。但是,突然你的女朋友拨打了你的号码。现在,最糟糕的事情是您的手机控制器忽略了您的女朋友电话,因为您正忙于玩游戏。为了防止这种噩梦的发生,我们使用了一种称为中断的东西。
这些中断将始终处于活动状态,列出某些特定操作的发生,当它们发生时,它们执行一段代码,然后返回正常功能。这段代码称为 中断服务例程 (ISR)。 一个必须中断的实际项目是“使用PIC微控制器的数字车速表和里程表电路”
在微控制器中,有两种主要 类型的中断 。它们是外部中断和内部中断。内部中断发生在微型控制器内部,用于执行任务,例如定时器中断、ADC 中断等。这些中断由软件触发,分别完成定时器操作或ADC操作。
外部中断是可以由用户触发的中断。在这个程序中,我们将学习如何通过使用按钮触发中断来 使用外部中断 。我们将使用 LCD 显示从 0 到 1000 递增的数字,当触发中断时,我们应该从中断服务例程 **ISR **通知它,然后继续返回到递增数字。
电路图及说明:
使用PIC16F877中断的电路图如上图所示。您只需将LCD连接到PIC,就像我们在接口LCD教程中所做的那样。
现在要连接中断引脚,我们应该查看数据表,以了解PIC的哪个引脚用于外部中断。在我们的例子中,PIC16F877A 33^RD^引脚 RBO/INT 用于外部中断。您不能使用此引脚以外的任何其他引脚。此电路图的引脚连接如下表所示。
S.No: | 引脚编号 | 引脚名称 | 已连接到 |
---|---|---|---|
1 | 21 | RD2 | 液晶显示器的 RS |
2 | 22 | RD3 | 液晶显示器的E |
3 | 27 | RD4 | 液晶屏D4 |
4 | 28 | RD5 | 液晶屏D5 |
5 | 29 | 太平洋地区技术 | 液晶屏D6 |
6 | 30 | RD7 | 液晶屏D7 |
7 | 33 | RBO/INT | 按钮 |
我们在端口 B 上启用了内部上拉电阻,因此我们可以通过按钮将 RB0 引脚直接接地。因此,每当该引脚变为低电平时,就会触发中断。
可以在面包板上进行连接,如下所示。
如果您一直在学习我们的教程,您应该已经熟悉我在这里使用的这个 Perf 板。如果没有,你不需要考虑太多,只需按照电路图,你就会让事情正常。
PIC微控制器中的中断仿真:
该项目的模拟是使用Proteus进行的。
模拟项目时,您应该会在LCD显示屏上看到一系列数字递增。这发生在主回路内,每当按下按钮时,LCD都应显示它已进入ISR。您可以在代码中进行修改并尝试在此处进行测试。
代码说明:
可以在本教程末尾找到此项目的完整代码。但是,该程序被分成重要的块,并在下面解释,以便您更好地理解。
像所有程序一样,我们必须通过定义程序中使用的引脚的引脚配置来开始代码。同样在这里,我们需要定义我们使用RB0 / INT作为外部中断引脚,而不是输入或输出引脚。下面的代码行使能端口B上的内部上拉电阻,方法是使7^千^位为 0。
OPTION_REG = 0b00000000;
然后我们启用全局/外设中断,并声明我们使用RB0作为外部中断引脚。
GIE=1; //Enable Global InterruptPEIE=1; //Enable the Peripheral InterruptINTE = 1; //Enable RB0 as external Interrupt pin
一旦RB0引脚被定义为外部中断引脚,每次它变低时,外部中断标志INTF将变为1,并且void中断函数中的代码将被执行,因为将调用中断服务例程(ISR)。
void interrupt ISR_example(){if (INTF==1) //External Interrupt detected{ Lcd_Clear(); Lcd_Set_Cursor(1,1); Lcd_Print_String(" Entered ISR"); INTF = 0; // clear the interrupt flag after done with it __delay_ms(2000); Lcd_Clear(); } }
如您所见,我将中断函数命名为 ISR_example。您可以根据自己的意愿命名。在中断函数中,我们将检查 INTF 标志是否为高并执行所需的操作。完成例程后清除中断标志非常重要。只有这样,程序才会返回到 void 主函数。这种清算必须通过使用生产线的软件来完成
INTF = 0; // clear the interrupt flag after done with it
在主功能中,我们只需每 500 毫秒增加一个数字并将其显示在 LCD 屏幕上。我们没有任何特定的线路来检查RB0引脚的状态。中断将始终保持活动状态,每当按下按钮时,它都会跳出空主线并执行 ISR 中的行。
Lcd_Set_Cursor(2,1);Lcd_Print_String("Inside Main Loop");Lcd_Set_Cursor(1,1);Lcd_Print_String("Number: ");Lcd_Print_Char(ch1+’0’);Lcd_Print_Char(ch2+’0’);Lcd_Print_Char(ch3+’0’);Lcd_Print_Char(ch4+’0’); __delay_ms(500);number++;
PIC16F877A 的工作中断:
一旦您了解了 中断的工作原理 ,您就可以在硬件上尝试并摆弄它。这里给出的这个程序是一个非常基本的外部中断示例,它只是在检测到中断时改变LCD屏幕的显示。
这里还没有内容,您有什么问题吗?
电子电路资源推荐
- 开关电源设计入门与实例解析
来源:下载中心
- 电子电路大全(合订本)1039页 24.7M
来源:下载中心
- ADC与DAC
来源:大学堂
- 放大器稳定性系列教程
来源:大学堂
- 叠加原理:概念及其求解过程
来源:电路图
- 戴维宁定理:概念介绍及其求解过程
来源:电路图
推荐帖子 最新更新时间:2024-11-13 09:12
- 256 级灰度LED 点阵屏显示原理
- 本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 256 级灰度LED 点阵屏显示原理,分享 256 级灰度LED 点阵屏显示原理 本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 原来是普通的论文,要是
- xiangxiang移动便携
- 【Follow me第二季第2期】+ 基础任务【点亮LED矩阵, 使用运算放大器放大DAC信号】
- 概述 在基础任务中我将使用Arduino uno 4 wifi 来点亮板载的LED矩阵,并且使用DAC输出信号同时使用运算放大器进行信号的放大. Task 1 : 点亮板载Led matrix Step 1 : 打开Arduino 的 demo, 选择LE
- LTLyaoniDigiKey得捷技术专区
- 【DigiKey创意大赛】多功能水平仪开箱贴
- 首先感谢论坛和得捷的大力支持,本次参赛想制作一个多功能电子水平仪,实现测距,测角度,测移动距离等功能,用到以下三个主要元器件。 SEN0588 一款高精度的激光测距模块是,最大测量测距可达15m,可以满足我实现手持测距的需求 esp32-c3-lcdkit
- xianxiaoxuDigiKey得捷技术专区
- 汽车盲区检测系统解决方案
- 推荐的这个方案 可以让这个汽车盲区检测系统摆脱高端车的专利。 汽车盲区检测系统解决方案 看帖回复是好的习惯呢 顶起来。很棒的东西怎么就没人来看呢? 盲区检测主要是因为监控设备成本过高,楼主的方案是否可以减少对雷达和摄像头的依赖类? xieyubing734 发
- HolyAJ汽车电子
- GD32F105RBT6 关于FMC内部flash操作问题
- 请问大家一下,怎么在GD32F105RBT6里的内部flash单个字节写入(8位写入),库里面的fmc_word_program 和 fmc_halfword_program分别是 32位个16位的,这样把一串unsigned char数组写进去内部flash有点不方便 GD
- 千本樱大白GD32 MCU
- 改了两天,终于改完STM32的头文件了!
- ST原来的那个什么库操作方式实在是用不惯. 将头文件改为寄存器可位段访问的方式.方便多了! 反正CM3是支持位段操作的, 所以新方式比库操作更直观,效率也没降低! 改了两天,终于改完STM32的头文件了! 贴个函数出来给大家学习,看看是否更易用
- zgyzsqstm32/stm8
- 大家好,请求你的帮助!需要protel仿真原理图
- Helper2416-46——QT入门应用——控制LED
- 免费了,只要回帖就行
- 通信原理
- 96-24的大屏幕仿真
- 【新能源储能】浅谈分布式新能源发电中的储能系统能量管理分析--安科瑞张云1821732...
- 华清远见的学员请进~~~
- 分享你的体验,精彩大奖等你拿!
- 关于MSP432的ADC14温度校准参数
- 有用广州倍思得BST-URD9201做过开发的高人请进
- Altium Designer 17版使用经验分享(不定期更新)
- ccs如何添加头文件的相对路径?
- 「ADI模拟大学堂」集合贴
- GD32F407 驱动网络PHY方案介绍
- 通讯系统离不开的滤波器系列2
- 微带线的不连续性和解决方法
- 求助电子书:电气控制线路:基础·控制器件·识图·接线与调试 韩雪涛主编
- 【DigiKey创意大赛】家用快速体检机04+体检界面实现
- 直线滑台使用注意事项
- MCU设备
- 使用 STMicroelectronics 的 STPM01 的参考设计
- 电池电源管理芯片SY6982EQDC评估板
- LT3976HMSE 3.3V 降压转换器的典型应用电路
- SY89221U,SY89221 时钟缓冲器评估板
- 【航顺训练营】多功能小键盘
- ADP2127 超薄型、500 mA、6 MHz、同步、降压、直流至直流转换器的典型应用
- 使用 Richtek Technology Corporation 的 RT8152B 的参考设计
- MC78M09CDTRKG 9V可调输出稳压器的典型应用
- 辉光管时钟+天气日期显示
- STEVAL-IHM008V1, BLDC &用于 SEMITOP2 1kW 的交流电机控制电源评估板