【AT89C52单片机项目】音乐播放器的设计

news2024/11/17 21:47:04
  • 实验目的

用51系列单片机设计一个可以切歌的音乐播放器。

  • 实验仪器

AT89C52单片机。

音乐播放模块。

  • 设计要求

采用重装定时器计数方式1的初值来实现发出不同频率的声音,通过控制延时长度来实现不同的节拍,之后将音乐数据表填入,即可实现音乐播放。

可通过功能按键切换歌曲

  • 实验原理

音乐播放采用重装定时器计数方式1的初值来实现发出不同频率的声音,通过控制延时长度来实现不同的节拍,之后将音乐数据表填入,即可实现音乐播放。

音乐切换方面采取按键输入,按键检测到低电平,则判断有信号输入,等待10ms去抖后,等待下一个高电平,进行音乐的切换。

  • 实验流程
  1. 根据课本学习喇叭发生实验、警车声音、救护车声音、喇叭滴答声音、报警发声、消防车、音乐播放等一系列实验了解了喇叭发声以及调节频率的方法。学习独立按键的用法用于切换歌曲
  2. 模仿音乐播放的代码,进行修改,将源代码的歌曲乐谱换成“铃儿响叮当”和“Spider Dance”的乐谱
  3. 将单片机喇叭短接,代码烧录入单片机。

 

 

  • 实验结果

单片机正常运行,先播放“铃儿响叮当”的旋律,当我按下独立按键INT1时,歌曲切换为“Spider Dance”的旋律,如果重新按下独立按键INT1,可以切换回“铃儿响叮当”。

  • 代码

 

#include <reg52.h>
sbit SPK = P1 ^ 2;    //定义喇叭接口
sbit KEY = P3 ^ 3;    //设置独立按键INT1,按下按键时切换歌曲
sbit LED = P1 ^ 7;    //用于切换歌曲的显示,当LED = 1时播放铃儿响叮当,否则播放Spider Dance
int Timer0_H, Timer0_L, Time; //定义定时器变量和时间变量

code unsigned char MUSIC1[] = { //歌曲“铃儿响叮当”的乐谱,每个音由3个变量构成,前两个变量用来确定音乐频率,第三个变量确定持续时间
    3,2,2,3,2,2,  3,2,4,  3,2,2,3,2,2,  3,2,4,
    3,2,2,5,2,2,  1,2,3,2,2,1,  3,2,8,
    4,2,2,4,2,2,  4,2,2,4,2,2,  4,2,2,3,2,2,  3,2,2,3,2,2,
    5,2,2,5,2,2,  4,2,2,2,2,2,  1,2,4,  1,3,4, 0,0,0
};
code unsigned char MUSIC2[] = { //歌曲“Spider Dance”的乐谱,如果前两个变量为(0,0)时则为空拍
    6,3,4,   3,3,4,   1,3,4,   6,2,4,
	0,0,2,   2,3,2,	  2,3,2,   0,0,4,   2,3,2,   1,3,2,   5,2,2,   6,2,2,
	0,0,2,   3,3,2,   2,3,2,   1,3,2,   2,3,2,   3,3,2,   5,2,2,   6,2,2,
	1,3,2,   6,2,2,   5,2,2,   6,3,2,   0,0,2,   5,3,2,   3,3,1,   2,3,1,   1,3,2,
	6,2,4,   4,2,4,   7,2,4,   4,2,4,
	1,3,4,   4,2,4,   2,3,8,
	3,3,4,   2,3,4,   6,3,4,   3,3,4,
	5,3,4,   4,3,4,   3,3,4,   0,0,4,
	6,3,2,	 3,4,2,	  2,4,2,   3,4,2,   6,3,2,	 3,4,2,	  2,4,2,   3,4,2,
	3,3,2,	 2,4,2,	  2,4,2,   2,4,2,	3,3,2,	 3,4,2,	  7,3,2,   2,4,2,
	6,3,2,	 3,4,2,	  2,4,2,   3,4,2,   7,3,2,	 3,4,2,	  2,4,2,   3,4,2,
	1,4,2,	 3,4,2,	  2,4,2,   3,4,2,	2,4,2,	 4,4,2,	  3,4,2,   4,4,2,
	4,3,2,	 1,4,2,	  7,3,2,   1,4,2,	4,3,2,	 2,4,2,	  1,4,2,   2,4,2,
	4,3,2,	 3,4,2,	  2,4,2,   3,4,2,	4,3,2,	 4,4,2,	  3,4,2,   4,4,2, 0,0,0


};

code unsigned char FREQH[]= { //频率表前八位,第0行频率为低两个8度的音,第1行频率为低一个8度的音,第2行为正常音,第3行为高8度的音
                                //(抱歉,乐理基础没学好,音的标准说法忘了咋说了,懂意思就好)
                                // 比如说正常音la,持续时间为2,那就是(6,2,2)
    0xF2,0XF3,0xF5,0xF5,0XF6,0XF7,0XF8,
    0xF9,0XF9,0XFA,0XFA,0XFB,0XFB,0XFC,0XFC,
    0xFC,0XFD,0XFD,0XFD,0XFD,0XFE,
    0xFE,0XFE,0XFE,0XFE,0XFE,0XFE,0XFF
};

