登录|立即注册|使用QQ帐号登录
论坛 > 24小时必答区
发帖|
看7028|回18|收藏
楼主 ID:283725 只看他
2018-10-10 09:39
SCT89C52单片机,打开用外部中断0唤醒。设置下降沿触发。
运行的结果是掉电后,P3.2口接地,会一直“唤醒--睡眠--唤醒--睡眠。。。。。”
应该只唤醒一次啊!
程序如下 ,还望大神指点

#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include "CONFIG.H"
extern void DelayMS(unsigned int);
void main()
{
    EA=1;//开总中断
    IT0=1;//下降沿触发
    EX0=1;//开外部中断0。由P3.2口引入
    while(1)
    {        
        LED1 = 0;
        FM = 1;
        DelayMS(80);
        PCON = 0X02;
        DelayMS(10);
    }
}
void exter0() interrupt 0//外部中数函数
{
        PCON = 0x00;
        LED1 = 1;
        FM = 0;
        DelayMS(20);
}


沙发 ID:330198 只看他
2018-10-10 11:31
要么你设置成上升沿,要么你P3.2接高电平。就不会一直唤醒
板凳 ID:386381 只看他
2018-10-10 11:55
p3.2口接上拉电阻
地板 ID:213173 只看他
2018-10-10 15:03
5# ID:283725 只看他
2018-10-10 20:11

引用:

zhanghyg 发表于 2018-10-10 11:31
要么你设置成上升沿,要么你P3.2接高电平。就不会一直唤醒

不知道是软件的事还是硬件的事。我又发现更诡异的事情。就是用示波器长时间观看晶振,5~10秒这样观察。会发现晶振才几十KHZ.如果短时间观察,几微秒,则正常11.0592
搞的我头都大了
邪性!!
6# ID:283725 只看他
2018-10-10 20:11

引用:

文凤轩 发表于 2018-10-10 11:55
p3.2口接上拉电阻

不知道是软件的事还是硬件的事。我又发现更诡异的事情。就是用示波器长时间观看晶振,5~10秒这样观察。会发现晶振才几十KHZ.如果短时间观察,几微秒,则正常11.0592
搞的我头都大了
邪性!!
7# ID:283725 只看他
2018-10-10 20:12

这是想着先手动测试成功了,再实现自动复位呢
8# ID:283725 只看他
2018-10-10 20:17

引用:

文凤轩 发表于 2018-10-10 11:55
p3.2口接上拉电阻

我有接过20K上拉电阻,无效啊
莫非接的太大了?
回头我换个小的试试
9# ID:123289 只看他
2018-10-11 03:00
当你用表棒触碰晶振时,表棒就参与到振荡中去了!!!极可能引起振荡异常,所以测量晶振的频率是有一点点小技巧的。许多情况下不允许直接接触,必须直接接触时,也不要接触IC的输入端,而要接触输出端(晶振所接的端口分输入输出)。
10# ID:123289 只看他
2018-10-11 03:01
你的问题解决的要点是:如果削除中断的条件!才能解决一直中断的问题。
11# ID:283725 只看他
2018-10-11 10:07

引用:

yzwzfyz 发表于 2018-10-11 03:00
当你用表棒触碰晶振时,表棒就参与到振荡中去了!!!极可能引起振荡异常,所以测量晶振的频率是有一点点小 ...

哪里是输入?哪里是输出?我是小白,晶振不就两个脚么?
12# ID:283725 只看他
2018-10-11 10:14

引用:

yzwzfyz 发表于 2018-10-11 03:01
你的问题解决的要点是:如果削除中断的条件!才能解决一直中断的问题。

中断触发条件是外部电平的下降沿。用示波器看不出变化来。我有考虑过接上拉电阻或者去藕电容,没有效果。
我昨天给技术打电话,我能感觉出他的一脸嫌弃,他让我看范例。他掉电前有这么个操作
int0=1;
昨天简单试了下,好像正常了,今天下班了,用电流验证下,毕竟我做休眠是为了第功耗
13# ID:403004 只看他
2018-10-11 10:52
循环后加break试试
14# ID:401564 只看他
2018-10-11 22:41
QQ截图20181011223438.png 你不觉得中断唤醒之后又去设定掉电模式了吗?复位之后程序还是从主函数开始执行的,也就是000H开始的.你得设定一个位,用于检测是不是中断唤醒的.
15# ID:283725 只看他
2018-10-13 19:08

引用:

Y_G_G 发表于 2018-10-11 22:41
你不觉得中断唤醒之后又去设定掉电模式了吗?复位之后程序还是从主函数开始执行的,也就是000H开始的.你得设 ...

感谢回复。我的思路就是这样的,不想从00H开始执行。因为一开始会有好多的始化操作。
16# ID:283725 只看他
2018-10-13 19:24
感谢大家的帮助。
我用3231芯片做了个电子时钟,想每秒读取一次时间。读取完成之单片机就掉电,等待下一秒3231的唤醒脉冲。这样能最大限度的降低功耗。
我的程序掉电部分已经能够正常去行了。准备转战下一个难题
我将范例程序贴出来,新手参考下,老鸟无视,主要是自我总结
INT0 = 1;                   //ready read INT0 port
while (!INT0);              //check INT0
这两个语很重要,一个是将INT0置1
下一句是检测INT0是否为1,不是1就一直检测。说明置1的重要性
当然,有的时候,不加这两句是可以正常运行的。
以下是完整的范例程序

/*------------------------------------------------------------------*/
/* --- STC MCU Limited ---------------------------------------------*/
/* --- STC89-90xx Series MCU Power-Down wakeup by INT0 Demo --------*/
/* If you want to use the program or the program referenced in the  */
/* article, please specify in which data and procedures from STC    */
/*------------------------------------------------------------------*/

#include "reg51.h"
#include "intrins.h"

//External interrupt0 service routine
void exint0() interrupt 0           //(location at 0003H)
{
}

void main()
{
    IT0 = 1;                        //set INT0 int type (1:Falling 0:Low level)
    EX0 = 1;                        //enable INT0 interrupt
    EA = 1;                         //open global interrupt switch

    while (1)
    {
        INT0 = 1;                   //ready read INT0 port
        while (!INT0);              //check INT0
        _nop_();
        _nop_();
        PCON = 0x02;                //MCU power down
        _nop_();
        _nop_();
        P1++;
    }
}


17# ID:283725 只看他
2018-10-13 19:31

引用:

yzwzfyz 发表于 2018-10-11 03:00
当你用表棒触碰晶振时,表棒就参与到振荡中去了!!!极可能引起振荡异常,所以测量晶振的频率是有一点点小 ...

你好,有时间能不能教我一下怎么测晶振呢?
18# ID:409197 只看他
2018-10-13 21:23
同问我也有这个问题
19# ID:498201 只看他
2019-4-15 12:59
感谢楼主最后的方法,很有用

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版