0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在PIC16F877A微控制器中使用中断

科技观察员 来源:circuitdigest 作者:阿斯文斯·拉吉 2023-01-25 15:32 次阅读

在本教程中,我们将学习如何 PIC微控制器中使用外部中断 ,以及为什么/在哪里需要它们。

所需材料:

  1. PIC16F877A 性能板
  2. 16x2 液晶显示屏
  3. 按钮
  4. 连接线
  5. 面包板
  6. 图片套件 3

什么是中断以及在哪里使用它们:

在介绍如何对PIC微控制器中断进行编程之前,让我们了解中断实际上是什么以及我们需要在哪里使用它们。此外,微控制器中有很多类型的中断,PIC16F877A大约有15种中断。让我们暂时不要将它们全部混淆到我们的脑海中。

所以!什么是微控制器中的中断?

众所周知,微控制器用于执行一组预定义(编程)激活,根据输入触发必要的输出。但是,当您的微控制器忙于执行一段代码时,可能会出现需要立即关注另一段代码的紧急情况。另一段需要立即注意的代码应被视为中断。

例如:让我们考虑您正在手机上玩自己喜欢的游戏,而手机内的控制器(假设)正忙于抛出您享受游戏所需的所有图形。但是,突然你的女朋友拨打了你的号码。现在,最糟糕的事情是您的手机控制器忽略了您的女朋友电话,因为您正忙于玩游戏。为了防止这种噩梦的发生,我们使用了一种称为中断的东西。

这些中断将始终处于活动状态,列出某些特定操作的发生,当它们发生时,它们执行一段代码,然后返回正常功能。这段代码称为 中断服务例程 (ISR)。 一个必须中断的实际项目是“使用PIC微控制器的数字车速表和里程表电路

在微控制器中,有两种主要 类型的中断 。它们是外部中断和内部中断。内部中断发生在微型控制器内部,用于执行任务,例如定时器中断、ADC 中断等。这些中断由软件触发,分别完成定时器操作或ADC操作。

外部中断是可以由用户触发的中断。在这个程序中,我们将学习如何通过使用按钮触发中断来 使用外部中断 。我们将使用 LCD 显示从 0 到 1000 递增的数字,当触发中断时,我们应该从中断服务例程 **ISR **通知它,然后继续返回到递增数字。

电路图及说明:

1.png

使用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 引脚直接接地。因此,每当该引脚变为低电平时,就会触发中断。

可以在面包板上进行连接,如下所示。

PIC 微控制器 PIC16F877A 中断试验板连接

如果您一直在学习我们的教程,您应该已经熟悉我在这里使用的这个 Perf 板。如果没有,你不需要考虑太多,只需按照电路图,你就会让事情正常。

PIC微控制器中的中断仿真

该项目的模拟是使用Proteus进行的。

1.png

模拟项目时,您应该会在LCD显示屏上看到一系列数字递增。这发生在主回路内,每当按下按钮时,LCD都应显示它已进入ISR。您可以在代码中进行修改并尝试在此处进行测试。

代码说明:

可以在本教程末尾找到此项目的完整代码。但是,该程序被分成重要的块,并在下面解释,以便您更好地理解。

像所有程序一样,我们必须通过定义程序中使用的引脚的引脚配置来开始代码。同样在这里,我们需要定义我们使用RB0 / INT作为外部中断引脚,而不是输入或输出引脚。下面的代码行使能端口B上的内部上拉电阻,方法是使7^千^位为 0。

OPTION_REG = 0b00000000;

选项注册

然后我们启用全局/外设中断,并声明我们使用RB0作为外部中断引脚。

GIE=1;          //Enable Global Interrupt

    PEIE=1;         //Enable the Peripheral Interrupt

    INTE = 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屏幕的显示。

PIC16F877A 中断的工作

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PIC16F877A
    +关注

    关注

    2

    文章

    43

    浏览量

    21687
  • PIC微控制器
    +关注

    关注

    0

    文章

    17

    浏览量

    7354
  • 外部中断
    +关注

    关注

    1

    文章

    131

    浏览量

    15591
