八、51单片机之蜂鸣器
1、蜂鸣器的原理
蜂鸣器分为有源蜂鸣器和无源蜂鸣器。这里的“源”不是指电源,而是指震荡源。
1.1、无源蜂鸣器
(1)早期蜂鸣器都是无源的。
(2)内部没有震荡电路,无源蜂鸣器比有源蜂鸣器更便宜。
(3)无源蜂鸣器内部没有震荡源,需要采用一定频率的方波才可以驱动发声。
(4)通过控制方波频率可以控制蜂鸣器的音调。
(5)声音大小由硬件决定,不能通过单片机程序改变。
(6)物体振动越快,频率越高,音调越高尖。
1.2、有源蜂鸣器
(1)内部有震荡电路,有源蜂鸣器比无源蜂鸣器贵。
(2)只要供电就会发出声音。
(3)不能改音调。
2、原理图
(1)上图为无源蜂鸣器。
(2)三极管的作用是因为单片机引脚驱动能力不够,通过J8引脚控制三级管的开关。
3、示例代码
3.1、让无源蜂鸣器响起来
#include <reg52.h>
#include <intrins.h>sbit BUZZER = P0^0; /*无源蜂鸣器驱动引脚*/ void Delay100us();void main()
{while(1){/*人耳听力频率范围为20Hz~20000Hz*/Delay100us(); /*频率 = 1/200uS = 0.005MHZ = 5KHz*/BUZZER = !BUZZER;}
}void Delay100us() //@12.000MHz
{unsigned char i;_nop_();i = 47;while (--i);
}
3.2、定时器控制蜂鸣器音调
(1)采用软件延时控制无源蜂鸣器的弊端:
不易精准控制时间;CPU控制蜂鸣器中不能做其他事。
(2)使蜂鸣器在100KHz发声
外部晶振12MHz + 12T设置 => 内部时钟频率1MHz => 时钟周期1uS;
10KHz => 1/10000s => 100us =>高电平+低电平一共100us,那高电平和低电平的时间都是50us,所以要定的时间就是50us。
(3)蜂鸣器音调与TH0、TL0寄存器值有关,如需经常修改音调,可写成宏定义。
例如:
#defien TONE 10000 Hz /*宏定义音调频率*/
#define TimingLength (1/TONE) *1000000 / 2 /*定时时长uS*/
TH0 = (TimingLength + 1) / 256
TL0 = (TimingLength + 1) % 256
TH0 = us /256
(4)代码
/**功能:定时器控制蜂鸣器音调*定时器:使用定时器0*单片机型号:STC89C516*/
#include <reg52.h>
#include <intrins.h>sbit BUZZER = P0^0; /*无源蜂鸣器驱动引脚*/ /*函数声明*/
void Timer0Init(void); /*定时器0初始化,50uS*/void main()
{Timer0Init();ET0 = 1; //打开T0溢出中断EA = 1; //打开总中断while(1){}
}/**功能: 定时器0初始化,50uS*/
void Timer0Init(void) //50微秒@12.000MHz
{TMOD &= 0xF0; //设置定时器模式,16位定时器/计数器,TL0、TH0全用,工作在定时器模式下TMOD |= 0x01; //设置定时器模式TL0 = 0xCE; //设置定时初始值 0xFF-50+1 = 206 = 0xCETH0 = 0xFF; //设置定时初始值TF0 = 0; //定时器溢出标志,清除TF0标志,TR0 = 1; //定时器运行控制位,定时器0开始计数
}/**功能:定时器0中断处理函数*/
void tm0_isr() interrupt 1 using 1
{TL0 = 0xCE; /*手工重载计数值*/ TH0 = 0xFF; BUZZER = !BUZZER;
}
3.3、蜂鸣器发出滴滴声
(1)蜂鸣器有声音一段时间--没声音一端时间--有声音一段时间......
(2)通过调试控制音调和发声时常,无声时常,从而达到自己想要的效果。
(3)代码
/**功能:蜂鸣器发出滴滴声*定时器:使用定时器0*单片机型号:STC89C516*/
#include <reg52.h>
#include <intrins.h>sbit BUZZER = P0^0; /*无源蜂鸣器驱动引脚*/
unsigned int count = 0;/*函数声明*/
void Timer0Init(void); /*定时器0初始化,50uS*/void main()
{Timer0Init();ET0 = 1; //打开T0溢出中断EA = 1; //打开总中断while(1){}
}/**功能: 定时器0初始化,50uS*/
void Timer0Init(void) //50毫秒@12.000MHz
{TMOD &= 0xF0; //设置定时器模式,16位定时器/计数器,TL0、TH0全用,工作在定时器模式下TMOD |= 0x01; //设置定时器模式TL0 = 0xCE; //设置定时初始值 0xFF-50+1 = 206 = 0xCETH0 = 0xFF; //设置定时初始值TF0 = 0; //定时器溢出标志,清除TF0标志,TR0 = 1; //定时器运行控制位,定时器0开始计数
}/**功能:定时器0中断处理函数*/
void tm0_isr() interrupt 1 using 1
{TL0 = 0xCE; /*手工重载计数值*/ TH0 = 0xFF; count++;if(count <= 4000) {BUZZER = !BUZZER;}else if(count>6000 ){/*count = 4001~6000没声音*/count = 0;}}
3.4、让蜂鸣器唱歌
为什么蜂鸣器能够模拟唱歌
(1)发声音调可以改变
(2)发声长度可以改变
(3)声音的三个属性:响度、音调、音色。
由于本人没有音乐细胞,对长音短音音符这些不了解,也不想去了解,感兴趣自己百度乐谱和简谱吧。就给出如下示例代码。
/************************************************************************ *功能: 通过单片机演奏音乐(八月桂花) *MCU:STC89C516*晶振12MHz,12T(12分频) **********************************************************************/
#include <reg52.h> sbit BUZZER = P0^0; /*无源蜂鸣器驱动引脚*/
unsigned char beat = 0; /*beat为节拍常数变量*/
/*频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍*格式为:频率常数, 节拍常数, 频率常数, 节拍常数......*/
unsigned char code music_tab[] =
{ 0x18, 0x30, 0x1C, 0x10, 0x20, 0x40, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x18, 0x40, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x20, 0x18, 0x20, 0x20, 0x80, 0xFF, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x80, 0xFF, 0x20, 0x20, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x20, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x80, 0x20, 0x30, 0x1C, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x15, 0x1F, 0x05, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x30, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x40, 0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x13, 0x60, 0x18, 0x20, 0x15, 0x40, 0x13, 0x40, 0x18, 0x80, 0x00
}; /*函数声明*/
void delay_Hz (unsigned char t); /*控制频率延时*/
void delayms(unsigned char t); /*毫秒延时子程序*/void main()
{ unsigned char p,m; /*m为频率常数变量*/ unsigned char i=0; TMOD &= 0x0f; TMOD |= 0x01; TH0 = 0xd8;TL0 = 0xef; IE = 0x82;play: while(1) {
a: p = music_tab[i]; if(p == 0x00) /*如果碰到结束符,延时1秒,回到开始再来一遍*/ { i=0;delayms(1000); goto play;} else if(p==0xff) /*若碰到休止符,延时100ms,继续取下一音符*/ { i=i+1;delayms(100);TR0=0; goto a;} else /*取频率常数和节拍常数*/ {m=music_tab[i++];beat=music_tab[i++];} TR0=1; /*开定时器0*/ while(beat != 0) /*等待节拍完成*/{BUZZER = !BUZZER;delay_Hz(m); /*m控制频率*/ } TR0=0; /*关定时器0*/}
} /*采用中断0 控制节拍*/
void tim0_isr() interrupt 1
{ TH0=0xd8; /*手工重载计数值*/ TL0=0xef; beat--; /*控制节拍*/
} /*控制频率延时*/
void delay_Hz (unsigned char t)
{ unsigned i=3*t; while(--i);
} /*毫秒延时子程序*/
void delayms(unsigned char t)
{ while(--t); /*采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!*/
}
八、51单片机之蜂鸣器相关推荐
- 51单片机与蜂鸣器实现摩斯密码转换。
51单片机与蜂鸣器实现摩斯密码转换. #include <intrins.h> void delay(unsigned char ms); void delay2(int i); void ...
- 用51单片机驱动蜂鸣器
用51单片机驱动蜂鸣器 #include<reg51.h>//头文件 sbit BEEP=P1^5;//位定义P1的第五个端口为蜂鸣器 void delay() //延时函数 {unsig ...
- 51单片机 AT24C04+蜂鸣器+Proteus仿真
51单片机 AT24C02+蜂鸣器+Proteus仿真 Proteus仿真截图 由于是音频效果,只能以截图展示基本电路 实例代码 #include <reg52.h> #include & ...
- 51单片机控制蜂鸣器发SOS国际求救信号声音实验
说明:本文是51单片机控制蜂鸣器发声实验的高级版,和上个实验差不多,上个实验是控制蜂鸣器发声,本实验可以理解为控制蜂鸣器间断发出不同长度的声音,本文同样重在夯实基础,如果是大神,请自觉飘过. 好了我们 ...
- (十)51单片机——利用蜂鸣器播放《孤勇者》(附成果展示)
目录 硬件部分 蜂鸣器介绍 驱动电路 ULN2003 乐理部分 音符 音符与频率对照 代码部分 运行结果 随着最近孤勇者成为小朋友们的接头暗号之后,于是产生了利用单片机去播放孤勇者的想法,接下来我们来 ...
- 51单片机之蜂鸣器弹钢琴
目录 简介 钢琴音频对照表 仿真测试 仿真电路图 代码 简介 在学习51单片机的过程中无意发现了蜂鸣器调节不同频率居然可以产生不同的声音!!!!! 具体改的是如下这个地方: 于是我突发奇想是不是我能用 ...
- linux串口蜂鸣器报警电路,基于51单片机的蜂鸣器鸣叫震动主从机同步报警设计-BELL--(电路图+程序源码)...
https://v.youku.com/v_show/id_XNDc2MzA2NjQzNg==.html?spm=a2hzp.8253869.0.0 2017-525.51蜂鸣器鸣叫震动主从机同步报警 ...
- 基于51单片机的蜂鸣器音乐,李宗盛林忆莲《为你我受冷风吹》
看到最近反馈还挺好的就多发点存货,所用板材51单片机开发板(普中科技),个人还是很喜欢李宗盛的音乐的,于是就有了今天这期为你我受冷风吹的蜂鸣器版(请使用无源蜂鸣器) 下面是主程序,这套模板也可以用于其 ...
- 51单片机驱动蜂鸣器发声教程(扫盲)
51单片机 蜂鸣器 蜂鸣器发声原理是电流通过电磁线圈,使电磁线圈产生磁场来驱动振动膜发声的,因此需要一定的电流才能驱动它,单片机IO引脚输出的电流较小,单片机输出的TTL电平基本上驱动不了蜂鸣器,因此 ...
最新文章
- 【中级软考】MTBF是什么?(平均故障间隔时间,Mean Time Between Failure,是衡量一个产品的可靠性指标,单位为小时)
- 吉林大学c语言考试题库,吉林大学C语言题库.docx
- [2013.8.29]对于多线程编程的几点个人见解
- GRE over IPSec 隧道配置案例
- xml中加html源码,从xml获取数据以插入html标签,但在源代码中未看到
- 7-4 计算职工工资 (15 分)
- Android--建立能与访问者进行相互通信的本地服务
- pytorch cpu版本安装_小白学pytorch 01-安装C++/Python版本pytorch
- 群晖nas存储系统原理_为群晖 NAS 加上 SSD 缓存,享受高速带来的酸爽吧!
- 怎样在html里加入cms的标签,动易Cms:如何在自定义字段中插入html代码和标签-动易Cms教程...
- python简单代码解决生活小问题①
- 如何使用Blender制作360度全景图和全景视频?
- 【Qt开发】QThread中的互斥、读写锁、信号量、条件变量
- tomcat启动后无法访问到8080页面的原因
- perf 性能分析实例——使用perf优化cache利用率
- SQL Server2012在程序开发中实用的一些新特性
- 【遗传规划/计算智能】 彻底学会 DEAP 框架,从零搭建 GP
- XML超详细(有案例)
- 《Arduino开发实战指南:LabVIEW卷》6.3 基于Arduino的简易示波器
- cloudera manager整体介绍
热门文章
- 电脑黑屏只有鼠标箭头,任务管理器打不开,F8什么的都不管用
- 使用systemtap追踪网络活动
- Python 发送hotmail 邮件
- Mockito一个用于Java开发的伟大的模拟框架
- Ubuntu 下安装 SVN 服务端
- java字符串转数组遍历,深入分析
- [已完结]我在学校举办软件安全讲座提纲
- Vue实现集成使用第三方Animate.css动画库详细教程(解决鼠标移入移出闪烁问题)
- kali安装python gui_黄聪:史上最详细的kali安装教程没有之一
- 华为服务器网卡驱动安装文件夹,服务器网卡驱动安装