找回密码
 立即注册

QQ登录

只需一步,快速开始

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

用51单片机做的门铃,增加掉电模式后门铃只能响一次后就不响了,请问各位是程序哪错了

[复制链接]
跳转到指定楼层
楼主
#include<STC89C5xRC.H>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P1^0;
uchar ding,dong,flag,stop,k1;
uint n;

void delay(uint i)
{
        while(i--);
}

void time0init()          //定时器0初始化
{
        TMOD=0X01;         //定时器0 方式1
        TH0=0Xff;
        TL0=0X06; //定时250us
//        TR0=1;
        EA=1;
        ET0=1;
                                IT0=1;    //外部中断0触发方式:0低电平有效,1下降沿有效。
                                EX0=1;    //外部中断0中断允许位:0禁止中断,1允许中断。
}
void biaohaoinit()           //各个标号初始化
{
        ding=0;                //叮声音  计数标志
        dong=0;                //咚声音  计数标志
        n=0;                //定时0.5s标志
        flag=0;
        stop=0;    //结束标志
                                k1=1;
}
void main()
{
        time0init();
        biaohaoinit();
        while(1)
        {
                if(k1==0)           //判断按键是否按下
                {
                        stop=0x00;
                        k1=1;
                        TR0=1;                                                //打开定时器0
                        while(!stop);    /*!stop的意思是取反,意思就是stop值为0,那么这里判断就是1,
                                                                                         就一直循环执行这条语句,当stop值为1时,这里的!stop参数就是0,条件不成立,
                                                                                         就退出这个while循环,继续执行下一条语句了。*/
                        ET0=0;
      PCON = 0X02;
                        delay(2000);
                        _nop_();
                        _nop_();
                }  
        }        
}

void zhongduan0() interrupt 0
{
        PCON = 0;
        k1=0;
        stop=0x00;
        ET0=1;
}

void time0() interrupt 1
{
                n++;
                TH0=0Xff;
                TL0=0X06; //250us
                stop=0;
                if(n==2000)                //定时0.5s  叮响0.5秒,咚响0.5秒
                {
                                                n=0;
                                                if(flag==0)
                                                {
                                                                                flag=~flag;
                                                }
                                                else
                                                {
                                                                                flag=0;
                                                                                stop=1;
                                                                                TR0=0;          //关闭定时器0
                                                }
                }
                if(flag==0)
                {                                           //通过改变定时计数时间可以改变门铃的声音
                                                ding++;                          //叮
                                                if(ding==1)
                                                {
                                                                                ding=0;
                                                                                beep=~beep;
                                                }
                }
                else
                {
                                                dong++;
                                                if(dong==2)                  //咚
                                                {
                                                                                dong=0;
                                                                                beep=~beep;
                                                }        
                }

}

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

使用道具 举报

沙发
ID:275826 发表于 2021-5-3 12:07 | 只看该作者
掉电模式要重新复位才能工作
回复

使用道具 举报

板凳
ID:891570 发表于 2021-5-3 23:05 | 只看该作者
tyrl800 发表于 2021-5-3 12:07
掉电模式要重新复位才能工作

可是STC89C52的手册里说用外部中断可以唤醒呀,我用外部中断可以唤醒,用万用表测量单片机的工作电流由0MA变回8MA左右了,但就是程序不能正常运行了。
回复

使用道具 举报

地板
ID:230742 发表于 2021-5-4 12:42 | 只看该作者
K按键接在哪个引脚上了?
逻辑好像不对,如果没有按键按下,程序也不进入休眠,一直等待,没有省电的意义。
如果只是一个门铃,不然换个方式,把开关接到复位脚上,程序运行直接一个叮咚后就进入休眠。
按复位键后程序重新开始又是一个叮咚后就休眠了。
这样功能实现了,也省电了。
回复

使用道具 举报

5#
ID:915536 发表于 2021-5-4 15:41 | 只看该作者
掉电唤醒后, 有没有重新初始化时钟, 还有管脚呢?
回复

使用道具 举报

6#
ID:275826 发表于 2021-5-4 19:01 | 只看该作者
PCON = 0X02;是掉电方式,需要复位;
PCON = 0X01; 睡眠方式,可以中断唤醒。
回复

使用道具 举报

