这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 51单片机做的门铃,只能响一次。不知道是哪里的问题?

共7条 1/1 1 跳转至

51单片机做的门铃,只能响一次。不知道是哪里的问题?

工程师
2021-05-04 22:18:10     打赏

大家好!我用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;
                                                }        
                }

}





关键词: 门铃     单片机     BUG    

工程师
2021-05-04 22:27:11     打赏
2楼

掉电模式要重新复位才能工作!


工程师
2021-05-04 22:32:24     打赏
3楼

K按键接在哪个引脚上了?
逻辑好像不对,如果没有按键按下,程序也不进入休眠,一直等待,没有省电的意义。
如果只是一个门铃,不然换个方式,把开关接到复位脚上,程序运行直接一个叮咚后就进入休眠。
按复位键后程序重新开始又是一个叮咚后就休眠了。
这样功能实现了,也省电了。


工程师
2021-05-04 22:36:02     打赏
4楼

掉电唤醒后, 有没有重新初始化时钟, 还有管脚呢?


工程师
2021-05-04 22:37:46     打赏
5楼

PCON = 0X02;是掉电方式,需要复位;
PCON = 0X01; 睡眠方式,可以中断唤醒。


高工
2021-05-04 22:44:59     打赏
6楼

问题还是蛮大 的


工程师
2021-05-04 22:50:56     打赏
7楼

查查电路有没有什么问题


共7条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]