找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机按键控制无源蜂鸣器,求老师指点

[复制链接]
跳转到指定楼层
楼主
ID:379175 发表于 2018-8-14 05:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这编程只是控制按键,按下蜂鸣器发声,松开停止发声。怎么能实现按一下发声,再按一下停止。

#include "reg52.h"               
typedef unsigned int u16;         
typedef unsigned char u8;
sbit SPK=P1^5;
sbit k4=P3^3;
void delay(u16 i)
{
        while(i--);        
}
void anjian()
{
if(k4==0)
  {
   delay(100);
   SPK=0;
   delay(100);
   SPK=1;
  }        
else
    {
     SPK=1;
    }
}
void main()
{
while(1)
{
anjian();
}
}

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

使用道具 举报

沙发
ID:386027 发表于 2018-8-14 09:18 | 只看该作者
#include "reg52.h"               
typedef unsigned int u16;         
typedef unsigned char u8;
sbit SPK=P1^5;
sbit k4=P3^3;
u16 a;
void delay(u16 i)
{
        while(i--);        
}
void anjian()
{
if(k4==0||a==0)
{
   delay(100);
   SPK=0;
   a=1;
  }         
if(key4==0||a==1)
{
   delay(100);
   SPK=1;
   a=0;
}
void main()
{
while(1)
{
anjian();
}
}
回复

使用道具 举报

板凳
ID:84765 发表于 2018-8-14 09:36 | 只看该作者
这编程只是控制按键,按下蜂鸣器发声,松开停止发声。怎么能实现按一下发声,再按一下停止。
#include "reg52.h"               
typedef unsigned int u16;         
typedef unsigned char u8;
u16 a=0;//计数
sbit SPK=P1^5;
sbit k4=P3^3;
void delay(u16 i)
{
         while(i--);        
}
void anjian()
{
if(k4==0)
   {
   while(!k4);
   a++;
   delay(50);
   }   
    if(a==0)//计数a=0时蜂鸣器不响
     {
       SPK=1;
     }

    if(a==1)//计数a=1时蜂鸣器响
     {
    delay(100);
    SPK=0;
    delay(100);
    SPK=1;
     }

    if(a==2)//计数a=2 a赋值0 蜂鸣器不响
     {
      SPK=1;
      a=0;
     }   
}
void main()
{
while(1)
{
anjian();
}
}
回复

使用道具 举报

地板
ID:295874 发表于 2018-8-14 10:01 | 只看该作者
增加关于按键次数的计数器,计数器为1,蜂鸣器发声音,计数器为2,停止发声。
回复

使用道具 举报

5#
ID:382454 发表于 2018-8-14 11:32 | 只看该作者
用定时器做成方波发生器,之后编写一个按键控制TR0=~TR0取反即可。
也就是按一下键,取反一下定时器的开启或关闭。这不就是按一下,停止,再按一下工作么。
回复

使用道具 举报

6#
ID:221865 发表于 2018-8-14 20:02 | 只看该作者
用一个标志位就可以了,当按键按下的时候,标志位取反,需考虑按键抖动。
回复

使用道具 举报

7#
ID:386397 发表于 2018-8-15 09:16 | 只看该作者
在关闭蜂鸣器后,对按键进行复位操作,关闭按键影响就可以了
回复

使用道具 举报

8#
ID:379175 发表于 2018-8-16 12:25 | 只看该作者
zq25315513966 发表于 2018-8-14 09:18
#include "reg52.h"               
typedef unsigned int u16;         
typedef unsigned char u8;

你这是不是控制有源蜂鸣器的啊?
回复

使用道具 举报

9#
ID:274129 发表于 2018-8-16 17:26 | 只看该作者
无源蜂鸣器加一个脉冲就可以了
回复

使用道具 举报

10#
ID:213173 发表于 2018-8-16 21:02 | 只看该作者
给你一个按键控制无源蜂鸣器驱动程序参考
#include "reg52.h"               
typedef unsigned int u16;         
typedef unsigned char u8;
sbit Buzzer=P1^5;
sbit key=P3^3;
bit sign=0;
/*
void delay(u16 i)
{
        while(i--);        
}*/
void Timer0Init()        //250微秒@12.000MHz
{
        TMOD= 0x02;                //设置定时器模式
        TL0 = 0x06;                //设置定时初值
        TH0 = 0x06;                //设置定时重载值
        TR0 = 1;                        //定时器0开始计时
        EA=1;                                //开总中断
        ET0=1;                        //开定时器0中断
}

void anjian()
{
        static bit key_lock=0;//按键自锁标志
        static u8 count=0;//消抖计数变量               
        if(!key)
        {
                if((count++>=100)&&(key_lock==0))
                {
                        key_lock=1;                        //按键自锁标志置1
                        sign=~sign;                        //蜂鸣器使能标志取反
                }
        }        
        else
        {
                key_lock=0;                                //按键自锁标志清0
                count=0;                                        //消抖计数清0
        }
}
void main()
{
        Timer0Init();
        while(1)
        {
                anjian();
        }
}
void timer0() interrupt 1
{
        if(sign==1)                //蜂鸣器使能
                Buzzer=~Buzzer;//2KHz方波
        else Buzzer=1;//蜂鸣器复位
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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