51单片机.之蜂鸣器振动播放歌曲

news2024/11/15 7:16:45

蜂鸣器发声是通过喇叭振动发声的,通电产生磁场,磁铁吸收,而振动。不断释放,吸收。

在这里插入图片描述
1、蜂鸣器发声,播放不同频率的声音逐渐变尖

#include<reg52.h>

sbit BUZZ = P1^6;

unsigned char T0RH=0;
unsigned char T0RL=0;
void OpenBuzz(unsigned int frequ);
void StopBuzz();

void main()
{
	unsigned int i;

	EA =1;
	TMOD = 0x01;

	while(1)
	{
		OpenBuzz(4000);
		for(i=0; i<40000; i++);
		StopBuzz();
		for(i=0; i<40000; i++);
		OpenBuzz(1000);
		for(i=0; i<40000; i++);
		StopBuzz();
		for(i=0; i<40000; i++);

	}
}

void OpenBuzz(unsigned int frequ)
{
	unsigned int reload;

	reload = 65536 - (11059200/12)/(frequ*2); 
	T0RH = (unsigned char)(reload >>8);
	T0RL = (unsigned char)reload;

	TH0 = 0xFF;
	TL0 = 0xFE;

	ET0 = 1;
	TR0 = 1;
}

void StopBuzz()
{
	ET0 = 0;
	TR0 = 0;
}

void InterruptTimer0() interrupt 1
{
	TH0 = T0RH;
	TL0 = T0RL;
	BUZZ = ~BUZZ;
}

2、蜂鸣器播放歌曲


#include <reg52.h>

sbit BUZZ = P1^6;  //蜂鸣器控制引脚

unsigned int code NoteFrequ[] = {  //中音1-7和高音1-7对应频率列表
    523,  587,  659,  698,  784,  880,  988,  //中音1-7
    1047, 1175, 1319, 1397, 1568, 1760, 1976  //高音1-7
};
unsigned int code NoteReload[] = { //中音1-7和高音1-7对应的定时器重载值
    65536 - (11059200/12) / (523*2),  //中音1
    65536 - (11059200/12) / (587*2),  //2
    65536 - (11059200/12) / (659*2),  //3
    65536 - (11059200/12) / (698*2),  //4
    65536 - (11059200/12) / (784*2),  //5
    65536 - (11059200/12) / (880*2),  //6
    65536 - (11059200/12) / (988*2),  //7
    65536 - (11059200/12) / (1047*2), //高音1
    65536 - (11059200/12) / (1175*2), //2
    65536 - (11059200/12) / (1319*2), //3
    65536 - (11059200/12) / (1397*2), //4
    65536 - (11059200/12) / (1568*2), //5
    65536 - (11059200/12) / (1760*2), //6
    65536 - (11059200/12) / (1976*2), //7
};
bit enable = 1;   //蜂鸣器发声使能标志
bit tmrflag = 0;  //定时器中断完成标志
unsigned char T0RH = 0xFF;  //T0重载值的高字节
unsigned char T0RL = 0x00;  //T0重载值的低字节

void PlayTwoTiger();

