51单片机(十一)蜂鸣器

news2024/12/23 11:46:21

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍学习蜂鸣器的相关知识,包括蜂鸣器基础知识介绍、本节目标等;并利用两个小实验来写程序进行练习,分别是蜂鸣器播放提示音以及蜂鸣器播放音乐,最后附上相关代码。

文章目录

  • 一、蜂鸣器和本节目标
    • 1.1 蜂鸣器基础知识
    • 1.2 本节目标
  • 二、蜂鸣器播放提示音
  • 三、蜂鸣器播放音乐

一、蜂鸣器和本节目标

1.1 蜂鸣器基础知识

蜂鸣器介绍

在这里插入图片描述

驱动电路

在这里插入图片描述

驱动电路有三极管驱动和集成电路驱动;在三极管驱动中又分为NPN型三极管和PNP型三极管;NPN型三极管是高电平导通,即左边电阻那根管给高电平1时,右边蜂鸣器导通;反之,在PNP型三极管是低电平导通,即即左边电阻那根管给低电平0时,右边蜂鸣器导通;

蜂鸣器的电路图如下图所示:

在这里插入图片描述

蜂鸣器的BZ口是接在步进电机上的,如下图

在这里插入图片描述

下面介绍下ULN2003D(达林顿管)的相关知识:

在这里插入图片描述

ULN2003D达林顿管能够增强驱动能力,一般用于步进电机的驱动;其逻辑框图如下图所示

在这里插入图片描述
⑨COM是其公共端;左边①到⑧是七个非门,即输入0则输出1,输入1则输出0; 我们的蜂鸣器是如下图接在上面的:

在这里插入图片描述

所以想使蜂鸣器响,则需要给⑦输入1,则经过非门后,输出到⑩的就是0;这一端是低电平,而蜂鸣器的另一端是正极高电压,所以蜂鸣器就能响了。

在这里插入图片描述
所以总结一下,根据以上的分析,以及上图可知,只要控制P15口,输入高电平1,则OUT5就会输出低电平0;蜂鸣器就能响起来;

关于乐理部分就不想详细学习了,直接参考视频:https://www.bilibili.com/video/BV1Mb411e7re?p=25&vd_source=e2638d12685eef84cda913d9d67be0a9第27分钟后面

1.2 本节目标

目标1:蜂鸣器播放提示音
现象是当按下独立按键后,蜂鸣器给到短暂的回应提示音,也就是给我们一个按键的反馈,并在数码管上显示对应的键码值,如下图:
在这里插入图片描述

目标2:蜂鸣器播放音乐

用蜂鸣器播放固定的音乐,比如天空之城。

二、蜂鸣器播放提示音

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\11-1 蜂鸣器播放提示音
具体代码:

#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Buzzer.h"

unsigned char KeyNum;

void main()
{
	Nixie(1,0);
	while(1)
	{
		KeyNum=Key();
		if(KeyNum)
		{
			Buzzer_Time(100);
			Nixie(1,KeyNum);
		}
	}
}

Nixie.c的内容:
主要负责数码管显示

#include <REGX52.H>
#include "Delay.h"

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

/**
  * @brief  数码管显示
  * @param  Location 要显示的位置,范围:1~8
  * @param  Number 要显示的数字,范围:段码表索引范围
  * @retval 无
  */
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P2_4=1;P2_3=1;P2_2=1;break;
		case 2:P2_4=1;P2_3=1;P2_2=0;break;
		case 3:P2_4=1;P2_3=0;P2_2=1;break;
		case 4:P2_4=1;P2_3=0;P2_2=0;break;
		case 5:P2_4=0;P2_3=1;P2_2=1;break;
		case 6:P2_4=0;P2_3=1;P2_2=0;break;
		case 7:P2_4=0;P2_3=0;P2_2=1;break;
		case 8:P2_4=0;P2_3=0;P2_2=0;break;
	}
	P0=NixieTable[Number];	//段码输出
//	Delay(1);				//显示一段时间
//	P0=0x00;				//段码清0,消影
}

Buzzer.c的内容(主要负责蜂鸣器发声):

#include <REGX52.H>
#include <INTRINS.H>

