久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2966|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

用51單片機(jī)做的門鈴,增加掉電模式后門鈴只能響一次后就不響了,請(qǐng)問各位是程序哪錯(cuò)了

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
#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()          //定時(shí)器0初始化
{
        TMOD=0X01;         //定時(shí)器0 方式1
        TH0=0Xff;
        TL0=0X06; //定時(shí)250us
//        TR0=1;
        EA=1;
        ET0=1;
                                IT0=1;    //外部中斷0觸發(fā)方式:0低電平有效,1下降沿有效。
                                EX0=1;    //外部中斷0中斷允許位:0禁止中斷,1允許中斷。
}
void biaohaoinit()           //各個(gè)標(biāo)號(hào)初始化
{
        ding=0;                //叮聲音  計(jì)數(shù)標(biāo)志
        dong=0;                //咚聲音  計(jì)數(shù)標(biāo)志
        n=0;                //定時(shí)0.5s標(biāo)志
        flag=0;
        stop=0;    //結(jié)束標(biāo)志
                                k1=1;
}
void main()
{
        time0init();
        biaohaoinit();
        while(1)
        {
                if(k1==0)           //判斷按鍵是否按下
                {
                        stop=0x00;
                        k1=1;
                        TR0=1;                                                //打開定時(shí)器0
                        while(!stop);    /*!stop的意思是取反,意思就是stop值為0,那么這里判斷就是1,
                                                                                         就一直循環(huán)執(zhí)行這條語句,當(dāng)stop值為1時(shí),這里的!stop參數(shù)就是0,條件不成立,
                                                                                         就退出這個(gè)while循環(huán),繼續(xù)執(zhí)行下一條語句了。*/
                        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)                //定時(shí)0.5s  叮響0.5秒,咚響0.5秒
                {
                                                n=0;
                                                if(flag==0)
                                                {
                                                                                flag=~flag;
                                                }
                                                else
                                                {
                                                                                flag=0;
                                                                                stop=1;
                                                                                TR0=0;          //關(guān)閉定時(shí)器0
                                                }
                }
                if(flag==0)
                {                                           //通過改變定時(shí)計(jì)數(shù)時(shí)間可以改變門鈴的聲音
                                                ding++;                          //叮
                                                if(ding==1)
                                                {
                                                                                ding=0;
                                                                                beep=~beep;
                                                }
                }
                else
                {
                                                dong++;
                                                if(dong==2)                  //咚
                                                {
                                                                                dong=0;
                                                                                beep=~beep;
                                                }        
                }

}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:275826 發(fā)表于 2021-5-3 12:07 | 只看該作者
掉電模式要重新復(fù)位才能工作
回復(fù)

使用道具 舉報(bào)

板凳
ID:891570 發(fā)表于 2021-5-3 23:05 | 只看該作者
tyrl800 發(fā)表于 2021-5-3 12:07
掉電模式要重新復(fù)位才能工作

可是STC89C52的手冊(cè)里說用外部中斷可以喚醒呀,我用外部中斷可以喚醒,用萬用表測(cè)量單片機(jī)的工作電流由0MA變回8MA左右了,但就是程序不能正常運(yùn)行了。
回復(fù)

使用道具 舉報(bào)

地板
ID:230742 發(fā)表于 2021-5-4 12:42 | 只看該作者
K按鍵接在哪個(gè)引腳上了?
邏輯好像不對(duì),如果沒有按鍵按下,程序也不進(jìn)入休眠,一直等待,沒有省電的意義。
如果只是一個(gè)門鈴,不然換個(gè)方式,把開關(guān)接到復(fù)位腳上,程序運(yùn)行直接一個(gè)叮咚后就進(jìn)入休眠。
按復(fù)位鍵后程序重新開始又是一個(gè)叮咚后就休眠了。
這樣功能實(shí)現(xiàn)了,也省電了。
回復(fù)

使用道具 舉報(bào)

5#
ID:915536 發(fā)表于 2021-5-4 15:41 | 只看該作者
掉電喚醒后, 有沒有重新初始化時(shí)鐘, 還有管腳呢?
回復(fù)

使用道具 舉報(bào)

6#
ID:275826 發(fā)表于 2021-5-4 19:01 | 只看該作者
PCON = 0X02;是掉電方式,需要復(fù)位;
PCON = 0X01; 睡眠方式,可以中斷喚醒。
回復(fù)

使用道具 舉報(bào)

7#
ID:891570 發(fā)表于 2021-5-4 23:10 | 只看該作者
謝謝各位老師的解釋,只是本人做門鈴的時(shí)候想到如果以后要是再用51單片機(jī)做個(gè)移動(dòng)的設(shè)備,那么這個(gè)掉電模式對(duì)電池消耗方面是一個(gè)很好的模式,如果每次只能需要復(fù)位才行,程序都要重新執(zhí)行的話,可能會(huì)對(duì)某些設(shè)備會(huì)有影響,所以想弄明白為什么STC89C52的手冊(cè)上說外部中斷可以喚醒,但實(shí)際上卻沒喚醒,是因?yàn)槌绦虻膯栴}還是本身硬件上的BUG導(dǎo)致的,弄明白這個(gè)原因之后以后再做什么小東西的話可以避免一下,查看STC的其它產(chǎn)品手冊(cè)上也說有這個(gè)掉電模式,也就是用外部中斷可以喚醒,只是手里沒有其它型號(hào)芯片沒法驗(yàn)證。這個(gè)電路硬件比較簡(jiǎn)單,就是按鍵接在P3.2引腳上,P1.0接的喇叭。
回復(fù)

