找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机掉电后唤醒的问题

  [复制链接]
跳转到指定楼层
楼主
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);
}


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

使用道具 举报

沙发
ID:330198 发表于 2018-10-10 11:31 | 只看该作者
要么你设置成上升沿,要么你P3.2接高电平。就不会一直唤醒

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:386381 发表于 2018-10-10 11:55 来自手机 | 只看该作者
p3.2口接上拉电阻

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:213173 发表于 2018-10-10 15:03 | 只看该作者



官方示例:http://www.51hei.com/bbs/dpj-36974-1.html

评分

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

查看全部评分

回复

使用道具 举报

5#
ID:283725 发表于 2018-10-10 20:11 | 只看该作者
zhanghyg 发表于 2018-10-10 11:31
要么你设置成上升沿,要么你P3.2接高电平。就不会一直唤醒

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

评分

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

查看全部评分

回复

使用道具 举报

6#
ID:283725 发表于 2018-10-10 20:11 | 只看该作者

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

使用道具 举报

7#
ID:283725 发表于 2018-10-10 20:12 | 只看该作者

这是想着先手动测试成功了,再实现自动复位呢
回复

使用道具 举报

8#
ID:283725 发表于 2018-10-10 20:17 | 只看该作者

我有接过20K上拉电阻,无效啊
莫非接的太大了?
回头我换个小的试试
回复

使用道具 举报

9#
ID:123289 发表于 2018-10-11 03:00 | 只看该作者
当你用表棒触碰晶振时,表棒就参与到振荡中去了!!!极可能引起振荡异常,所以测量晶振的频率是有一点点小技巧的。许多情况下不允许直接接触,必须直接接触时,也不要接触IC的输入端,而要接触输出端(晶振所接的端口分输入输出)。

评分

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

查看全部评分

回复

使用道具 举报

10#
ID:123289 发表于 2018-10-11 03:01 | 只看该作者
你的问题解决的要点是:如果削除中断的条件!才能解决一直中断的问题。

评分

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

查看全部评分

回复

使用道具 举报

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;
昨天简单试了下,好像正常了,今天下班了,用电流验证下,毕竟我做休眠是为了第功耗

评分

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

查看全部评分

回复

使用道具 举报

13#
ID:403004 发表于 2018-10-11 10:52 | 只看该作者
循环后加break试试
回复

使用道具 举报

14#
ID:401564 发表于 2018-10-11 22:41 | 只看该作者
你不觉得中断唤醒之后又去设定掉电模式了吗?复位之后程序还是从主函数开始执行的,也就是000H开始的.你得设定一个位,用于检测是不是中断唤醒的.

评分

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

查看全部评分

回复

使用道具 举报

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黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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