蜂鸣器

蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。

蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器:

有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定;

无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音;

蜂鸣器的具体原理可以自行查阅资料,总之,要知道的是,蜂鸣器内部有两块金属片,当加上正负电极后,就会吸附在一起而产生碰撞,发出声音。当蜂鸣器的其中一个引脚电极固定,给另外一个引脚加上正负相间的电流时,就会产生一定频率的振动,从而发出不同的声音。

声音的音调可以由频率来控制,频率越高,声音越尖锐。

声音大小由硬件决定,无法写代码去控制声音大小。

查看原理图

这里的三极管是用来放大单片机引脚电流的,已达到能够驱动蜂鸣器的程度。

这里将J8接到P2.0接口,并提供一定频率的信号。

代码实现

需求:发出滴滴滴的声音,频率为500Hz,那么时钟周期为2ms,那么每隔1ms改变电平状态。

我先试了下,一直给高电平不知道行不行:P20 = 1;没听到声音。

频率为500Hz再试下:

/***@file    buzzer.c*@author  Timi*@date    2022.07.23*/
#include <reg51.h>sbit P20 = P2^0;#define AIM_COUNTER(time) (65536 - (time) * 1000 / 1)//函数入口
void main(void)
{   TMOD = 0x01;TL0 = (AIM_COUNTER(50) % 256);TH0 = (AIM_COUNTER(50) / 256);TR0 = 1;ET0 = 1;EA = 1;while(1);
}/***@brief   让蜂鸣器响*@param[in]*@param[out] *@return*/
void EnableBuzzer() interrupt 1 using 1
{TL0 = (AIM_COUNTER(1) % 256);TH0 = (AIM_COUNTER(1) / 256);P20 = ~P20;
}

这种情况,蜂鸣器一直响。但是我想要的是滴滴滴的声音。怎么调整呢?

我的思路是,先响一段时间,然后停一段时间,之后再响一段时间,再停一段时间,如果循环往复。

代码雏形如下:

/***@file    buzzer.c*@author  Timi*@date    2022.07.23*/
#include <reg51.h>#define uchar unsigned char
#define AIM_COUNTER(time) (65536 - (time) * 1000 / 1)sbit P20 = P2^0;
static uchar count = 0;void Delay500ms(void);//函数入口
void main(void)
{   TMOD = 0x01;TL0 = (AIM_COUNTER(50) % 256);TH0 = (AIM_COUNTER(50) / 256);TR0 = 1;ET0 = 1;EA = 1;while(1);
}/***@brief   让蜂鸣器响*@param[in]*@param[out] *@return*/
void EnableBuzzer(void) interrupt 1 using 1
{TL0 = (AIM_COUNTER(1) % 256);TH0 = (AIM_COUNTER(1) / 256);P20 = ~P20;         //以上三段代码实现500Hz频率的振动if(count++ == 100)  //每振动100次之后暂定500ms{P20 = 0;Delay500ms();count = 0;}
}void Delay500ms(void)   //误差 0us
{uchar a,b,c;for(c = 205; c > 0; c--)for(b = 116; b > 0; b--)for(a = 9; a > 0; a--);
}

虽然能够实现功能,但是还是用了for循环Delay,暂停的时间不精准。

我是想要用定时器,但是,在定时器中使用定时器,不就嵌套循环了吗?比较复杂,且容易出错。所以,要怎么解决这个问题呢?

解决代码如下:

/***@file    buzzer.c*@author  Timi*@date    2022.07.23*/
#include <reg51.h>#define u32 unsigned int
#define AIM_COUNTER(time) (65536 - (time) * 1000 / 1)sbit P20 = P2^0;static u32 count = 1;//函数入口
void main(void)
{   TMOD = 0x01;TL0 = (AIM_COUNTER(50) % 256);TH0 = (AIM_COUNTER(50) / 256);TR0 = 1;ET0 = 1;EA = 1;while(1);
}/***@brief   让蜂鸣器响*@param[in]*@param[out] *@return*/
void EnableBuzzer(void) interrupt 1 using 1
{TL0 = (AIM_COUNTER(1) % 256); //500Hz的频率TH0 = (AIM_COUNTER(1) / 256);if(count >= 1 && count <=250){P20 = ~P20;}else if(count >= 251 && count <= 1000)  //可以通过这两处的数字占比来控制响多久,停多久{//什么也不做;}else{count = 0;}count++;
}

播放音乐

