找回密码
 立即注册

QQ登录

只需一步,快速开始

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

新手求助STC89C52单片机 EX1外部中断问题

[复制链接]
跳转到指定楼层
楼主
ID:612392 发表于 2020-2-18 22:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,我最近在学习51单片机相关知识,在化学行业,基础知识相对比较薄弱。现在自己做了一个小程序,进入中断程序如下:目标是让单片机控制一个LED灯闪烁两次后,进行Power Down模式,使用外部中断1进行激活恢复到正常工作模式,并记录激活次数。
现在程序遇到一个问题,我通过导线连接GND与P3^3(EX1的IO口),假设导线一直连着GND不松开,那么应该一直在中断程序中的while(!P3^3)死循环,出不来,一直停在中断程序这里,我用debug调试也是这个结果;但实际用练习板调试,会出中断,且串口发出的Flag标志位一直在自增,程序一直在跑,单片机也一直在正常模式和掉电模式来回切换,百思不得其解,是不是有什么低级错误?
谢谢各位了!

void IntSystemInit()
{
        IT1=1;
        EX1=1;       
}


void EX_INT1() interrupt 2
{
        if(IsPowerDown)
        {
                IsPowerDown=0;
                PCON=0x00;
                P1=0x7E;               
                while(!P3^3)
                {                       
                        if(P3^3)
                        {
                                Flag++;
                                break;                       
                        }                       
                }               
                delay(500);
                P1=0xfe;
                delay(500);               
        }
}



void main()
{
        uint j=0;
        boardinit();
        write_byte_74hc595(0x40);   //控制锁存器
        P1=0xfe;
        IntSystemInit();
       
        TMOD=0x20; //定时器1作波特率发生器
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
       
        SM0=0;  //配置串口
        SM1=1;
        REN=1;
        ES=1;
        EA=1;
       
        while(1)
        {
                for(j=0;j<2;j++)
                {
                        NormalWorkFlashing();  //让LED闪烁两次
                }
                IsPowerDown=1;
                PCON=0x02;  //进入PD模式
               
                ES=0;            //串口发送恢复激活次数
                SBUF=Flag;
                while(!TI);
                TI=0;
                ES=1;
               
        }
}


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

使用道具 举报

沙发
ID:235200 发表于 2020-2-19 01:17 | 只看该作者
闪2次→掉电(中断在运行)→触发→上电(P33变为高电平,程序运行)→掉电(中断在运行)→触发 ………………
仿真为什么是对的,因为仿真时不象实物一样有这个上电过程
回复

使用道具 举报

板凳
ID:213173 发表于 2020-2-19 07:37 | 只看该作者
楼主错误确实够低级的。程序中的P3^3并不是表示IO口的P3.3,而是逻辑运算符“异或”。要想位操作P3.3得自定义一个名称:sbit key=P3^3;,使用while(!key)。
回复

使用道具 举报

地板
ID:168996 发表于 2020-2-19 08:15 | 只看该作者
MCS51的外部中断是下降沿沿触发或低电平触发,触发后PC压栈后立即切换到中断入口,中断程序执行过程中,不再判断中断输入引脚,有效退出后恢复中断判断机制,所以如果低电平触发模式且中断输入引脚保持低电平,会持续进入中断
回复

使用道具 举报

5#
ID:612392 发表于 2020-2-19 08:49 | 只看该作者
明白了,P3^3是不是要用sbit进行特殊寄存位进行定义?如果直接用P3^3,要编译的时候会把^作为异或运算?
回复

使用道具 举报

6#
ID:612392 发表于 2020-2-19 13:27 | 只看该作者
wulin 发表于 2020-2-19 07:37
楼主错误确实够低级的。程序中的P3^3并不是表示IO口的P3.3,而是逻辑运算符“异或”。要想位操作P3.3得自定 ...

非常感谢,确实是这个问题。
回复

使用道具 举报

7#
ID:612392 发表于 2020-2-19 13:40 | 只看该作者
banalsheep 发表于 2020-2-19 08:15
MCS51的外部中断是下降沿沿触发或低电平触发,触发后PC压栈后立即切换到中断入口,中断程序执行过程中,不 ...

我已选择下降沿触发;如果是低电平触发是会一直进中断程序。
问题已找到,很低级的错误,我把P3^3直接表示IO口了,应该要用sbit先定义P3^3,再在程序中引用。
直接使用P3^3的话,在编译的时候会被当作异或处理。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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