找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1332|回复: 4
收起左侧

制作的单片机音乐门铃程序应该是陷入死循环了,引入的按键无法关闭音乐

[复制链接]
ID:670716 发表于 2020-1-1 21:15 | 显示全部楼层 |阅读模式
功能是当家中有人,来访客人按下门铃按键K2,此时液晶显示屏会提示客人家中有人的信息,与此同时,蜂鸣器播放音乐,客人进入等待过程;若家中无人,客人按下门铃后,此时液晶屏将提示客人家中无人的信息。在此过程中,主人可在家中用K3随时停止客人等待过程,即停止音乐播放及液晶显示。
四个按键标识在图上了,K 1是主人选择他是否在家的按钮,现在无法利用K3关闭

单片机程序在下边
  1. #include "reg52.h"    //´
  2. #include "lcd1602.h"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit BEEP = P2^7;
  6. sbit k1=P3^0;
  7. sbit k2=P3^3;
  8. sbit k3=P3^6;

  9. uchar code SONG_TONE[]= {   212,212,190,212,159,169,212,212,190,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0 }; uchar code SONG_LONG[]= {   9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0 };
  10. uchar code tab1[]="Sorry";  //ÎÞÈË uchar code tab2[]="master is not";
  11. uchar code tab3[]="Yes"; //ÓÐÈË uchar code tab4[]="master at home";
  12. uchar feng; uchar k1_flg=1;

  13. void delayms(uint i) { uchar j; for(i;i>0;i--)   for(j=125;j>0;j--); }

  14. void anjian()
  15. {
  16. if(k1==0)
  17. {
  18.    delayms(5);
  19.    if(k1==0)
  20.    {
  21.     k1_flg=0;//=0ʱÎÞÈË£¬Ä¬ÈÏÓÐÈË
  22.    }
  23.    while(!k1);
  24. }
  25. else if(k2==0)
  26. {
  27.    delayms(5);
  28.    if(k2==0)
  29.    {
  30.     if(k1_flg==1)
  31.     {
  32.      feng=1;
  33.      lcd_str(3,0,tab3);
  34.      lcd_str(0,1,tab4);
  35.     }
  36.     else if(k1_flg==0)
  37.     {
  38.      lcd_str(5,0,tab1);
  39.      lcd_str(0,1,tab2);
  40.      
  41.     }
  42.    }
  43.    while(!k2);
  44. }
  45. else if(k3==0)
  46. {
  47.    delayms(5);
  48.    if(k3==0)
  49.    {
  50.     feng=0;
  51.     lcd_wcom(0x01);
  52.    }
  53.    while(!k3);
  54. }
  55. }
  56. void PlayMusic()
  57. {
  58.    uint i =0,j,k;
  59. while(SONG_LONG[ i]!=0||SONG_TONE[ i]!=0)
  60. {
  61.     for(j=0;j<SONG_LONG[ i]*20;j++)
  62.    {
  63.      BEEP = ~BEEP;
  64.     for(k=0;k<SONG_TONE[ i]/3;k++);
  65.    }
  66.    delayms(10);
  67.    i++;
  68. }
  69. }
  70. void main()
  71. {

  72. lcd_init();
  73. lcd_wcom(0x01);
  74. while(1)
  75. {
  76.    if(feng==1)
  77.    {
  78.     PlayMusic();
  79.    }
  80.    
  81.    
  82.    
  83.    anjian();
  84. }  
  85. }
复制代码


回复

使用道具 举报

ID:670716 发表于 2020-1-1 21:16 | 显示全部楼层
这是原理图
捕获.PNG
回复

使用道具 举报

ID:110606 发表于 2020-1-3 09:55 | 显示全部楼层
你这个肯定是停不了的吧,主要是你main里面如果想要他停止,不仅要做feng=0这一步,还要把BEEP置位,要不然即使feng=0,BEEp还会保持原来的状态
回复

使用道具 举报

ID:347759 发表于 2020-1-3 11:23 | 显示全部楼层
在while()括号里面添加条件判断,这样就可以通过按键跳出循环
回复

使用道具 举报

ID:706302 发表于 2020-3-29 20:39 | 显示全部楼层
shengkai540 发表于 2020-1-3 11:23
在while()括号里面添加条件判断,这样就可以通过按键跳出循环

添加什么条件啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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