void main()
{
    unsigned int i;
    
    EA = 1;       //使能全局中断
    TMOD = 0x01;  //配置T0工作在模式1
    TH0 = T0RH;
    TL0 = T0RL;
    ET0 = 1;      //使能T0中断
    TR0 = 1;      //启动T0
    
    while (1)
    {
        PlayTwoTiger();  //播放乐曲--两支老虎
        for (i=0; i<40000; i++);  //停止一段时间
    }
}
/* 两只老虎乐曲播放函数 */
void PlayTwoTiger()
{
    unsigned char beat;   //当前节拍索引
    unsigned char note;   //当前节拍对应的音符
    unsigned int time = 0;      //当前节拍计时
    unsigned int beatTime = 0;  //当前节拍总时间
    unsigned int soundTime = 0; //当前节拍需发声时间
    //两只老虎音符表
    unsigned char code TwoTigerNote[] = {
        1,   2,   3, 1,    1,   2,   3, 1,   3, 4, 5,   3, 4, 5,
        5,6, 5,4, 3, 1,    5,6, 5,4, 3, 1,   1, 5, 1,   1, 5, 1,
    };
    //两只老虎节拍表,4表示一拍,1就是1/4拍,8就是2拍
    unsigned char code TwoTigerBeat[] = {
        4,   4,   4, 4,    4,   4,   4, 4,   4, 4, 8,   4, 4, 8,
        3,1, 3,1, 4, 4,    3,1, 3,1, 4, 4,   4, 4, 8,   4, 4, 8,
    };
    
    for (beat=0; beat<sizeof(TwoTigerNote); )  //用节拍索引作为循环变量
    {
        while (!tmrflag);  //每次定时器中断完成后,检测并处理节拍
        tmrflag = 0;
        if (time == 0)  //当前节拍播完则启动一个新节拍
        {
            note = TwoTigerNote[beat] - 1;
            T0RH = NoteReload[note] >> 8;
            T0RL = NoteReload[note];
            //计算节拍总时间,右移2位相当于除4,移位代替除法可以加快执行速度
            beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;
            //计算发声时间,为总时间的0.75,移位原理同上
            soundTime = beatTime - (beatTime >> 2);
            enable = 1;  //指示蜂鸣器开始发声
            time++;
        }
        else  //当前节拍未播完则处理当前节拍
        {
            if (time >= beatTime)  //当前持续时间到达节拍总时间时归零,
            {                      //并递增节拍索引,以准备启动新节拍
                time = 0;
                beat++;
            }
            else  //当前持续时间未达到总时间时,
            {
                time++;   //累加时间计数
                if (time == soundTime)  //到达发声时间后,指示关闭蜂鸣器,
                {                       //插入0.25*总时间的静音间隔,
                    enable = 0;         //用以区分连续的两个节拍
                }
            }
        }
    }
}
/* T0中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
    TH0 = T0RH;   //重新加载重载值
    TL0 = T0RL;
    tmrflag = 1;
    if (enable)   //使能时反转蜂鸣器控制电平
        BUZZ = ~BUZZ;
    else          //未使能时关闭蜂鸣器
        BUZZ = 1;
}

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

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

相关文章

七、性能测试

文章目录 一、常见的性能测试二、为什么要进行性能测试三、性能测试实施的流程&#xff08;一&#xff09;如何确定性能测试的需求1.关键性能指标分析2.关键业务分析 &#xff08;二&#xff09;常见的性能指标 三、性能测试定义四、性能测试关键指标&#xff08;一&#xff09…

论文笔记:Estimating future human trajectories from sparse time series data

sigspatial 2023 humob竞赛paper hiimryo816/humob2023-MOBB (github.com) 1 数据集分析 这里只分享了HuMob数据集1的内容 1.1 假日分析 对HuMob数据集#1地理数据的方差分析显示了非工作日的模式 在某些天的y坐标方差中有显著的峰值&#xff0c;这是非工作日的象征【x坐标…

写给LLM新手的建议,让你少走2年弯路!

大模型的爆火&#xff0c;在全球范围内引发了一场A1“狂也在业界点燃了一场百模大战。结合蕞近飙”&#xff0c;两年我在大模型领域的一些经验&#xff0c;分享一下在校学生/新人如何转到大模型阵营。 1、大模型有哪些从业方向? 首先你可以在求职网站搜索一下“大模型关键词&…

重卡智能充电机器人

产品介绍 随着新能源电池行业的发展&#xff0c;越来越多码头、矿山等场景的重型卡车都改为新能源供电形式&#xff0c;由于新能源重卡充电电压为1.2MW&#xff0c;充电口离地1.8m&#xff0c;充电枪充电线缆重量为50kg&#xff0c;人工操作难度大、危险性大&#xff0c;所以我…

arcpy将数据库要素类添加到图层组以及创建要素收藏夹如何创建文件夹并将模板中的符号添加到文件夹中

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

算法基础-位运算

>> &#xff08;右移运算&#xff09; x >> y&#xff1a;表示将x的二进制值右移y位。 正数是直接右移y位&#xff0c;则高位&#xff08;最左边&#xff09;补y个0。 负数是求补码&#xff0c;然后右移y位&#xff0c;最高位补y个1&#xff0c;再求反码&#xff…

react|useState的异步渲染

useState 组件里面的变量可以用state来表示&#xff0c;setState函数是用来更新state的值的用法 let [age,setAge]useState(0); // 0是变量age的初始值异步渲染 setState是异步指定的。也就是setAge是异步执行的。执行但不是立刻渲染&#xff0c;而是进入到微任务队列。注意…

数值分析笔记(六)非线性方程求根

非线性方程求根 二分法 二分法是线性收敛的。 不动点 对于非线性方程 f ( x ) 0 f(x)0 f(x)0&#xff0c;将其转化为 x φ ( x ) x\varphi(x) xφ(x)&#xff0c;若 x ∗ x^* x∗满足 f ( x ∗ ) 0 f(x^*)0 f(x∗)0&#xff0c;称 x ∗ x^* x∗为 φ ( x ) \varphi(x) φ…

基于ASO-BP原子探索优化BP神经网络实现数据预测Python实现

本文提出了一种基于ASO算法优化BP神经网络的数据预测方法。通过ASO算法对BP神经网络的权值和阈值进行优化&#xff0c;克服了BP神经网络易陷入局部最优解和对初始权值敏感的缺点。实验结果表明&#xff0c;优化后的BP神经网络在预测精度上得到了显著提升&#xff0c;为数据预测…

【数学建模学习手册】python基本入门使用

本专栏内容为&#xff1a;数学建模原理 记录学习数学建模 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数学建模 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学…

【三维重建】三角网格中轴骨架线提取

三维网格中轴线提取 方法介绍实现提取 三维网格中轴线提取是计算机图形学和三维建模领域中的一个重要技术&#xff0c;它对于理解三维形状的拓扑结构和几何特性具有重要意义。 方法介绍 以下是几种常见的三维网格中轴线提取方法&#xff1a; 基于距离变换的方法 基本原理&…

海康二次开发笔记10-独立Group导入、导出及执行

独立Group导入、导出及执行 1. 界面设计 2. 添加引用 Group相当于VM中的模块,因此在调用相关接口函数前,需要引用对应的动态库IMVSGroupCs,同时将复制本地的属性改为False using IMVSGroupCs;3. 添加VmSingleModuleSetConfigControl控件 拖入控件后,设置Dock为Fill 4. 选择G…

算法的学习笔记—把数字翻译成字符串

&#x1f600;前言 在日常生活中&#xff0c;我们经常会遇到各种编码和解码的问题。今天&#xff0c;我们将讨论一个有趣的问题&#xff1a;如何将一串数字翻译成字母&#xff0c;并计算出有多少种不同的翻译方法。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#…

虚拟化设置和虚拟机相关的环境搭建

目录 0.首先声明 1.背景知识 ​编辑 2.虚拟化设置 3.安装vm15.5过程 4.安装虚拟系统 4.1下载centos7.6 4.2安装centos7.6 5.我的总结 6.我的体会 0.首先声明 我的这个教程参考的就是韩顺平老师的这个linux学习教程&#xff0c;但是这个韩老师的这个教程就是2020年的教…

算法如何应用,思路都在这

目录 01 问题定义 02 问题建模 03 特征工程 04 模型选择 05 模型融合 本文深入探讨了算法在不同领域的应用方法和背后的思考逻辑。作者夏师傅通过丰富的案例分析&#xff0c;揭示了算法如何助力产品决策、优化业务流程&#xff0c;并提供了实用的策略和技巧。无论您是技术专家还…

2024 年 Web 开发者必备的 30 款 CSS 工具

2024 年 Web 开发者必备的 30 款 CSS 工具 | 瑆箫博客 找到合适的 CSS 工具可能需要花费不少时间&#xff0c;但是这份 2024 年最棒的 30 款 CSS 工具清单&#xff0c;可以让你的选择变得轻松许多。无论你的 CSS 技能水平如何&#xff0c;这份清单都能提供调试、优化代码和提升…

Bazel 快速入门与核心知识

Bazel 快速入门与核心知识 Bazel 简介 Bazel 是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目 (C/C, Java, Python, …)&#xff0c;可为多个平台构建输出。Bazel 支持跨多个代码库和大量用户的大型代码…

2024怎么选蓝牙耳机性价比品牌?四款小白必看优选王炸机型推荐!

如今国人对蓝牙耳机的选择日益重视&#xff0c;蓝牙耳机作为智能的手机备件&#xff0c;普及率也是一升再升&#xff0c;但市面上很多品牌虽然宣传自己音质好和佩戴感舒适&#xff0c;其实性能不佳&#xff0c;那么2024怎么选蓝牙耳机性价比品牌&#xff1f;身为资深的蓝牙耳机…

复变函数在大模型中的应用

1. 导入 说来惭愧&#xff0c;我研究生时的研究方向是复分析&#xff0c;但毕业近十年来几乎没用到它。 我还记得实习时做自我介绍时&#xff0c;我说我的研究方向是复分析。面试官不太了解&#xff0c;我便解释说&#xff0c;这是关于对 -1 开平方得到的虚数 i 的研究。 在…

信号的捕捉

1.信号的产生 信号递达:实际执行信号的处理动作称为信号的递达 信号未决:信号从产生到递达之间的状态 进程可以阻塞某个信号 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作 注意,忽略和阻塞是不同的,只要信号阻塞就不会被递达,而忽略是递达…