code unsigned char  FREQL[]= { //频率表后八位
    0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
    0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,
    0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
    0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16
};

void DelayUs2x(unsigned char t)  //延迟函数
{
    while (--t)
    {

    }
}
void DelayMs(unsigned char t) //延迟时间函数,略微修改,时间不准
{
    while (--t)
    {
        DelayUs2x(245);
    }
}
void delay(unsigned char t)  //延迟时间函数
{
    unsigned char i;
    for (i = 0; i < t; i++)
        DelayMs(125);
    TR0 = 0;
}

void Init_Timer0(void) //定时器初始化函数
{
    TMOD |= 0x01; //模式1,16位定时器/计数器
    EA = 1; //总中断打开
    ET0 = 1; //定时器中断打开
}
void TIM0_ISR() interrupt 1  //定时器中断函数,用于读取音符频率值,产生对应的音符
{
    TR0 = 0; //定时器暂停
    SPK = !SPK; //喇叭反转
    TH0 = Timer0_H; //重置定时
    TL0 = Timer0_L;
    TR0 = 1; //定时器开始
}

void Song()
{
    if (Timer0_H == -1 && Timer0_L == -1) //空拍判断,喇叭不发声
    {
        delay(Time);
    }
    else
    {
        TH0 = Timer0_H;  //重置定时
        TL0 = Timer0_L;
        TR0 = 1;  
        delay(Time);
    }
}

void main(void)
{
    unsigned char k, i;
    Init_Timer0();
    KEY = 1;
    LED = 1;
    while (1)
    {
        i = 0;
        if (LED) //播放“铃儿响叮当”
        {
            while (i < 76) //这个数字是MUSIC数组里的变量数
            {
                k = MUSIC1[i] + 7 * MUSIC1[i + 1] - 1;//频率位置,用两个变量进行判断
                Timer0_H = FREQH[k];// 获取频率高八位
                Timer0_L = FREQL[k];// 获取频率低八位
                Time = MUSIC1[i + 2];// 获取持续时间
                i += 3;
                Song();
                if (!KEY) //判断独立按键按下
                {
                    while (!KEY) //判断按键释放
                    { }
                    LED = !LED; //切歌
                    break;
                }
            }
        }
        else
        {
            while (i < 280) //播放“Spider Dance”
            {
                k = MUSIC2[i] + 7 * MUSIC2[i + 1] - 1;
                Timer0_H = FREQH[k];
                Timer0_L = FREQL[k];
                Time = MUSIC2[i + 2];
                i += 3;
                Song();
                if (!KEY)
                {
                    while (!KEY)
                    { }
                    LED = !LED;
                    break;
                }
            }
        }
    }
}

 

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

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

相关文章

