标题: 抛砖之一“带型参的无源蜂鸣器驱动程序” [打印本页]

作者: tianxing    时间: 2014-10-19 17:23
标题: 抛砖之一“带型参的无源蜂鸣器驱动程序”
本人不想说有源蜂鸣器的不足,只是无源蜂鸣器有很多优点,声音清脆响亮,是设备报警器的理想选择;电压适应范围大,用途广泛;可以改变方波时间参数,使输出音频变调;还可以语音和音乐输出时当喇叭使用,学习单片机无源蜂鸣器是个不错的选择。只是编程时比较麻烦,所以就想到编一个带型参的驱动程序把它固定下来,以后可以任意改变参数反复调用。今天拿来与大家分享,希望能对各位有所启发,且一起讨论完善之。

#include <reg52.h>
#define INT16 unsigned int  
#define INT8 unsigned char  
sbit BUZZER=P1^5;

void Delay(INT16 xms)//延时函数,有参函数
{  
        INT16 x,y;   
        for(x = xms; x > 0; x --)   
                for(y = 110; y > 0; y --);  
}

void Buzzer(INT16 Number,INT8 Time)          //可以选择鸣响次数和音频
{
        INT8 h,j;
        INT16 i ;
        for (h = 0; h < Number; h ++)
        {
                for (i = 0; i < Time; i ++)
                {
                        BUZZER = ~BUZZER;              //BUZZER取反
                        for (j = 0 ; j < 100 ; j ++);   //需要产生方波,调节音频
                }
                Delay(100);                         //间隔时间
        }
        BUZZER = 0;                      //注意PNP=0;NPN=1关闭蜂鸣器,否则三极管电流会很大。
}

void main()
{
        while(1)
        {
        Buzzer(50,100);                         //任意调节参数,选择自己喜欢的鸣叫次数和音频
        }
}


下次讨论驱动电路。


作者: nsj21n    时间: 2014-10-20 08:55
GOOD,沙发!
作者: a119    时间: 2014-10-20 21:39
好东东 坐等楼主发 驱动电路啊
作者: a119    时间: 2014-10-20 21:39
十分全给了
作者: 雨山51    时间: 2014-10-21 10:46
我怎么调试的时候提示 buzzer(50,100)  参数问题
作者: tianxing    时间: 2014-10-21 18:19
欢迎诸位参与,并且谢谢a119和admin的提携。
现在发三种我常用的蜂鸣器驱动电路。复合型驱动可以做的比较响,直接当报警器用。


截图00.png (22.22 KB, 下载次数: 216)

截图00.png

作者: tianxing    时间: 2014-10-21 19:13
游客 223.64.2.x 发表于 2014-10-21 18:03
可能是字母大小写的问题,再试试。

雨山51网友,调试通过了吗?我愿意与你交流。
作者: tianxing    时间: 2014-10-23 18:42
无源蜂鸣器的实用程序。
//修改变量模拟警车,消防车警报的程序。
#include <reg52.h>
#define INT8 unsigned char
#define INT16 unsigned int
sbit BUZZER = P1 ^ 5;
INT8 FMQ;
INT16 Flag;                       

void Delay(INT16 xms)       //延时函数
{  
        INT16 x,y;   
        for(x = xms; x > 0; x --)   
                for(y = 110; y > 0; y --);  
}

void Fmq_Warning()
{
        TMOD = 0x01;
        FMQ = 0x00;
        TH0 = 0x00;
        TL0 = 0xFF;       
        TR0 = 1;
        IE = 0x82;
        Flag = 0;
        while(1)
        {
                switch(Flag)
                {       
                        case 0:FMQ ++;break;                         
                        case 1:FMQ --;break;               
                }
                if (!(FMQ ^ 0xFF)) Flag = 1;
                if (!(FMQ ^ 0x00)) Flag = 0;         
                Delay(10);                                                 //改变节奏。取值1为警车声;取值10为消防车声。
        }                                                                                                       
}               
void timer0() interrupt 1 using 1
{
        TH0 = 0xFE;
        TL0 = FMQ;
        BUZZER = ~BUZZER;       
}

void main()
{
        Fmq_Warning();
}


作者: 郭良    时间: 2014-10-23 20:27
不错,这个是我看过的有史以来最清晰的的单片机视频教程
作者: hjlost    时间: 2014-10-24 13:57
掘墓高手,专挖古墓,一挖一个坑,坑坑见墓。。

作者: tianxing    时间: 2014-10-25 18:12
再分享一个模拟 "叮咚“门铃的程序。

