找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机开两个外部中断怎么有一个失效了?

[复制链接]
跳转到指定楼层
楼主
ID:119355 发表于 2019-5-2 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>
#include <intrins.h>

#define STC_Y1  97560U  // 89C/LEXX、90C/LEXX
#define STC_Y3  14050U  // 10F/Lxx、11F/Lxx 、12C/LExx、15F104E/L104E(A版)、15F204E/L204EA(A版)
#define STC_Y5  13043U  // 15F/L/Wxx(Y3内核个别型号除外)
//#define Fosc 12000000UL
#define Fosc 11059200UL
#define Core STC_Y1

sbit LED1 = P3^0;         //tx
sbit LED2 = P3^1;         //rx
sbit PIN_INT0 = P3^2;
sbit PIN_INT1 = P3^3;
unsigned char Is_Power_Down = 0;

/**
*  功能:延时t毫秒
*  入参:1~65535
*/
void delay_ms(unsigned int t)
{
    unsigned int i;
    do{
        i = Fosc / Core;
        while(--i);
    }while(--t);
}

void INT0_interrupt()  interrupt 0
{
        if(Is_Power_Down==1 && INT0==1)
        {
                 Is_Power_Down=0;
                EA=0;
                LED1 = 0;
                while(PIN_INT0==1); //按键A是否一直按着,
                delay_ms(100);
                LED1 = 1;
        }         
}
void INT1_interrupt()  interrupt 2
{
        if(Is_Power_Down==1 && INT1==1)
        {
                 Is_Power_Down=0;
                EA=0;
                LED2 = 0;
                while(PIN_INT1==1); //按键C是否一直按着,
                delay_ms(100);
                LED2 = 1;
        }         
}

void main()
{
        LED1=1;
        LED2=1;

        IT0=0;
        EX0=1;

        IT1=0;
        EX1=1;

        while(1)
        {        
                        EA=1;
                        Is_Power_Down=1;
                        PCON=0x2;
                        _nop_();
                        _nop_();
                        _nop_();
                                
        }
}

用的pt2272模块,芯片stc89c52rc,情况是两个中断只有中断0有效中断1没反应, 屏蔽EX0=1;的话中断1就能用了,这是怎么回事??接线没问题

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

使用道具 举报

沙发
ID:119355 发表于 2019-5-2 22:37 | 只看该作者
自己搞定了,改IT0=1  IT1=1就行了。之前的中断方式导致INT0不停的中断而优先级又比INT1高,导致INT1失效了!!不过搞不懂按下按键时候是上升沿啊,为什么下降沿中断方式会触发?
回复

使用道具 举报

板凳
ID:526392 发表于 2019-5-3 14:41 | 只看该作者
你搞反了,不按键是高电平,按下是低电平,所以按下按键的过程是高电平变为低电平,即下降沿。你可以去看一下独立按键的电路原理图
回复

使用道具 举报

地板
ID:119355 发表于 2019-5-4 21:31 | 只看该作者
51go 发表于 2019-5-3 14:41
你搞反了,不按键是高电平,按下是低电平,所以按下按键的过程是高电平变为低电平,即下降沿。你可以去看一 ...

我不是用的独立按键,用的PT2272四路无线模块,遥控器不按的时候模块输出低电平的,遥控器按下是高电平
回复

使用道具 举报

5#
ID:472242 发表于 2019-5-5 01:02 | 只看该作者
建议你去看看这个:中断嵌套编程的应用(Proteus仿真+程序)
http://www.51hei.com/bbs/dpj-145685-1.html
回复

使用道具 举报

6#
ID:624769 发表于 2021-8-26 04:29 | 只看该作者
IT0 的设定,不同单片机作用不同,相同的是 IT0 = 1 , 都是下降沿触发, IT0 = 0,STC15系列,是上升沿下降沿都可以触发, 而 STC11系列,好像是仅上升沿触发,而 89C51 则是低电平触发,根据你的描述,我觉得你用的单片机应该是 89C51, 所以当 IT0 = 0, 那么在低电平状态,就会反复触发,而纵观你的中断程序,你会判断是否处于高电平,直到低电平才会退出中断,那么,其实反过来理解,当产生了高电平,又变成了低电平这个时候触发中断,是不是对系统而言更经济?那么针对你的需求,其实下降沿中断才是更合理的,毕竟你这个中断,就算最慢的89c51跑一下也就几微秒,等电平重新下降了在中断运行完全没有影响。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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