51单片机外设篇:蜂鸣器相关推荐

  1. 51单片机外设篇:点阵式LCD

    什么是LCD LCD(Liquid Crystal Display)俗称液晶. 液晶是一种材料,液晶这种材料具有一种特点:可以在电信号的驱动下液晶分子进行旋转,旋转时会影响透光性,因此我们可以在整个液 ...

  2. 51单片机外设篇:数码管

    数码管简介 LED数码管:数码管是一种简单.廉价的显示器,是由多个发光二极管封装在一起组成"8"字型的器件.比如红绿灯. 单个数码管: 多个数码管: 这些引脚由对应的寄存器控制着, ...

  3. 51单片机蜂鸣器演奏《小苹果》C语言程序,51单片机C语言蜂鸣器发声生日快乐播放程序...

    <51单片机C语言蜂鸣器发声生日快乐播放程序>由会员分享,可在线阅读,更多相关<51单片机C语言蜂鸣器发声生日快乐播放程序(4页珍藏版)>请在人人文库网上搜索. 1.按键发音/ ...

  4. 学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)

    这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘.非编码键盘的扫描方式.独立键盘.矩阵键盘.键盘消抖等)包含原理图.代码等 (一)基础补充 1.键盘的任务 2.键盘的识别 3.如何消除按键的抖动 ...

  5. 51单片机学习笔记——蜂鸣器

    蜂鸣器 介绍 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音.报警音等提示信号 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续 ...

  6. 【51单片机】STC89C52蜂鸣器实验,含c代码(4)

    1.参考教程: 清翔51单片机教程 2.基本原理 : 若vcc是5v,p23低电平,使得R10流过大于1mA的电流,则CE导通,蜂鸣器响.P23为高电频反之. 3.C程序代码 : #include & ...

  7. 51单片机外设系列:LCD1602 的详细编程

    前言,LCD1602是一个比较常用的单片机显示外设,下面我们从它的显示原理,来分析用51单片机编程的思路.另外结尾还提供了完成的程序代码参考. 一.LCD1602的外观.结构和基本参数 引脚功能解析: ...

  8. 51单片机定时器中断怎么用-------51单片机基础篇

    首先,什么时定时器,简单来说可以比喻为一个闹钟,当你把他打开以后,他就会每秒动一下,+1,+1,+1,+1,如果你设置了某一个时间点闹钟会向以后,那么当闹钟的时间点+1,+1,+1,+到了你设置的时间 ...

  9. 51单片机存储篇:EEPROM(I2C)

    先认识I2C通信 基本概述  IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980 ...

最新文章

  1. 推荐2020年度最佳的23个的机器学习项目(附源代码)
  2. java no cache_java – 在我的部署中设置Cache-Control no-cache,no-store是什么?
  3. 深入理解Webpack核心模块Tapable钩子[异步版]
  4. 在很多很多事情都要的情况下,最重要的东西是什么?
  5. 【Java类加载机制】深入加载器
  6. Fusion组件库是如何支持多语言能力的
  7. android studio gradle home,Android Studio3.0 Gradle 4.1配置
  8. 6个案例手把手教你用Python和OpenCV进行图像处理
  9. python进行气象数据分析_使用机器学习进行气象数据分析
  10. 【Linux】Shell 时间运算以及时间差计算方法!
  11. 21个实用便利的PHP代码
  12. JavaWeb汽车商城项目
  13. MARIADB数据库服务器
  14. 【宽创案例】青海牦牛文化馆:走进牦牛之都!
  15. m被3整除的c语言表达式,C语言编写函数fun,实现从整数m到n,能被3整除
  16. 【数学建模】模糊综合评价
  17. bim计算机工程师考试,bim工程师考试报名条件是什么?bim工程师考试怎么报名?...
  18. 【Moasure魔尺】一款来自未来科技的测量设备
  19. 编译OpenArkCompiler出现进程被kil
  20. mysql 年龄段分组_SQL语句查询年龄分段分组查询

热门文章

  1. C#之提取字符串中数字(考虑小数)
  2. 可信安全-1-安全可信网络安全观
  3. 关于使用freemarker制作word模板经历的一些问题
  4. 华为鸿蒙系统正式发布!
  5. 基于python的pyshp库读取.shp数据来获取中国城市边界的经纬度数据,并生成hdf文件
  6. 数据可视化之美——《纽约时报》的一天
  7. 主流嵌入式操作系统有哪些
  8. 计算机论文文献综述 游戏,【2018最新】游戏毕业设计参考文献-word范文 (4页)
  9. 报账系统总结(1):路由分配/数据库/主页/注册/登陆
  10. fernflower反编译jar包用法