#include <reg52.h>
#define INT8 unsigned char
#define INT16 unsigned int
INT8 F_5hz,F_7hz;
INT16 T_cnt;

bit Stop;
bit Flag;

sbit FMQ = P1 ^ 5;                                 //蜂鸣器接口
sbit KEY = P1 ^ 0;                                 //按键接口

void Delay( INT16 xms )       //延时函数
{  
        INT16 x,y;   
        for(x = xms; x > 0; x --)   
                for(y = 110; y > 0; y --);  
}

void FMQ_init( void )
{
        TMOD = 0x02;
        TH0 = 0x06;
        TL0 = 0x06;
        ET0 = 1;
        EA = 1;
}

void main( void )
{
        FMQ_init();
        while( 1 )
        {
                if( KEY == 0 )
                {
                        Delay( 10 );
                        if( KEY == 0 )
                        {
                                F_5hz = 0;
                                F_7hz = 0;
                                T_cnt = 0;
                                Flag = 0;
                                Stop = 0;
                                TR0 = 1;
                                while( Stop == 0 );
                        }
                }
                FMQ = 0;                                           //NPN驱动取值0;PNP驱动取值1;
        }
}

void t0( void ) interrupt 1 using 0
{
        T_cnt ++;
        if(T_cnt == 1000)                                   //改变节奏
        {
                T_cnt = 0;
                if( Flag == 0 )
                {
                        Flag = ~Flag;
                }
                else
                {
                        Stop = 1;
                        TR0 = 0;
                }
        }
        if( Flag == 0 )
        {
                F_7hz ++;
                if( F_7hz == 1 )
                {
                        F_7hz = 0;
                        FMQ = ~FMQ;
                }
        }
        else
        {
                F_5hz ++;
                if( F_5hz == 3 )
                {
                        F_5hz = 0;
                        FMQ = ~FMQ;
                }
        }
}



作者: tianxing    时间: 2014-10-26 08:29
自己先顶一下。
作者: tianxing    时间: 2014-10-27 19:52
分享了。
作者: wwxz20174    时间: 2014-11-23 19:46
感谢楼主分享。。。。。。。。。。。。。。
作者: tgwfcc    时间: 2015-6-19 10:32
BUZZER = 0;                      //注意PNP=0;NPN=1关闭蜂鸣器,否则三极管电流会很大
NPN=1,三极管不导通了,蜂鸣器还是工作的,楼主搞反了吧?

作者: tianxing    时间: 2015-6-22 15:09
路过,来看看。我推荐使用的是无源蜂鸣器,不知兄弟使用的是什么类型蜂鸣器?
作者: ZHANGXUSTRONGER    时间: 2016-5-4 22:39
楼主能给个程序吗?实现无源蜂鸣器响五秒,停半秒,再响五秒,然后停止。
作者: send    时间: 2017-5-1 21:29
我刚好做了一个有源蜂鸣器的接线电路,把这个程序烧录进去之后蜂鸣器就响了
作者: dzbj    时间: 2017-5-1 23:49
用for语句循环的延时函数都有个问题 在延时的时候除了中断单片机什么事都干不了 只能在for里循环 这样的程序学习和玩还可以 做事不太合适 比如 11.0592MHz晶振下AD转换一次才100ns 蜂鸣器延时都是毫秒级的 差一个数量级 听一声响的时间能把8路AD扫几遍了
作者: 一缕阳光999    时间: 2018-1-12 11:43
在吗楼主,怎么联系你479680600我的QQ号,急盼
作者: 蓝野    时间: 2018-1-22 10:05
void Buzzer(INT16 Number,INT8 Time)  函数里面的
Delay(100);          //间隔时间


这个作用是什么呢?
作者: 蓝野    时间: 2018-1-22 10:32
tianxing 发表于 2014-10-21 18:19
欢迎诸位参与,并且谢谢a119和admin的提携。
现在发三种我常用的蜂鸣器驱动电路。复合型驱动可以做的比较 ...

可以讲讲你这个(复合型)两级三极管的驱动的原理吗,为什么复合型的声音会很大?
作者: w322405    时间: 2018-8-30 19:46
tgwfcc 发表于 2015-6-19 10:32
**** 作者被禁止或删除 内容自动屏蔽 ****

楼主的意思是感应电动势吧
作者: tianxing    时间: 2018-9-1 08:55
感谢大家都来参与讨论,交流心得,共同提高学习单片机的兴趣。这是51论坛的宗旨,也是我“抛砖”之初衷。关于dzbj老师指出的延时问题,非常好。大家在实际应用中timer定时中断函数解决。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1