【python】python汽车保险数据分析(数据+代码+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、51CTO技术博主 &#x…

【C++/嵌入式笔试面试八股】三、01.ARM体系架构 | 中断与异常

ARM体系架构 ARM 01.ARM产品线、 02.ARM体系结构 03.ARM硬件系统组成和运行原理🍊 直接在flash上执行较慢(NOR flash可以直接运行,NAND flash不行,按块访问),搬到内存运行,叫重定位 控制器负责取值译码 ALU负责运算 寄存器负责暂存数据 一条机器指令的执行过程,包含

SpringBoot中整合Sharding Sphere实现数据加解密/数据脱敏/数据库密文,查询明文

场景 为防止数据泄露&#xff0c;需要在插入等操作时将某表的字段在数据库中加密存储&#xff0c;在需要查询使用时明文显示。 Sharding Sphere ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈&#xff0c; 它由Sharding-JDBC、Sharding-Proxy和Shardi…

如何采集来赞达Lazada虾皮shopee各区域商品详情页面数据

以虾皮shopee根据ID取商品详情 API 返回值说明为例 shopee.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;注册Key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&am…

C++学习之static关键字小结

static在C编程中随处可见&#xff0c;但是其真实的使用方式没有总结过&#xff0c;因此在使用中经常出一些问题&#xff0c;下面就C编程中static关键字在的几种用法进行相关总结说明如下。 1、在函数内部定义带有static关键字的变量时&#xff0c;则变量是保存在静态存储区的&…

[QT编程系列-13]:QT快速学习 - 1- 初识

目录 第1章 QT的介绍 1.1 QT VS MFC 1.2 QT历史 1.3 QT的应用 1.4 QT学习方法 1.5 QT对象树 1.6 2-8定律 1.7 QT优势&#xff1a; 1.8 QT支持的平台 第2章 QT UI是各种控件对象的堆积 第3章 QT UI是各种控件的堆积 第4章 控件窗口的控制 第1章 QT的介绍 1.1 QT V…

【广州华锐互动】VR石油化工作业实训平台

VR石油化工作业实训平台是一种基于虚拟现实技术的教学、科研辅助工具&#xff0c;可以提供交互式的实验环境&#xff0c;让学生和研究人员在虚拟环境中进行实验。该系统可以帮助学生更好地理解石油炼制过程中的各个环节&#xff0c;包括原油加工、分离、精制等。 通过这种方式…

Python 数据管理

数据管理是收集、收集原始数据并将其转换为另一种格式的过程&#xff0c;以便在更短的时间内更好地理解、决策、访问和分析。 数据管理的重要性 数据管理是数据科学项目中非常重要的一步。下面的例子将解释它的重要性&#xff1a; 图书销售网站希望显示不同领域的畅销书&#…

推荐一款IDEA神级插件【Bito】而且免费!

什么是Bito&#xff1f; Bito是一款在IntelliJ IDEA编辑器中的插件&#xff0c;Bito插件是由ChatGPT团队开发的&#xff0c;它是ChatGPT团队为了提高开发效率而开发的一款工具。ChatGPT团队是一支专注于自然语言处理技术的团队&#xff0c;他们开发了一款基于GPT的自然语言处理…

轮播图,用vue来写一个简单的轮播图

轮播图&#xff0c;用vue来写一个简单的轮播图 写的很简单&#xff0c;就是一个小练习&#xff0c;哈哈哈&#xff0c;下面的几张图分别是轮播图的第一张&#xff0c;中间图&#xff0c;最后一张的效果图。 使用了vue 中的属性绑定 v-bind ,v-show 以及 事件监听 v-on 指令。 思…

NZ13:VBA给数据加密处理

【分享成果&#xff0c;随喜正能量】爱出者爱返&#xff0c;福往者福来。怀揣一颗善良的心&#xff0c;本本分分&#xff0c;坦坦荡荡&#xff0c;多去帮助需要的人&#xff0c;坚持善良做人&#xff0c;才能不负于人&#xff0c;不负自己。。 我的教程一共九套及VBA汉英手册一…

黄皮书-线接触热弹流润滑 Fortran+Matlab转译代码

原Fortran代码有错误&#xff0c;进行了修改&#xff0c;数值上差别不大。根据Fortran代码转的Matlab&#xff0c;可以完美运行&#xff0c;但是因为精度问题有差异&#xff0c;只能说趋势是一致的。 需要私我-资源里只是Fortran运行结果

Spark(25):Spark部署模式对比

目录 0. 相关文章链接 1. Spark支持的集群管理器 2. YARN 模式运行机制 2.1. YARN Cluster 模式 2.2. YARN Client 模式 3. Standalone 模式运行机制 3.1. Standalone Cluster 模式 3.2. Standalone Client 模式 0. 相关文章链接 Spark文章汇总 1. Spark支持的集群管…

Python爬虫——urllib_微博cookie登陆

cookie登陆适用场景&#xff1a; 适用场景&#xff1a;数据采集的时候&#xff0c;需要绕过登陆&#xff0c;然后进入到某个页面 # 适用场景&#xff1a;数据采集的时候&#xff0c;需要绕过登陆&#xff0c;然后进入到某个页面 import urllib.requesturl https://weibo.cn/7…

不用显示器,不用鼠标和键盘,让我们用主机远程访问OK3588的桌面

不用显示器&#xff0c;不用鼠标和键盘&#xff0c;让我们用主机远程访问OK3588的桌面 MobaXterm软件介绍串口终端运行命令MobaXterm访问开发板 MobaXterm软件介绍 MobaXterm是一款增强型终端软件&#xff0c;对于Windows平台上的程序员、网络管理员和开发者是一款极其优秀的工…

数据库 --- mysql(03)-- mysql字符集、表操作(01)

MYSQL 1、mysql字符集 &#xff08;1&#xff09;简介&#xff1a; MySQL字符集包括字符集&#xff08;CHARACTER&#xff09;和校对规则&#xff08;COLLATION&#xff09;两个概念&#xff1a; 字符集&#xff08;CHARACTER&#xff09;是一套编码校对规则&#xff08;CO…

Spark(24):Spark内核概述

目录 0. 相关文章链接 1. Spark核心组件 1.1. Driver 1.2. Executor 2. Spark通用运行流程概述 0. 相关文章链接 Spark文章汇总 1. Spark核心组件 1.1. Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作。Dr…

基于SSM的新生报到系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

USB接口种类知多少?一起来温故一下吧!

前言 USB接口类型有很多&#xff0c;如下图所示&#xff0c;到底哪个是哪个&#xff1f;都怎么称呼&#xff1f; 本人也是对各种USB接口一知半解&#xff0c;趁着今天周末&#xff0c;整理了下USB接口的种类&#xff0c;相信也有很多跟我一样对其了解不够深的朋友&#xff0c;那…

测试开发必备技能-Jmeter二次开发

01 概述 为什么需要做二次开发&#xff1f;JMeter作为一款开源的性能、接口测试工具&#xff0c;有时候无法满足我们工作的需要&#xff0c;一般体现在&#xff1a;协议不支持、没有相应数据处理功能等。 一般这种情况下&#xff0c;我们可以做的选择有&#xff1a; 第一种找…