找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5919|回复: 1
打印 上一主题 下一主题
收起左侧

STC15单片机外部中断仅上升沿触发的方法

[复制链接]
跳转到指定楼层
楼主
ID:236059 发表于 2017-9-27 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC15系列单片机的外部中断0(INT0)和外部中断1(INT1)的触发有两种方式,上升沿和下降沿均可触发方式和仅下降沿触发方式。在实际应用中,有时候需要上升沿触发。这时有两种方案可以解决。
1.将触发方式设置成仅下降沿触发。当外部电路产生一个上升沿时,通过硬件电路加一个三极管进行反向变成下降沿。
2.这种方法不需要改变硬件电路。将触发方式设置成上升沿和下降沿均可触发方式。外部中断产生一个上升沿时,进入中断服务函数,这时在中断服务函数里做进一步处理,检测当前INT0的电平状态。如果是高电平,则判断为上升沿。如果是低电平,则判断为是下降沿。
注意(很重要!): 进入中断服务函数后,一定要延时几个毫秒再去做电平检测。因为不管是上升沿还是下降沿,都不可能是在一个瞬间完成的,中间会经历一个从高(低)到低(高)的过程。
如果进入中断服务函数就立刻检测,可能当时电平还没有达到满足高或低电平的默认电压值或者处于高和低之间的临界电压状态,很可能出现误判的现象。这样做的目的是让跳变后的电平达到稳定状态再检测,说白了就是一个去抖动的过程。
下面把初始化和中断服务函数的代码贴出来:
  1. void Initial_INT0(void)
  2. {
  3.         INT0=0;
  4.         IT0=0;      // 设置成上升沿和下降沿均触发
  5.         EX0=1;      //使能INT0中断
  6.         EA=0;
  7. }

  8. void exint0() interrupt 0  //外部中断入口
  9. {
  10.         delay_ms(50);       //延时消抖
  11.         if(INT0==1)     //如果检测到INT0=1,则判断为上升沿
  12.         {
  13.                 led=0;
  14.                 delay_ms(500);
  15.                 led=1;
  16.         }                                 
  17.         else
  18.             led=1;
  19. }
复制代码
在实际做东西的过程中遇到的一个小问题,希望对你有帮助。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:254641 发表于 2018-3-20 10:27 | 只看该作者
延时50ms 太浪费单片机的时间了吧,而且外部中断速度都很快,会不会检测不到下一个中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表