找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12062|回复: 25
收起左侧

抛砖之一“带型参的无源蜂鸣器驱动程序”

  [复制链接]
ID:67370 发表于 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);                         //任意调节参数,选择自己喜欢的鸣叫次数和音频
        }
}


下次讨论驱动电路。

评分

参与人数 5威望 +55 黑币 +73 收起 理由
5314039 + 5 赞一个!
send + 8 很给力!
秋葉原48 + 5 赞一个!
a119 + 10 + 10 很给力!
admin + 45 + 45 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

ID:64089 发表于 2014-10-20 08:55 | 显示全部楼层
GOOD,沙发!
回复

使用道具 举报

ID:37685 发表于 2014-10-20 21:39 | 显示全部楼层
好东东 坐等楼主发 驱动电路啊
回复

使用道具 举报

ID:37685 发表于 2014-10-20 21:39 | 显示全部楼层
十分全给了
回复

使用道具 举报

ID:67716 发表于 2014-10-21 10:46 来自手机 | 显示全部楼层
我怎么调试的时候提示 buzzer(50,100)  参数问题
回复

使用道具 举报

ID:67370 发表于 2014-10-21 18:19 | 显示全部楼层
欢迎诸位参与,并且谢谢a119和admin的提携。
现在发三种我常用的蜂鸣器驱动电路。复合型驱动可以做的比较响,直接当报警器用。


截图00.png
回复

使用道具 举报

ID:67370 发表于 2014-10-21 19:13 | 显示全部楼层
游客 223.64.2.x 发表于 2014-10-21 18:03
可能是字母大小写的问题,再试试。

雨山51网友,调试通过了吗?我愿意与你交流。
回复

使用道具 举报

ID:67370 发表于 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();
}

回复

使用道具 举报

ID:67834 发表于 2014-10-23 20:27 | 显示全部楼层
不错,这个是我看过的有史以来最清晰的的单片机视频教程
回复

使用道具 举报

ID:66501 发表于 2014-10-24 13:57 | 显示全部楼层
掘墓高手,专挖古墓,一挖一个坑,坑坑见墓。。
回复

使用道具 举报

ID:67370 发表于 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;
                }
        }
}


回复

使用道具 举报

ID:67370 发表于 2014-10-26 08:29 | 显示全部楼层
自己先顶一下。
回复

使用道具 举报

ID:67370 发表于 2014-10-27 19:52 | 显示全部楼层
分享了。
回复

使用道具 举报

ID:62316 发表于 2014-11-23 19:46 | 显示全部楼层
感谢楼主分享。。。。。。。。。。。。。。
回复

使用道具 举报

ID:83423 发表于 2015-6-19 10:32 | 显示全部楼层
BUZZER = 0;                      //注意PNP=0;NPN=1关闭蜂鸣器,否则三极管电流会很大
NPN=1,三极管不导通了,蜂鸣器还是工作的,楼主搞反了吧?
回复

使用道具 举报

ID:67370 发表于 2015-6-22 15:09 | 显示全部楼层
路过,来看看。我推荐使用的是无源蜂鸣器,不知兄弟使用的是什么类型蜂鸣器?
回复

使用道具 举报

ID:118467 发表于 2016-5-4 22:39 | 显示全部楼层
楼主能给个程序吗?实现无源蜂鸣器响五秒,停半秒,再响五秒,然后停止。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:170098 发表于 2017-5-1 21:29 | 显示全部楼层
我刚好做了一个有源蜂鸣器的接线电路,把这个程序烧录进去之后蜂鸣器就响了

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2017-5-1 23:49 | 显示全部楼层
用for语句循环的延时函数都有个问题 在延时的时候除了中断单片机什么事都干不了 只能在for里循环 这样的程序学习和玩还可以 做事不太合适 比如 11.0592MHz晶振下AD转换一次才100ns 蜂鸣器延时都是毫秒级的 差一个数量级 听一声响的时间能把8路AD扫几遍了

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:275145 发表于 2018-1-12 11:43 | 显示全部楼层
在吗楼主,怎么联系你479680600我的QQ号,急盼
回复

使用道具 举报

ID:223571 发表于 2018-1-22 10:05 | 显示全部楼层
void Buzzer(INT16 Number,INT8 Time)  函数里面的
Delay(100);          //间隔时间


这个作用是什么呢?
回复

使用道具 举报

ID:223571 发表于 2018-1-22 10:32 | 显示全部楼层
tianxing 发表于 2014-10-21 18:19
欢迎诸位参与,并且谢谢a119和admin的提携。
现在发三种我常用的蜂鸣器驱动电路。复合型驱动可以做的比较 ...

可以讲讲你这个(复合型)两级三极管的驱动的原理吗,为什么复合型的声音会很大?
回复

使用道具 举报

ID:225054 发表于 2018-8-30 19:46 来自手机 | 显示全部楼层
tgwfcc 发表于 2015-6-19 10:32
**** 作者被禁止或删除 内容自动屏蔽 ****

楼主的意思是感应电动势吧
回复

使用道具 举报

ID:67370 发表于 2018-9-1 08:55 | 显示全部楼层
感谢大家都来参与讨论,交流心得,共同提高学习单片机的兴趣。这是51论坛的宗旨,也是我“抛砖”之初衷。关于dzbj老师指出的延时问题,非常好。大家在实际应用中timer定时中断函数解决。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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