找回密码
 立即注册

QQ登录

只需一步,快速开始

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

使用单片机外部中断遇到了一点问题,上电的时候无法检测外部中断低电压

[复制链接]
跳转到指定楼层
楼主
ID:1081016 发表于 2023-7-8 18:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位大佬帮忙看看

使用的外部中断1;低电平触发

想要实现的功能是;1、上电时默认进入while(1)主程序(每秒闪2次)。
2、中断程序(每秒闪5次)。
3、如果检测到外部中断为低电平“执行外部中断程序”、如果外部中断为高电平“执行while(1)主程序”。注释;外部中断源是一个按键;当按键按下是接地触发外部中断。当松开按键为高电平是回到主程序。
4、上电时如果外部中断为低电平,则直接进入中断程序。注释;如果在上电前按下按键时。

现在的问题是;第1、和第2,第3步,都是实现了。“第4步,上电时如果外部中断为低电平,则直接进入中断程序。实现不了”

本人菜鸡!谢谢大家!

单片机代码如下;
#include <REGX51.H>         //51头文件
sbit LED = P3^5;          //引脚定义
sbit Key1 = P3^3;         //引脚定义

//*********延时函数***********
void DELAY_MS(unsigned int a )
{
    unsigned int i;
    while (--a !=0)
    {
     for (i=0; i<=600; i++);
    }
}
//*********主程序************
void main(void)
{
        Key1 = 1;          // key1初始化高电平
        LED=0;                //初始化led

        EA=1;                 //开总中断
        IT1=0;                //低电平触发
        EX1=1;                //外部中断1允许
      
        while(1)      
        {
        LED=1;                        //LED亮
        DELAY_MS(80);        //延时
        LED=0;                        //LED灭
        DELAY_MS(100);        //延时
        LED=1;                        //LED亮
        DELAY_MS(80);        //延时
        LED=0;                        //LED灭
        DELAY_MS(1680);        //延时
        }
}                                       

void intx(void) interrupt 0        //外部中断0
{         
        while(1)
        {
                if(Key1==0)                        //Key1低电平检测
                DELAY_MS(10);                //延时按键消抖
                {
                        if(Key1==0)                //再次“Key1”低电平检测
                        {
                          LED=1;
                          DELAY_MS(60);
                          LED=0;
                          DELAY_MS(60);
                          LED=1;
                          DELAY_MS(40);
                          LED=0;                                                                                                  
                          DELAY_MS(40);
                          LED=1;
                          DELAY_MS(30);
                          LED=0;
                          DELAY_MS(30);
                          LED=1;
                          DELAY_MS(20);
                          LED=0;
                          DELAY_MS(520);                 
                        }      
                        else
                        {
                          DELAY_MS(10);
                          return;                //返回主程序
                        }
                }
        }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1080935 发表于 2023-7-9 08:29 | 只看该作者
确定实现了前3?初始化的是外部中断1,用的是外部中断0?
回复

使用道具 举报

板凳
ID:235200 发表于 2023-7-9 08:47 | 只看该作者
进入中断后,在中断处理程序中要关闭外部中断允许,否则会一直发生中断(因为中断程序执行时间较长,包含了延时程序)
回复

使用道具 举报

地板
ID:1081016 发表于 2023-7-9 10:31 | 只看该作者
LaoYuTou 发表于 2023-7-9 08:29
确定实现了前3?初始化的是外部中断1,用的是外部中断0?

实现了,把void intx(void) interrupt 1        //外部中断
回复

使用道具 举报

5#
ID:1081016 发表于 2023-7-9 10:32 | 只看该作者
LaoYuTou 发表于 2023-7-9 08:29
确定实现了前3?初始化的是外部中断1,用的是外部中断0?

第四步实现步了
回复

使用道具 举报

6#
ID:1081016 发表于 2023-7-9 20:11 | 只看该作者
已解决。谢谢各位大佬!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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