51单片机:使用蜂鸣器演奏《盗将行》(附代码详解)

一、功能实现:

二、代码内容:

主函数.c

#include <REGX52.H>
#include "Delay.h"
#include "Timer0.h"sbit Buzzer=P2^5;#define SPEED 500
//原先默认一个四分音符延迟500ms#define P 0      //休止
#define L1 1     //低音1
#define L1_ 2    //低音1升半音
#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 36unsigned int FreqTable[]={0,//第零位是休止符63628,63731,63835,63928,64021,64103,64185,64260,64331,64400,64463,64528,//12低音64580,64633,64684,64732,64777,64820,64860,64898,64934,64968,65000,65030,//12中音65058,65085,65110,65134,65157,65178,65198,65217,65235,65252,65268,65283 //12高音};//Music[]数组中每行第一个为音调,第二个为延续时间	
//以16分音符为1,8分音符为2,4分音符为4,2分音符为8,全音符为16//RAM只有512字节,不够存储
//ROM有8K(FLASH),使用ROM,Music前要加code,但是此时性质变为只可读取,不可修改unsigned char code Music[]=
{	//音符,时值,//line1M1,2+1,M1,1,L6,2,M1,2,M3,2,M2,2+2,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M1,2,M2,2,M3,2,L5,2+2+1,M5,1,//Line2L5,2,L5,2,L3,2,M5,2,M3,4,M3,2,M2,2,L6,4,M1,2,M3,2,M2,2+4,M1,2,M3,2,M3,2,L5,2,L7,2,L6,4,M1,2,L7,2,L6,2,L6,2,M3,2,M3,2,M1,2,M2,2,P,2,M1,2,//Line3M3,2,M3,2,M2,2,M3,2,L6,4+4,P,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M3,2,M2,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M3,2,M2,4,P,2,M3,2,//Line4M5,2,M5,2,M5,2,M1,2,M2,4,M3,2,M5,2,M6,4,M3,2,M6,2,M5,4,P,2,M5,2,M6,2,M5,2,M5,2,M6,2,M3,4,M3,2,M2,2,M1,2,L6,2,M1,2,M2,2,M3,2,L5,2,L5,2,L3,2,//Line5L5,4,L5,2,L7,2,L6,4+4,0xFF	//终止标志
};unsigned char FreqSelect,MusicSelect=0;void main()
{Timer0_Init();while(1){		if(Music[MusicSelect]!=0xFF){FreqSelect=Music[MusicSelect];MusicSelect++;//原先默认一个四分音符延迟500ms,此程序由于四分音符延长时间为4部分,则一部分的延长时间为125msDelay(SPEED/4*Music[MusicSelect]);MusicSelect++;		TR0=0;//停止计时Delay(5);TR0=1;//开始计时			}else{TR0=0;while(1);}}}void Timer0_Routine() interrupt 1
{   if(FreqTable[FreqSelect]!=0){TL0 = FreqTable[FreqSelect]%256;TH0 = FreqTable[FreqSelect]/256; Buzzer=!Buzzer;		}}

定时器.c

#include <REGX52.H>
/*** @brief  定时器0初始化,1毫秒@11.0592MHz* @param  无* @param  无* @retval 无*///由软件生成的定时器计算,注意每次要重新配置参数
void Timer0_Init(void)		
{//AUXR &= 0x7F;			//(89C52因为版本老没有这个寄存器)定时器时钟12T模式TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x66;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志TR0 = 1;				//定时器0开始计时//(补上)ET0=1;//允许中断EA=1;//允许总中断PT0=0;//中断优先级为0
}/*
void Timer0_Init()//定时器+中断系统的初始化函数
{//原理图在开发手册P190//TMOD=0x01;  //0000 0001  from 开发手册P189-定时器工作模式//TMOD是不可位寻址只能整体赋值	TMOD=TMOD&0xF0;//把TMOD的低四位清零,高四位保持不变/*假设TMOD为1010 00111010 0011 & 1111 0000 = 1010 0000TMOD=TMOD&0xF低四位清零,高四位保持不变TMOD=TMOD|0x01;//把TMOD的最低位改为1,高四位保持不变1010 0000 | 0000 0001 =1010 0001最低位改为1,高四位保持不变TF0=0;   //from 开发手册P188-定时器控制-中断//TCOM是可位寻址可以对其中的每一位单独赋值,TF0就是其中一位TR0=1;  //from 开发手册P188-定时器控制-开始计数0~65535每隔一微秒计数加一总共定时时间位65535微秒如果赋初始值为64535,距离计数器计数器溢出差值1000所以计时时间为1毫秒P190原理图TH0=64535/256;TL0=64535%256;16进制存储在两个寄存器,分高低位如果以10进制为例子
123存储在两个寄存器内
123/100=1(高位)
123%100=23(低位)//下面是中断系统的初始化,是老一代51单片机,现在单片机可以向下兼容的。ET0=1;EA=1;PT0=0;}
*//*初始化后如何在主代码中使用定时器T0的功能,定时器T0的中断号为1举个例子void Timer0_Routine() interrupt 1
{   static unsigned int T0Count;//退出此程序后不刷新数据,保留数据,称为局内的静态数据TL0 = 0x66;TH0 = 0xFC; //计时器溢出默认为0,下一次中断会变成65倍的时间//将其设定为T0Count++;if(T0Count>=500){T0Count=0;}}
*/

定时器.h

#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0_Init(void);#endif

Delay.c

void Delay(unsigned int xms)	
{unsigned char data i, j;while(xms--){i = 2;j = 199;do{while (--j);} while (--i);}
}

Delay.h

#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif

                                      (创作不易,主函数在主页下载资源内)

                         【免费】51单片机:蜂鸣器播放音乐(盗将行).zip资源-CSDN文库

                                                                谢谢大家!

                                                        小白一枚,请多指教!                                                               

                                                         FROM 明月清风mls

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动态规划Ⅳ】二维数组的动态规划——最小路径和

二维数组的动态规划 最小路径和64. 最小路径和原地修改数组定义二维数组进行状态转移优化&#xff1a;用 一维数组进行状态转移相似题目&#xff1a;LCR 166. 珠宝的最高价值 120. 三角形最小路径和原地修改数组定义二维数组进行状态转移一维数组进行状态转移自底向上&#xff…

推荐一个比 Jenkins 使用更简单的项目构建和部署工具

最近发现了一个比 Jenkins 使用更简单的项目构建和部署工具&#xff0c;完全可以满足个人以及一些小企业的需求&#xff0c;分享一下。 项目介绍 Jpom 是一款 Java 开发的简单轻量的低侵入式在线构建、自动部署、日常运维、项目监控软件。 日常开发中&#xff0c;Jpom 可以解…

【R语言+Gephi】利用R语言和Gephi实现共发生网络的可视化

【R语言Gephi】利用R语言和Gephi实现共发生网络的可视化 注&#xff1a;本文仅作为自己的学习记录以备以后复习查阅 一 概述 Gephi是一款开源免费的多平台网络分析软件&#xff0c;在Windows、Linux和Mac os上均可以运行&#xff0c;像他们官网所说的&#xff0c;他们致力于…

Excel第29享:基于sum嵌套sumifs的多条件求和

1、需求描述 如下图所示&#xff0c;现要统计12.17-12.23这一周各个人员的“上班工时&#xff08;a1&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 首先&#xff0c;确定逻辑&#xff1a;“对多个条件&#xff08;日期、人员&#xff09;进行“工时”…

ONLYOFFICE 8.1版本版本桌面编辑器测评

ONLYOFFICE官网链接&#xff1a;ONLYOFFICE - 企业在线办公应用软件 | ONLYOFFICE ONLYOFFICE在线办公套件&#xff1a;在线办公套件 | ONLYOFFICE ONLYOFFICE在线PDF编辑器、阅读器和转换器&#xff1a;在线PDF查看器和转换器 | ONLYOFFICE ONLYOFFICE 8.1版本桌面编辑器是…

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构⑤ | 4.8 - 4.9

前言 第4章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于技术相关的内容&#xff0c;学习要以教材为准。本章分值预计在4-5分。 目录 4.8 云原生架构 4.8.1 发展概述 4.8.2 架构定义 4.8.3 基本原则 4.8.4 常用架构模式 4.8.5 云原生案例 4.9 本章…

【DevOps】在云原生时代的角色与重要性探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的核心特性 3、什么是DevOps…

昇思25天学习打卡营第14天|基于MindNLP的文本解码原理

基于MindNLP的文本解码原理 文本解码 文本解码是自然语言处理中的一个关键步骤,特别是在任务如机器翻译、文本摘要、自动回复生成等领域。解码过程涉及将编码器(如语言模型、翻译模型等)的输出转换为可读的文本序列。以下是一些常见的文本解码方法和原理: 1. 自回归解码:…

安装nodejs | npm报错

nodejs安装步骤: 官网&#xff1a;https://nodejs.org/en/ 在官网下载nodejs: 双击下载下来的msi安装包&#xff0c;一直点next&#xff0c;我选的安装目录是默认的: 测试是否安装成功&#xff1a; 输入cmd打开命令提示符&#xff0c;输入node -v可以看到版本&#xff0c;说…

Django项目创建的基本准备工作【4】

【 一 】软件开发模式 官话下面 人话 瀑布开发就是将什东西都定义好了在进行开发对吧 敏捷就是进行模块化一样 分批进行 规定一个时间段完成什么样的功能。 总结来说&#xff0c;瀑布开发强调在项目开始之前进行详细的计划和准备&#xff0c;并按照预定的顺序逐步进行&#x…

E. Beautiful Array(cf954div3)

题意&#xff1a;给定一个数组&#xff0c;可以先对数组进行任意排序&#xff0c;每次操作可以选择一个ai&#xff0c;将它变成aik&#xff0c; 想让这个数组变成一个美丽数组&#xff08;回文数组&#xff09;&#xff0c;求最少操作次数 分析&#xff1a; 先找出相同的数字…

使用Docker制作python项目镜像

各docker桌面版本集合&#xff1a;如果提示新版本系统不支持&#xff0c;可下载旧版本 我也分享在下面。 链接: https://pan.baidu.com/s/1HvaO2wOIE3pNE0bM7Qm3sA?pwdg7ky 提取码: g7ky –来自百度网盘超级会员v2的分享 来源参考&#xff1a;https://zhuanlan.zhihu.com/p/65…

【Linux】命令执行的判断依据:;,,||

在某些情况下&#xff0c;很多命令我想要一次输入去执行&#xff0c;而不想要分次执行时&#xff0c;该如何是好&#xff1f; 基本上有两个选择&#xff0c; 一个是通过shell脚本脚本去执行&#xff0c;一种则是通过下面的介绍来一次入多个命令。 1.cmd&#xff1a;cmd&#…

【RHCE】基于用户认证和TLS加密的HTTP服务(HTTPS)

目录 一、创建用户账号 二、TLS加密 三、配置http服务子配置文件 四、创建访问http服务的文件夹以及输入重定向到文件 五、配置Linux本地仓库以及Windows下的本地仓库 六、基础操作 七、测试 一、创建用户账号 用户认证 # 创建两个账户 [rootlocalhost ~]# htpasswd -…

前端面试39(关于git)

针对前端开发者的Git面试题可以覆盖Git的基础概念、常用命令、工作流程、团队协作、以及解决冲突等方面。以下是一些具体的Git面试 Git基础知识 什么是Git&#xff1f; Git是一个分布式版本控制系统&#xff0c;用于跟踪计算机文件的更改&#xff0c;并协调多个人共同在一个项…

C++ | Leetcode C++题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack { public:queue<int> q;/** Initialize your data structure here. */MyStack() {}/** Push element x onto stack. */void push(int x) {int n q.size();q.push(x);for (int i 0; i < n; i) {q.push(q.front());…

【雷达原理】数字波束形成(DBF)

目录 一、数字波束形成1.1 DBF原理1.2 工程应用实现方式1.2.1 预先存储权矢量1.2.2 利用DFT/FFT实现DBF 二、DBF应用2.1 通道间相干积累2.2 测量目标角度 三、MATLAB代码 一、数字波束形成 数字波束形成&#xff08;Digital Beam Forming&#xff0c;DBF) 技术&#xff0c;是针…

智驭未来:人工智能与目标检测的深度交融

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;如同一股不可阻挡的浪潮&#xff0c;正以前所未有的速度重塑着我们的世界。在众多AI应用领域中&#xff0c;目标检测以其独特的魅力和广泛的应用前景&#xff0c;成为了连接现实与智能世界的桥梁。本文旨在…

2024最新国际版抖音TikTok安装教程,免root免拔卡安卓+iOS,附全套安装工具!

我是阿星&#xff0c;今天给大家带来是2024年最新TikTok国际版抖音的下载和安装教程&#xff0c;而且还是免root免拔卡的那种&#xff0c;安卓和iOS都能用哦&#xff01;由于某些原因&#xff0c;国内用户并不能使用TikTok。今天阿星就教一下大家怎么安装TikTok。 TikTok在全球…

杜比全景声——空间音频技术

什么是杜比&#xff1f;是否是标清、高清、超清之上的更清晰的格式&#xff1f;杜比全景声 和传统多声道立体声的差别&#xff1f;杜比全景声音频的渲染方式&#xff1f;车载平台上杜比技术的应用&#xff1f; 杜比技术的起源 杜比实验室&#xff08;Dolby Laboratories&…