使用道具 舉報(bào)

8#
ID:889094 發(fā)表于 2021-5-4 23:50 | 只看該作者

STC12C5A60S2手冊(cè)是這么說的
回復(fù)

使用道具 舉報(bào)

9#
ID:275826 發(fā)表于 2021-5-5 09:43 | 只看該作者
原來我以為是普通89C52,樓主用STC12C5A60S2程序是可以正常工作的,程序還能簡(jiǎn)化
回復(fù)

使用道具 舉報(bào)

10#
ID:213173 發(fā)表于 2021-5-5 17:05 | 只看該作者
shujing 發(fā)表于 2021-5-4 23:10
謝謝各位老師的解釋,只是本人做門鈴的時(shí)候想到如果以后要是再用51單片機(jī)做個(gè)移動(dòng)的設(shè)備,那么這個(gè)掉電模式 ...

作測(cè)試不要寫那么復(fù)雜,越簡(jiǎn)單越容易發(fā)現(xiàn)問題。給你改了,你試試。
  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. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

11#
ID:891570 發(fā)表于 2021-5-5 22:37 | 只看該作者
tyrl800 發(fā)表于 2021-5-5 09:43
原來我以為是普通89C52,樓主用STC12C5A60S2程序是可以正常工作的,程序還能簡(jiǎn)化

8樓截的圖和我看的STC89C52RC的芯片手冊(cè)說明是一模一樣的,就是看他手冊(cè)上寫有這個(gè)功能才試著用下,結(jié)果不行,看來可能是這個(gè)STC89的芯片本身有問題呀。
回復(fù)

使用道具 舉報(bào)

12#
ID:891570 發(fā)表于 2021-5-5 22:38 | 只看該作者
wulin 發(fā)表于 2021-5-5 17:05
作測(cè)試不要寫那么復(fù)雜,越簡(jiǎn)單越容易發(fā)現(xiàn)問題。給你改了,你試試。

好的,我測(cè)試一下看看,謝謝!!!
回復(fù)

使用道具 舉報(bào)

13#
ID:65448 發(fā)表于 2021-5-6 14:10 | 只看該作者
中斷里面 stop 置 1 試試
回復(fù)

使用道具 舉報(bào)

14#
ID:916064 發(fā)表于 2021-5-6 16:55 | 只看該作者
掉電了要重新復(fù)位才能工作
回復(fù)

使用道具 舉報(bào)

15#
ID:889094 發(fā)表于 2021-5-6 19:44 | 只看該作者
10樓的程序結(jié)構(gòu)性很好,學(xué)習(xí)了,你要響鈴幾下,就要看你程序里讓它響幾下,自己按程序走走,是不是可以響2下以上?
    TR0=1;                                                //打開定時(shí)器0
                         while(!stop);    /*!stop的意思是取反,意思就是stop值為0,那么這里判斷就是1,
                                                                                         就一直循環(huán)執(zhí)行這條語句,當(dāng)stop值為1時(shí),這里的!stop參數(shù)就是0,條件不成立,
                                                                                         就退出這個(gè)while循環(huán),繼續(xù)執(zhí)行下一條語句了。*/
                         ET0=0;
還發(fā)現(xiàn)你這里用TR0=1;開始計(jì)數(shù),用ET0=0;停止中斷,這里并沒有停止計(jì)數(shù)吧?你的開啟和結(jié)束用的不是一種東西呀?
兩個(gè)應(yīng)該配套使用,否則肯定不會(huì)有第二次響應(yīng)了
回復(fù)

使用道具 舉報(bào)

16#
ID:894836 發(fā)表于 2021-5-6 20:17 | 只看該作者
可能是中斷設(shè)置有誤,無法正常工作
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 美女在线视频一区二区三区 | 婷婷在线网站 | 卡通动漫第一页 | 亚洲成人精品久久久 | a久久| 国产成都精品91一区二区三 | 最新免费黄色网址 | 精品久久久久久亚洲精品 | 欧美日韩成人在线 | 久久久免费电影 | 日韩一区二区在线播放 | 亚洲精品久久久久久久久久久 | a在线免费观看视频 | 伊人在线 | 暖暖日本在线视频 | 日韩高清中文字幕 | 欧美一区二区三区精品 | 97精品久久 | 香蕉视频黄色 | 一级a爱片久久毛片 | 精品久久中文字幕 | 99久久免费精品 | 欧美一级免费 | 欧美精品一区在线 | 中文字幕亚洲欧美日韩在线不卡 | 欧美精品一区二区在线观看 | 国产美女一区二区 | 成人精品久久久 | 久久91精品久久久久久9鸭 | 午夜日韩 | 日韩欧美亚洲一区 | 91福利网址 | 综合色久 | 欧美精品一区二区蜜桃 | 亚洲国产一区二区三区在线观看 | 国产内谢 | 一级片成人 | 国产亚洲精品精品国产亚洲综合 | 香蕉久久久久久 | 亚洲欧美在线观看 | 亚洲网站观看 |