//蜂鸣器端口:
sbit Buzzer=P1^5;

/**
  * @brief  蜂鸣器私有延时函数,延时500us
  * @param  无
  * @retval 无
  */
void Buzzer_Delay500us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	i = 247;
	while (--i);
}

/**
  * @brief  蜂鸣器发声
  * @param  ms 发声的时长,范围:0~32767
  * @retval 无
  */
void Buzzer_Time(unsigned int ms)
{
	unsigned int i;
	for(i=0;i<ms*2;i++)
	{
		Buzzer=!Buzzer;
		Buzzer_Delay500us();
	}
}

三、蜂鸣器播放音乐

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\11-2 蜂鸣器播放音乐
具体代码:

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"

//蜂鸣器端口定义
sbit Buzzer=P1^5;

//播放速度,值为四分音符的时长(ms)
#define SPEED	500

//音符与索引对应表,P:休止符,L:低音,M:中音,H:高音,下划线:升半音符号#
#define P	0
#define L1	1
#define L1_	2
#define L2	3
#define L2_	4
#define L3	5
#define L4	6
#define L4_	7
#define L5	8
#define L5_	9
#define L6	10
#define L6_	11
#define L7	12
#define M1	13
#define M1_	14
#define M2	15
#define M2_	16
#define M3	17
#define M4	18
#define M4_	19
#define M5	20
#define M5_	21
#define M6	22
#define M6_	23
#define M7	24
#define H1	25
#define H1_	26
#define H2	27
#define H2_	28
#define H3	29
#define H4	30
#define H4_	31
#define H5	32
#define H5_	33
#define H6	34
#define H6_	35
#define H7	36

//索引与频率对照表
unsigned int FreqTable[]={
	0,
	63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,
	64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,
	65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283,
};

//乐谱
unsigned char code Music[]={
	//音符,时值,
	
	//1
	P,	4,
	P,	4,
	P,	4,
	M6,	2,
	M7,	2,
	
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	M7,	4+4+4,
	M3,	2,
	M3,	2,
	
	//2
	M6,	4+2,
	M5,	2,
	M6, 4,
	H1,	4,
	
	M5,	4+4+4,
	M3,	4,
	
	M4,	4+2,
	M3,	2,
	M4,	4,
	H1,	4,
	
	//3
	M3,	4+4,
	P,	2,
	H1,	2,
	H1,	2,
	H1,	2,
	
	M7,	4+2,
	M4_,2,
	M4_,4,
	M7,	4,
	
	M7,	8,
	P,	4,
	M6,	2,
	M7,	2,
	
	//4
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	M7,	4+4+4,
	M3,	2,
	M3,	2,
	
	M6,	4+2,
	M5,	2,
	M6, 4,
	H1,	4,
	
	//5
	M5,	4+4+4,
	M2,	2,
	M3,	2,
	
	M4,	4,
	H1,	2,
	M7,	2+2,
	H1,	2+4,
	
	H2,	2,
	H2,	2,
	H3,	2,
	H1,	2+4+4,
	
	//6
	H1,	2,
	M7,	2,
	M6,	2,
	M6,	2,
	M7,	4,
	M5_,4,
	
	
	M6,	4+4+4,
	H1,	2,
	H2,	2,
	
	H3,	4+2,
	H2,	2,
	H3,	4,
	H5,	4,
	
	//7
	H2,	4+4+4,
	M5,	2,
	M5,	2,
	
	H1,	4+2,
	M7,	2,
	H1,	4,
	H3,	4,
	
	H3,	4+4+4+4,
	
	//8
	M6,	2,
	M7,	2,
	H1,	4,
	M7,	4,
	H2,	2,
	H2,	2,
	
	H1,	4+2,
	M5,	2+4+4,
	
	H4,	4,
	H3,	4,
	H3,	4,
	H1,	4,
	
	//9
	H3,	4+4+4,
	H3,	4,
	
	H6,	4+4,
	H5,	4,
	H5,	4,
	
	H3,	2,
	H2,	2,
	H1,	4+4,
	P,	2,
	H1,	2,
	
	//10
	H2,	4,
	H1,	2,
	H2,	2,
	H2,	4,
	H5,	4,
	
	H3,	4+4+4,
	H3,	4,
	
	H6,	4+4,
	H5,	4+4,
	
	//11
	H3,	2,
	H2,	2,
	H1,	4+4,
	P,	2,
	H1,	2,
	
	H2,	4,
	H1,	2,
	H2,	2+4,
	M7,	4,
	
	M6,	4+4+4,
	P,	4,
	
	0xFF	//终止标志
};

