八、51单片机之蜂鸣器

2023-05-16

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 = 0xCE
	TH0 = 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 = 0xCE
	TH0 = 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--); 各位可编译一下看看汇编结果就知道了!*/    
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

八、51单片机之蜂鸣器 的相关文章

随机推荐

  • C++基础之基础

    C 43 43 xff08 容纳了好几种编程范式 xff09 xff1a 面向对象编程 泛型编程 过程化编程 面向对象编程 xff1a 其本质是以建立模型体现出来的抽象思维过程和面向对象的方法 抽象 继承 多态 xff1a 抽象性是指将具有
  • 这五大MySQL在线课程,最适合初学者的你!

    全文共3214字 xff0c 预计学习时长7分钟 图片来源 xff1a pexels com 64 pixabay 过去几年 xff0c 有句话越来越流行 xff1a 人人必须学习如何编码 这值得鼓励 在当今以信息和技术为中心的世界里 xf
  • 课程作业(单链表C++实现)

    单链表的操作C 43 43 实现 include lt iostream gt using namespace std 使用命名空间 template lt typename dataType gt 定义一个数据类型模板 class lin
  • 课程作业(二叉查找树)

    mainTest cpp include lt iostream gt include 34 binarySearchTree h 34 using namespace std int main cout lt lt 34 请按前序输入一棵
  • C++程序设计实践指导——第一章 简单编程 (2)

    第一章 简单编程 xff08 2 xff09 1 9 统计与替换字符串中的关键字 建立一个类WordNum xff0c 统计一个英文字符串中的英文单词个数 字符串中的各英文单i司以一个或多个空格分隔 如字符串 34 I am a stude
  • STL+Python+图像处理-学习资源

    1 C 43 43 STL学习网站 CPlusPlus com CppReference com gcc gnu org 2 Python学习书籍及网站 Python Crash Course Learn Python the Hard W
  • STL----------C++Primer(笔记)

    1 string string word cin gt gt word getline cin word 关系操作符 lt lt 61 gt gt 61 include lt cctype gt 头文件 string s 61 34 Hel
  • 侯捷-STL与泛型编程(GP)笔记

    1 stl体系结构基础介绍 分配器 xff08 allocator xff09 xff1a 主管分配内存 适配器 xff08 adaptor xff09 xff1a 进行一个转换 xff0c 与另一个对象绑定 include lt iost
  • 课程作业——数据结构与算法C++(1)

    课程作业6 xff08 归并排序 冒泡排序 插入排序 选择排序 xff09 归并排序 冒泡排序 插入排序 选择排序 主程序 include lt iostream gt include lt vector gt using std vect
  • C++程序设计实践指导——第二章 样例讲解

    复数计算器 include lt iostream gt include lt cmath gt include lt string gt include lt fstream gt include lt ctime gt using na
  • 步进电机控制与LCD显示L297与L298

    步进电机控制与LCD显示L297与L298 上次介绍了PWM和L298结合的电机调速 xff01 接下来介绍L297与L298结合的例子 xff01 PWM电机调速 下面是L297的简介 xff1a L297是步进电机专用控制器 xff0c
  • 变分自编码器(一):原来是这么一回事

    https kexue fm archives 5253 过去虽然没有细看 xff0c 但印象里一直觉得变分自编码器 xff08 Variational Auto Encoder xff0c VAE xff09 是个好东西 于是趁着最近看概
  • Linux 安装npm

    1 root 登录linux 2 cd usr loacl node 没有目录就自己创建一个 3 wget https npm taobao org mirrors node v4 4 7 node v4 4 7 linux x64 tar
  • DE1-SOC开发笔记

    verilog FPGA 采用verilog开发语言 xff0c 使用时序和组合逻辑 进行行为 xff0c 数据流 xff0c 结构建模 RTL级编程 xff0c 在实际板卡上面验证逻辑的正确性 sopc xff1a 软硬件结合的开发方式
  • 关于立创EDA使用的几点心得

    对于立创EDA 与AD仅为小白 xff0c 仅布过简单的双层板 xff0c 以下仅记录自己的几点心得 1 如果想要在立创商城 xff0c 嘉立创实现打板贴片一体化 xff0c 采用的普遍的两种方法 xff1a 立创EDA xff0c 有在线
  • 《当下即是生活》季羡林——读书笔记

    目录 书籍简介 经典摘录 三思而行 满招损 xff0c 谦受益 牵就与适应 睁一只眼 闭一只眼 论压力 论恐惧 难得糊涂 春色满寰中 槐花 书籍简介 作者季羡林 本书精选季羡林关于人生活法的散文 xff0c 阐述一个人怎样活在当下 xff0
  • Python装饰器

    Python的装饰器 decorator 可以说是Python的一个神器 xff0c 它可以在不改变一个函数代码和调用方式的情况下给函数添加新的功能 Python的装饰器同时也是Python学习从入门到精通过程中必需要熟练掌握的知识 小编我
  • Python学习笔记--带参数的装饰器

    带参数的装饰器 装饰器的副作用柯里化functools带参数的装饰器多参数小结 装饰器的副作用 def fn 39 39 39 this is fn 39 39 39 help fn 结果 xff1a Help on function fn
  • 六、51单片机之定时器/计数器_理论

    1 什么是定时器 计数器 定时器就是单片机设定一个时间间隔 xff0c 时间间隔到后通知单片机 例如设置100ms的定时器 xff0c 100ms后定时器通知单片机时间到了 1 定时器是单片机的一种内部外设 以前的单片机只有CPU 也就是只
  • 八、51单片机之蜂鸣器

    1 蜂鸣器的原理 蜂鸣器分为有源蜂鸣器和无源蜂鸣器 这里的 源 不是指电源 xff0c 而是指震荡源 1 1 无源蜂鸣器 1 早期蜂鸣器都是无源的 2 内部没有震荡电路 xff0c 无源蜂鸣器比有源蜂鸣器更便宜 3 无源蜂鸣器内部没有震荡源