7#
ID:891570 发表于 2021-5-4 23:10 | 只看该作者
谢谢各位老师的解释,只是本人做门铃的时候想到如果以后要是再用51单片机做个移动的设备,那么这个掉电模式对电池消耗方面是一个很好的模式,如果每次只能需要复位才行,程序都要重新执行的话,可能会对某些设备会有影响,所以想弄明白为什么STC89C52的手册上说外部中断可以唤醒,但实际上却没唤醒,是因为程序的问题还是本身硬件上的BUG导致的,弄明白这个原因之后以后再做什么小东西的话可以避免一下,查看STC的其它产品手册上也说有这个掉电模式,也就是用外部中断可以唤醒,只是手里没有其它型号芯片没法验证。这个电路硬件比较简单,就是按键接在P3.2引脚上,P1.0接的喇叭。
回复

使用道具 举报

8#
ID:889094 发表于 2021-5-4 23:50 | 只看该作者

STC12C5A60S2手册是这么说的
回复

使用道具 举报

9#
ID:275826 发表于 2021-5-5 09:43 | 只看该作者
原来我以为是普通89C52,楼主用STC12C5A60S2程序是可以正常工作的,程序还能简化
回复

使用道具 举报

10#
ID:213173 发表于 2021-5-5 17:05 | 只看该作者
shujing 发表于 2021-5-4 23:10
谢谢各位老师的解释,只是本人做门铃的时候想到如果以后要是再用51单片机做个移动的设备,那么这个掉电模式 ...

作测试不要写那么复杂,越简单越容易发现问题。给你改了,你试试。
  1. #include "reg51.h"
  2. #include "intrins.h"

  3. sbit beep=P1^0;

  4. void ding(unsigned int x)
  5. {
  6.         unsigned char t;
  7.         while(x--)
  8.         {       
  9.                 beep=~beep;
  10.                 for(t=0;t<20;t++);
  11.         }                                                       
  12.         beep=1;       
  13. }

  14. void dong(unsigned int x)
  15. {
  16.         unsigned char t;
  17.         while(x--)
  18.         {       
  19.                 beep=~beep;
  20.                 for(t=0;t<50;t++);
  21.         }                                                       
  22.         beep=1;       
  23. }

  24. void exint0() interrupt 0
  25. {

  26. }

  27. void main()
  28. {
  29.         IT0 = 1;
  30.         EX0 = 1;
  31.         EA = 1;
  32.         while (1)
  33.         {
  34.                 ding(1000);//叮
  35.                 dong(1000);//咚
  36.                 PCON=0x01;//睡眠
  37.                 _nop_();
  38.                 _nop_();
  39.         }
  40. }
复制代码
回复

使用道具 举报

11#
ID:891570 发表于 2021-5-5 22:37 | 只看该作者
tyrl800 发表于 2021-5-5 09:43
原来我以为是普通89C52,楼主用STC12C5A60S2程序是可以正常工作的,程序还能简化

8楼截的图和我看的STC89C52RC的芯片手册说明是一模一样的,就是看他手册上写有这个功能才试着用下,结果不行,看来可能是这个STC89的芯片本身有问题呀。
回复

使用道具 举报

12#
ID:891570 发表于 2021-5-5 22:38 | 只看该作者
wulin 发表于 2021-5-5 17:05
作测试不要写那么复杂,越简单越容易发现问题。给你改了,你试试。

好的,我测试一下看看,谢谢!!!
回复

使用道具 举报

13#
ID:65448 发表于 2021-5-6 14:10 | 只看该作者
中断里面 stop 置 1 试试
回复

使用道具 举报

14#
ID:916064 发表于 2021-5-6 16:55 | 只看该作者
掉电了要重新复位才能工作
回复

使用道具 举报

15#
ID:889094 发表于 2021-5-6 19:44 | 只看该作者
10楼的程序结构性很好,学习了,你要响铃几下,就要看你程序里让它响几下,自己按程序走走,是不是可以响2下以上?
    TR0=1;                                                //打开定时器0
                         while(!stop);    /*!stop的意思是取反,意思就是stop值为0,那么这里判断就是1,
                                                                                         就一直循环执行这条语句,当stop值为1时,这里的!stop参数就是0,条件不成立,
                                                                                         就退出这个while循环,继续执行下一条语句了。*/
                         ET0=0;
还发现你这里用TR0=1;开始计数,用ET0=0;停止中断,这里并没有停止计数吧?你的开启和结束用的不是一种东西呀?
两个应该配套使用,否则肯定不会有第二次响应了
回复

使用道具 举报

16#
ID:894836 发表于 2021-5-6 20:17 | 只看该作者
可能是中断设置有误,无法正常工作
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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