收藏 人收藏

    评论

    相关推荐

    如何使用PIC微控制器旋转步进电机

    在本教程中,我们将步进电机与PIC微控制器PIC16F877A连接。
    发表于 11-15 17:25 1106次阅读
    如何使用<b class='flag-5'>PIC</b><b class='flag-5'>微控制器</b>旋转步进电机

    谁有pic16f877a中文资料?

    谁有pic16f877a中文资料? 
    发表于 07-15 13:22

    PIC16F877A

    菜鸟想问下各位,我想用PIC16F877A做个流水灯,所有端口输出高电平1S,然后输出低电平1s 。 单片机放在学习板上测试的时候是正常的,用prpteus仿真也正常,可是放到电路板上就不正常了,低电平时间很短,Led只是闪了一下。  哪位高手指点一下是什么原因,还是要怎样测试找出问题?
    发表于 07-28 14:32

    PIC16F877A在proteus中读写AT24C512

    此时把I2C DEBUGGER的SCL线连接到PIC16F877A和AT24C512的SCL线上,这样PIC16F877A可以正常的写AT24C512。当PIC16F877A发送启动信号且正常启动
    发表于 12-30 16:09

    PIC16F877A使用宏定义读写FlashROM

    :由于程序存储是14位,因此读出的结果必须是整型,而不能为字符型读写PIC16F877A内部的FlashROM时,可以使用头文件中的宏定义 unsigned int FLASH_READ
    发表于 12-31 14:01

    PIC16F877A中断优先级问题

    现在我需要通过串口来接收指令控制PIC16F877A的捕获脉冲行为,可以做到的是:接收到开捕获指令后,能正常开始捕获脉冲,但是再发送关闭指令却不能让它停下来,通过KIT3发现,在捕获的时候,串口不能
    发表于 06-06 21:18

    PIC16F877A复位问题

    嗨,我还是新手,但是我有一个使用PIC16F877a的倒计时计划,而不是运行一个4位数的7段显示,并有5个按钮来选择倒计时的时间。在倒计时结束时,它发出3次哔哔声。它运行得很完美,但是会产生随机
    发表于 04-01 09:39

    pic16f877A的C语言电机控制,基于PIC16F877A单片机软件环分的步进电机控制系统.pdf 精选资料分享

    基于PIC16F877A单片机软件环分的步进电机控制系统产品与应用基PICl6F877A单片机软件于环 分的步进电机控制系统田丰果 贺莹武淑娟(贵州大学机械工程与自动化学院,贵阳 55
    发表于 09-01 08:39

    PIC16F877A单片机相关资料下载

    PIC16F877A单片机(配置字)1 MPLAB X V5.0,编译为XC8(V2.0)2MPLAB V5.0,编译为PICC1 MPLAB X V5.0,编译为XC8(V2.
    发表于 11-24 08:22

    PIC16F877A看门狗定时实验的相关资料推荐

    //*******************PIC16F877A 看门狗定时实验*******************// //PORTA,PORTB,PORTC,PORTD,PORTE复位时为输入
    发表于 11-25 07:52

    pic16f877a中文资料pdf

    pic16f877a中文资料
    发表于 07-15 13:20 4542次下载
    <b class='flag-5'>pic16f877a</b>中文资料pdf

    基于PIC16F877A的太阳能与市电互补照明系统控制器的设

    基于PIC16F877A的太阳能与市电互补照明系统控制器的设计 介绍了一款以单片机PIC16F877A控制核心的太阳能与市电互补照明系统控制器
    发表于 04-10 22:06 1274次阅读
    基于<b class='flag-5'>PIC16F877A</b>的太阳能与市电互补照明系统<b class='flag-5'>控制器</b>的设

    PIC16F877A开发板原理图

    PIC16F877A开发板原理图,有需要的可以瞧一瞧!
    发表于 08-22 15:16 86次下载

    何在PIC16F877A微控制器中使用EEPROM保存数据

    在本教程中,我们将了解使用 **PIC16F877A 微控制器中的 EEPROM** 保存数据是多么容易。在大多数实时项目中,我们可能必须保存一些数据,即使关闭电源也不应删除这些数据。这听起来像是
    的头像 发表于 01-25 15:39 1606次阅读
    如<b class='flag-5'>何在</b><b class='flag-5'>PIC16F877A</b><b class='flag-5'>微控制器</b><b class='flag-5'>中使</b>用EEPROM保存数据

    PIC16F877A开发板原理图

    PIC16F877A开发板原理图免费下载。
    发表于 03-21 15:47 8次下载