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.pswp.cn/diannao/44725.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/44725.shtml

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

相关文章

LLaMA-Factory:开源的低代码大模型训练框架

LLaMA-Factory 是一个由零隙智能&#xff08;SeamLessAI&#xff09;开源的低代码大模型训练框架&#xff0c;它集成了业界最广泛使用的微调方法和优化技术&#xff0c;并支持众多开源模型的微调和二次训练。 一、功能特点 支持多种开源模型&#xff1a;LLaMA-Factory支持包括…

辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting

辐射神经场算法——Instant-NGP / Mipi-NeRF 360 / 3D Gaussian Splatting 1. Instant-NGP1. MultiResolution Hash Encoding1.2 Accelerated Ray Marching1.3 实验结果 2. Mip-NeRF 3602.1 场景参数化2.2 在线蒸馏2.3 失真正则化2.4 实验结果 3. 3D Gaussian Splatting3.1 Dif…

krpano开启日志公能

<krpano version"1.21" title"博物馆" debugmode"true" > 之后鼠标右键菜单栏最后一行 点击&#xff08;开启后会发生变化&#xff09;。

汽车预约维修小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;技师管理&#xff0c;技师信息管理&#xff0c;用户预约管理&#xff0c;取消预约管理&#xff0c;订单信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;技师信息&a…

新开发的软件老被系统拦截有什么办法解决吗?

一套新开发的软件要想在windows操作系统畅通无阻&#xff0c;那就需要使用代码签名证书&#xff0c;只要是对软件进行实名从而证明软件发布者身份&#xff0c;确保该软件是一个合法有效的主体开发的&#xff0c;也是让这个软件开发者承担相应的责任。 特别主要如果要获得即时性…

【深度学习入门篇 ③】PyTorch的数据加载

【&#x1f34a; 易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a; 】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创…

【漏洞复现】宏景HCM-LoadOtherTreeServlet SQL注入

声明&#xff1a;本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动&#xff0c;将与本文档的作者或发布者无关。 一、漏洞描述 宏景HCM人力资源信息管理系统是一个全面的人力资源管理软件&#xff0c;它覆盖了人力资源管理的各个模块…

报错:python扩展中的调试器不再支持小于3.7的python版本(debugpy)

报错&#xff1a;python扩展中的调试器不再支持小于3.7的python版本 原因1&#xff1a; debugpy的版本问题原因2 原因1&#xff1a; debugpy的版本问题 是debugpy和你vscode安装的python解释器不匹配&#xff0c;根据你使用的python解释器的版本重新安装一个debugpy。 原因2 …

华为官方出品:《应用现代化实践指南》电子书,可免费下载

本期云享书库为各位开发者带来了应用现代化方面的技术内容。 在数字化时代&#xff0c;企业面临着前所未有的机遇与挑战。随着技术的飞速发展&#xff0c;特别是云计算、大数据、人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的兴起&#xff0c;正…

Python爬虫速成之路(1):获取网页源代码

hello hello~ &#xff0c;这里是绝命Coding——老白~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#xff1a;绝命Coding-CSDN博客 &a…

C#面:简述什么是中间件(Middleware)?

中间件是组装到应⽤程序管道中以处理请求和响应的软件。 每个组件&#xff1a; 选择是否将请求传递给管道中的下⼀个组件。 可以在调⽤管道中的下⼀个组件之前和之后执⾏⼯作。 请求委托&#xff08;Request delegates&#xff09;⽤于构建请求管道&#xff0c;处理每个HTTP请…

Threadlocal使用获取最后更新人信息

Threadlocal 的作用范围是一个线程&#xff0c;tomcat启动默认开启一个线程 首先点击登录&#xff0c;登录方法会返回token 拿到token后放在请求头中发送商品的插入请求&#xff0c;在插入是设置拿到token中的nickName&#xff08;花名&#xff09;放入&#xff08;lastUpdate…

windows系统长时间不用,无法唤醒

问题背景 在我们使用windows系统的时候&#xff0c;有这样一种情况&#xff0c;就是电脑长时间不不操作&#xff0c;就会“睡死”过去。此时再用鼠标键盘都无法将其唤醒。没办法只能长按电源键强制关机&#xff0c;再重启。那么该如何解决这种问题呢&#xff1f; 原因分析 系…

PLSQL Day7

--9.用户键盘输入5个数字&#xff0c;将数字按从小到大的顺序存入集合中&#xff1a;declare declare type num_type is table of number; n_tab num_type; temp_n number ; begin n_tab: num_type(&n1,&n2,&n3,&n4,&n5); for i in 1..n_tab.co…

高可用hadoop分布式节点的扩容

解决方案 修改hdfs-site.xml 文件 原xml文件 <?xml version"1.0" encoding"UTF-8"?> <?xml-stylesheet type"text/xsl" href"configuration.xsl"?> <!--Licensed under the Apache License, Version 2.0 (th…

编程参考 - 在C++类成员函数声明中使用const关键字

在 C 中&#xff0c;可以在类成员函数声明中使用 const 关键字来表示函数不修改对象的状态。这就是所谓的 "const 成员函数"。将成员函数声明为 const 时&#xff0c;意味着该函数承诺不更改对象的任何成员变量&#xff08;标记为可变的变量除外&#xff09;。 In C,…

福克斯波罗 FOXBORO FBM201模块 控制器 处理器

福克斯波罗 FOXBORO FBM201 控制器具有紧凑和坚固的设计&#xff0c;使其非常适合在恶劣的工业环境中使用。它可以承受极端的温度&#xff0c;湿度和振动&#xff0c;并且以最少的维护来实现持久的性能。 控制器配备了先进的控制算法&#xff0c;使其能够快速准确地响应过程条…

Python: 从 2.7 升级到 3,我比 vue 慢了一点点

小破站搜索云前端&#xff0c;查看视频版 2024 年 7 月 7 日&#xff0c;据一位长期的Python观察者爆料&#xff0c;Fedora 41 系统最终将停止支持 Python 2.7。这是Python 2系列的最后一个版本&#xff0c;Python 2.7在Fedora Linux 41中将被退役且不再替代。除了PyPy之外&…

利用【Python】【线性规划】优化工厂生产:实现智能资源配置与利润最大化的现代解决方案

目录 1. 问题背景和描述 1.1 问题背景 1.2 问题描述 2. 数学模型的建立 2.1决策变量 2.2 目标函数 2.3 约束条件 2.4 数学模型总结 3. 使用Python解决线性规划问题 3.1 导入必要的库 3.2 定义目标函数系数 3.3 定义不等式约束矩阵和向量 3.4 定义变量的边界 非负…

浅谈 Webpack5 模块联邦

概念 Webpack 模块联邦是一种先进的代码共享技术&#xff0c;它允许在多个独立构建的 Web 应用程序之间共享代码&#xff0c;而无需将这些代码提前发布到 npm 仓库或其他中央存储。 这项技术特别适用于微前端架构&#xff0c;因为它能让各个前端团队独立开发、部署自己的应用…