unsigned char FreqSelect,MusicSelect;

void main()
{
	Timer0Init();
	while(1)
	{
		if(Music[MusicSelect]!=0xFF)	//如果不是停止标志位
		{
			FreqSelect=Music[MusicSelect];	//选择音符对应的频率
			MusicSelect++;
			Delay(SPEED/4*Music[MusicSelect]);	//选择音符对应的时值
			MusicSelect++;
			TR0=0;
			Delay(5);	//音符间短暂停顿
			TR0=1;
		}
		else	//如果是停止标志位
		{
			TR0=0;
			while(1);
		}
	}
}

void Timer0_Routine() interrupt 1
{
	if(FreqTable[FreqSelect])	//如果不是休止符
	{
		/*取对应频率值的重装载值到定时器*/
		TL0 = FreqTable[FreqSelect]%256;		//设置定时初值
		TH0 = FreqTable[FreqSelect]/256;		//设置定时初值
		Buzzer=!Buzzer;	//翻转蜂鸣器IO口
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/527022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用ntpd同步服务端时间

安装ntpd 服务服务&#xff1a;yum install ntp -y ps&#xff1a;离线安装 1. 下载rpm离线包&#xff1a;autogen-libopts-5.18-5.el7.x86_64.rpm、ntp-4.2.6p5-29.el7.centos.2.x86_64.rpm、ntpdate-4.2.6p5-29.el7.centos.2.x86_64.rpm 2. 安装&#xff1a;rpm -Uvh --force…

logback按天归档日志

效果图 logback.xml文件配置 <configuration debug"false"><!--日志输出到文件--><appender name"BaseLogFile" class"ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/logback.log</file><…

计算机网络 | 五种I/O模型

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

用《文心一言》1分钟写一篇博客简直yyds

文章目录 前言文心一言是什么文心一言可以做什么文心一言写博客申请体验写在最后 前言 当今社会&#xff0c;博客已成为了许多人分享观点、知识和经验的重要平台。用文心一言写博客是将自己的思考、想法和经验以文字的形式呈现出来&#xff0c;让更多人了解自己。通过写博客&a…

SpringBoot——整合Junit测试

简单介绍&#xff1a; 其实Spring Boot的测试在之前我们就已经使用过了&#xff0c;只不过当时我们只是使用&#xff0c;并不知道他具体是怎么实现的&#xff0c;我们稍微介绍一下他在做测试的时候是怎么实现的&#xff1a; SpringBoot的测试&#xff1a; 在test文件夹下面&a…

C语言CRC-16 CCITT格式校验函数

C语言CRC-16 CCITT格式校验函数 CRC-16校验产生2个字节长度的数据校验码&#xff0c;通过计算得到的校验码和获得的校验码比较&#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现&#xff0c;参考&#xff1a; C语言标准CRC-16校验函数。 不同同应用规范通过…

国产数据采集虚拟仪器板卡结合labview的应用

众所周知&#xff0c;虚拟仪器技术是根据用户的需求由软件定义通用测试硬件功能的系统。 通过将可重复配置的硬件应用到一个虚拟仪器系统&#xff0c;工程师可以使用软件来开发算法并把它们应用到一个嵌入式芯片&#xff0c;从而把虚拟仪器软件的可配置能力扩展至硬件。 以前只…

MySQL 主从复制与分离

基本概念 什么是读写分离 读写分离&#xff0c;基本的原理是让主数据库处理事务性增、改、删操作&#xff08;INSERT、UPDATE、DELETE&#xff09;&#xff0c;而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 为什么要读写分…

详解线程与进程的区别

文章目录 一、进程&#xff08;Process&#xff09;二、线程&#xff08;Thread&#xff09;三、线程与进程的区别 一、进程&#xff08;Process&#xff09; 有关进程的介绍我们在前文已经详细介绍&#xff0c;有疑问的同学可以戳这里->操作系统与进程调度 我们知道&…

Guitar Pro8吉他谱编写软件下载安装及使用教程

音乐制作的许多程序都可以借助软件来完成&#xff0c;吉他谱的编写也是如此。今天要和大家分享的是吉他谱编写软件Guitar Pro&#xff0c;吉他谱怎么做电子版。 提到吉他谱的编写&#xff0c;有一款软件总是被第一时间想到&#xff0c;那就是Guitar Pro。 Guitar Pro是一款专业…

MHA高可用与故障切换

一、MHA的概述 1、 MHA的概念 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故…

快速幂算法 Pow(x,n)函数的实现_20230515

快速幂算法 Pow(x,n)函数的实现 前言 如果要实现x的整数n次幂(xn)&#xff0c;那么可以采用不同的策略&#xff0c;最直观和简单的算法就是利用递归或迭代把n个x连续相乘起来&#xff0c;从而获得幂乘结果。显而易见&#xff0c;此算法至少需要O(n)次运算&#xff0c;n比较大…

大语言模型友好的 API:借助集体智慧构建更好的软件架构

在过去的几个月里&#xff0c;我们一直在探索&#xff1a;如何将大语言模型用于研发效能提升&#xff1f;而随着&#xff0c;我们研究的逐步推进&#xff0c;慢慢进入一些深水区&#xff0c;诸如于&#xff1a;如何将 AI 更好地用于辅助架构设计&#xff1f;基于我们多年的架构…

​目标检测:如何有效实现YOLOv8

本文是一篇实用指南&#xff0c;介绍了如何使用命令行界面和Python来对图像、视频和实时网络摄像头中的物体进行检测。 介绍 目标检测是计算机视觉的一个子领域&#xff0c;主要涉及在图像或视频中以一定的置信度识别和定位物体。识别出的物体通常带有一个边界框&#xff0c;提…

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

如何使用chatgpt生成精美PPT提高工作效率

本教程收集于:AIGC从入门到精通教程 如何快速生成精美PPT提高工作效率 一、ChatGPT生成markdown源代码 二、Mindshow登录/注册 三、导入markd

Redis缓存架构详解

文章目录 Redis缓存结构详解前言Redis 缓存架构redis 和db数据一致性先写db还是写redis如果是先写db,再删除缓存呢&#xff1f;延迟双删 简单的缓存,并发不高,没啥流量简单的缓存,并发高,但是存在redis和 Db 双写不一致,读写并发不一致问题解决方案 1解决方案 2解决方案 3读写锁…

Linux常用命令——iconv命令

在线Linux命令查询工具 iconv 转换文件的编码方式 补充说明 iconv命令是用来转换文件的编码方式的&#xff0c;比如它可以将UTF8编码的转换成GB18030的编码&#xff0c;反过来也行。JDK中也提供了类似的工具native2ascii。Linux下的iconv开发库包括iconv_open,iconv_close,…

《程序员面试金典(第6版)》面试题 16.22. 兰顿蚂蚁(哈希映射,C++)

题目描述 一只蚂蚁坐在由白色和黑色方格构成的无限网格上。开始时&#xff0c;网格全白&#xff0c;蚂蚁面向右侧。每行走一步&#xff0c;蚂蚁执行以下操作。传送门 (1) 如果在白色方格上&#xff0c;则翻转方格的颜色&#xff0c;向右(顺时针)转 90 度&#xff0c;并向前移动…

【Vue2.0源码学习】虚拟DOM篇-Vue中的虚拟DOM

文章目录 1. 前言2. 虚拟DOM简介3. Vue中的虚拟DOM3.1 VNode类3.2 VNode的类型3.2.1 注释节点3.2.2 文本节点3.2.3 克隆节点3.2.4 元素节点3.2.5 组件节点3.2.6 函数式组件节点3.2.7 小结 3.3 VNode的作用 4. 总结 1. 前言 虚拟DOM&#xff0c;这个名词作为当下的前端开发人员…