【单片机】MSP430F149单片机,晨启,音乐播放器,蜂鸣器音乐

四、音乐播放器
任务要求:
设计制作一个简易音乐播放器(通过手柄板上的蜂鸣器发声,播放2到4首音
乐),同时LED模块闪烁,给人视、听觉美的感受。

评分细则:

  1. 按下播放按键P15开始播放音乐,再次按下停止播放;(20分)
  2. 按下按键P14播放下一首,按下按键P13播放上一首;(20分)
  3. 播放音乐时OLED显示相应的曲目名;(20分)
  4. 当按下"下一首"或者"上一首〃按键,但是已经播放至最后一首时,显示屏显
    示"无更多曲目!",同时蜂鸣器报警三秒钟;(20分)
  5. 歌曲名横向滚动显示;(10分)
  6. 具有音乐播放模式切换键,播放模式有单曲循环、顺序播放、随机播放三种
    模式。(10分)

要求可以播放2至4首音乐,音乐节拍可通过网络等渠道收集。LED模块的闪烁
方式不做要求。
涉及的单片机内容以及口袋开发板模块:
单片机:I/O功能、定时/计数器、显示接口
口袋开发板:独立按键、OLED显示屏、蜂鸣器

在这里插入图片描述

原理:单片机使用PWM驱动无源蜂鸣器发声,PWM频率改变,发声频率就会改变。一首简谱就是由不同频率的音节组成的。

部分代码:

/*  ******************************************    */
/*  ********   延时 80 ms	控制音乐节拍 */
/*  ******************************************    */
void delay1()
{delay_ms( 80 );
}char taskBusy;
void main( void )
{unsigned char u = 0, t = 0;WDT_Init();                             /*看门狗设置 */Clock_Init();                           /* 系统时钟设置 */User_SystemInit();                      /* 用户控制系统初始化函数 */Timer_Init( TimerA, 10000 );             /* 10ms定时器中断 */TBCCTL0 = CCIE;                         /* CCR0 interrupt enabled */TBCCR0	= 0;TBCTL	= TBSSEL_2 + MC_1 + ID_3;       /* SMCLK, contmode */dis_bofangmode();dis_bofangmode();_EINT();while ( 1 ){if ( taskBusy == 1 ){User_RealTimeTask( 100 );                               /* 实时控制任务 */}else  { /* 空闲任务(大部分时间空闲,可以用来管理一些不紧急的任务,不易放长时间执行的任务) */User_IdleTask();}delay_ms(10);if(daojishi==0 && ((music_crr == 10) ||(music_crr==-1)))//倒计时结束关闭蜂鸣器{TBCTL = TBSSEL_2 + MC_0 + ID_3;                         /* 关闭 */GPIO_Set( P5, 6, 1 );                                   /* 关闭蜂鸣器 */}if(daojishi!=0){TBCCR0	= SYSCLK / H7 / 2;               /*选一个频率 */TBCTL	= TBSSEL_2 + MC_1 + TBCLR + ID_3;       /* SMCLK, upmode */}if ( (music_crr == 0) && open_flag == 1 ){u = 0;                                                  /* 从第1个音符f[0]开始播放 */while ( music0[u] != 0xff )                             /* 只要没有读到结束标志就继续播放 */{if ( music_crr != 0 )                           /* 切换音乐 */{TBCTL = TBSSEL_2 + MC_0 + ID_3;         /* 关闭 */GPIO_Set( P5, 6, 1 );                   /* 关闭蜂鸣器 */break;}while ( open_flag == 0 );                                       /* 如果暂停音乐 */TBCCR0	= SYSCLK / music0[u] / 2;               /*选一个频率 */TBCTL	= TBSSEL_2 + MC_1 + TBCLR + ID_3;       /* SMCLK, upmode */for ( t = 0; t < music0_JP[u]; t++ )            /* 控制节拍数 */delay1();                               /* 延时1个节拍单位 */TBCTL = TBSSEL_2 + MC_0 + ID_3;                 /* 关闭 */u++;                                            /* 播放下一个音符 */}if(bofang_mode==1){music_crr=music_crr+1;if(music_crr==4)music_crr=0;//顺序循环}else if(bofang_mode==2){music_crr=(music_crr+13)%4;//随机}TBCTL = TBSSEL_2 + MC_0 + ID_3;                         /* 关闭 */GPIO_Set( P5, 6, 1 );                                   /* 关闭蜂鸣器 */}if ( music_crr == 1 && open_flag == 1 ){u = 0;                                                  /* 从第1个音符f[0]开始播放 */while ( music1[u] != 0xff )                             /* 只要没有读到结束标志就继续播放 */{if ( music_crr != 1 )                           /* 切换音乐 */{TBCTL = TBSSEL_2 + MC_0 + ID_3;         /* 关闭 */GPIO_Set( P5, 6, 1 );                   /* 关闭蜂鸣器 */break;}while ( open_flag == 0 );                                       /* 如果暂停音乐 */TBCCR0	= SYSCLK / music1[u] / 2;               /*选一个频率 */TBCTL	= TBSSEL_2 + MC_1 + TBCLR + ID_3;       /* SMCLK, upmode */for ( t = 0; t < music1_JP[u] / 2; t++ )        /* 控制节拍数 */delay1();                               /* 延时1个节拍单位 */TBCTL = TBSSEL_2 + MC_0 + ID_3;                 /* 关闭 */u++;                                            /* 播放下一个音符 */}if(bofang_mode==1){music_crr=music_crr+1;if(music_crr==4)music_crr=0;//顺序循环}else if(bofang_mode==2){music_crr=(music_crr+13)%4;//随机}TBCTL = TBSSEL_2 + MC_0 + ID_3;                         /* 关闭 */GPIO_Set( P5, 6, 1 );                                   /* 关闭蜂鸣器 */}if ( music_crr == 2 && open_flag == 1 ){u = 0;                                                  /* 从第1个音符f[0]开始播放 */while ( music2[u] != 0xff )                             /* 只要没有读到结束标志就继续播放 */{if ( music_crr != 2 )                           /* 切换音乐 */{TBCTL = TBSSEL_2 + MC_0 + ID_3;         /* 关闭 */GPIO_Set( P5, 6, 1 );                   /* 关闭蜂鸣器 */break;}while ( open_flag == 0 );                                       /* 如果暂停音乐 */TBCCR0	= SYSCLK / music2[u] / 2;               /*选一个频率 */TBCTL	= TBSSEL_2 + MC_1 + TBCLR + ID_3;       /* SMCLK, upmode */for ( t = 0; t < music2_JP[u]; t++ )            /* 控制节拍数 */delay1();                               /* 延时1个节拍单位 */TBCTL = TBSSEL_2 + MC_0 + ID_3;                 /* 关闭 */u++;                                            /* 播放下一个音符 */}if(bofang_mode==1){music_crr=music_crr+1;if(music_crr==4)music_crr=0;//顺序循环}else if(bofang_mode==2){music_crr=(music_crr+13)%4;//随机}TBCTL = TBSSEL_2 + MC_0 + ID_3;                         /* 关闭 */GPIO_Set( P5, 6, 1 );                                   /* 关闭蜂鸣器 */}if ( music_crr == 3 && open_flag == 1 ){u = 0;                                                  /* 从第1个音符f[0]开始播放 */while ( music3[u] != 0xff )                             /* 只要没有读到结束标志就继续播放 */{if ( music_crr != 3 )                           /* 切换音乐 */{TBCTL = TBSSEL_2 + MC_0 + ID_3;         /* 关闭 */GPIO_Set( P5, 6, 1 );                   /* 关闭蜂鸣器 */break;}while ( open_flag == 0 );                                       /* 如果暂停音乐 */TBCCR0	= SYSCLK / music3[u] / 2;               /*选一个频率 */TBCTL	= TBSSEL_2 + MC_1 + TBCLR + ID_3;       /* SMCLK, upmode */for ( t = 0; t < music3_JP[u]; t++ )            /* 控制节拍数 */delay1();                               /* 延时1个节拍单位 */TBCTL = TBSSEL_2 + MC_0 + ID_3;                 /* 关闭 */u++;                                            /* 播放下一个音符 */}if(bofang_mode==1){music_crr=music_crr+1;if(music_crr==4)music_crr=0;//顺序循环}else if(bofang_mode==2){music_crr=(music_crr+13)%4;//随机}TBCTL = TBSSEL_2 + MC_0 + ID_3;                         /* 关闭 */GPIO_Set( P5, 6, 1 );                                   /* 关闭蜂鸣器 */}}
}/* Timer B0 interrupt service routine */
#pragma vector=TIMERB0_VECTOR
__interrupt void Timer_B( void )
{GPIO_turn( P5, 6 );
}

全部代码:https://github.com/xddun/blog_code_search

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

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

相关文章

【C++】继承基础知识及简单应用,使用reportSingleClassLayout(在Visual Studio开发人员命令提示窗口)查看派生类详细信息

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】继承基础知识及简单应用&#xff0c;使用reportSingleClassLayout&#xff08;在Visual Studio开发人员命令提示窗口&#xff09;查看派生类详细信息 website&#xff1a;黑马程序员C date&#xf…

微信小程序原生上传图片和预览+云函数上传

1.前台页面 1.1wxml问阿金 <!-- 说明一个上传页面的按钮 --> <button type"primary" bindtap"uploadPage">上传页面展示</button> <!-- 声明一个上传服务器的按钮 --> <button type"warn" bindtap"uploadSeve…

pytest钩子函数(四):用例执行钩子

前言 pytest这个框架提供了非常多的钩子。通过这些钩子我们可以对pytest 用例收集、用例执行、报告输出等各个阶段进行干预&#xff0c;根据需求去开发对应的插件&#xff0c;以满足自己的使用场景。 01 什么是钩子函数&#xff1f; 钩子函数在pytest称之为Hook函数,它pytes…

第四讲:MySQL中DDL一些基本数据类型及表的创建、查询

目录 1、创建表:2、DDL一些基本数据类型&#xff1a; 1、创建表: 部分单词及解析&#xff1a; 1、tables:表 2、comment:评论&#xff0c;解释 3、gender:性别 4、neighbor&#xff1a;邻居 1、创建表&#xff1a;&#xff08;注&#xff1a;在自定义数据库操作&#xff0c;…

ElasticSearch初探

ElasticSearch 是什么? ElasticSearch是一个分布式、Restfui 风格的搜索和数据分析引擎,国内简称ES, ElasticSearch 是用Java开发的,底层基于Lucene,Lucene是一种全文的索引库,直接采用Lucene是比较麻烦的,Elasticsearch在Lucene的基础上开发了一个强大的搜索引擎。 ELK…

第四十六天

●运算符也叫操作符 通过运算符可以对一个或多个值进行运算&#xff0c;并获取运算结果 比如&#xff1a;typeof就是运算符&#xff0c;可以来获得一个值的类型 它会将该值的类型以字符串的形式返回 number string boolean undefined object ●算数运算符 当对非Number类型的…

vscode开发Go和Java

vscode开发Go和Java 最新最全 vscode 插件推荐可以参考&#xff1a; https://zhuanlan.zhihu.com/p/623580867 1、公共插件安装 下面是个人使用的插件&#xff1a; # 中文插件 Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code https://marketplace…

基于人工智能的房地产行业的ChatGPT能提供什么样的改进解决方案?

解决方案描述自动化客户服务通过自然语言处理和聊天机器人技术&#xff0c;实现自动化的客户咨询和问题解答。这可以提高客户满意度&#xff0c;节省人力资源&#xff0c;并实现全天候的客户支持。数据分析与预测利用机器学习和数据分析技术&#xff0c;对房地产市场数据进行深…

spring中bean实例化的三种方式 -- Spring入门(二)

文章目录 前言1.Bean实例化简介2.bean的实例化 -- 构造方法3.bean的实例化 -- 静态工厂实例化4.bean实例化 -- 实例工厂和FactoryBean5.三种bean实例化方式的区别 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。…

Hive窗口函数大全

Hive窗口函数 一、偏移量函数laglead 二、窗口分析函数first_valuelast_value 三、排序函数rankdense_rankrow_number 一、偏移量函数 lag 语法&#xff1a;lag(col,n,default_val) 返回值&#xff1a;字段类型 说明&#xff1a;往前第n行数据。 lag(column字段&#xff0c;第…

Leetcode 112. 路径总和

题目链接&#xff1a;https://leetcode.cn/problems/path-sum/description/ 思路 递归&#xff0c;先序遍历二叉树&#xff0c;每遍历一个节点便减去当前存储值&#xff08;targetSum targetSum - root.val&#xff09;&#xff1b;当到达某个节点等于targetSum (targetSum…

labview 子画面插入面板

1.前言 在前面一篇文章中描述了弹框式显示子画面&#xff0c; labview 弹窗(子vi)_weixin_39926429的博客-CSDN博客 本文介绍插入式显示子画面。 本文的主题在以前的文章中介绍过&#xff0c; labview 插入子面板_labview插入子面板_weixin_39926429的博客-CSDN博客 借用…

机器学习算法分类

机器学习根据任务的不同&#xff0c;可以分为监督学习、无监督学习、半监督学习、强化学习。 1. 无监督学习 训练数据不包含任何类别信息。无监督学习里典型例子是聚类。要解决的问题是聚类问题和降维问题&#xff0c;聚类算法利用样本的特征&#xff0c;将具有相似特征的样本…

微服务 云原生:搭建 K8S 集群

为节约时间和成本&#xff0c;仅供学习使用&#xff0c;直接在两台虚拟机上模拟 K8S 集群搭建 踩坑之旅 系统环境&#xff1a;CentOS-7-x86_64-Minimal-2009 镜像&#xff0c;为方便起见&#xff0c;直接在 root 账户下操作&#xff0c;现实情况最好不要这样做。 基础准备 关…

React18和React16合成事件原理(附图)

&#x1f4a1; React18合成事件的处理原理 “绝对不是”给当前元素基于addEventListener做的事件绑定&#xff0c;React中的合成事件&#xff0c;都是基于“事件委托”处理的&#xff01; 在React17及以后版本&#xff0c;都是委托给#root这个容器&#xff08;捕获和冒泡都做了…

【java】java中注解的简介,如何自定义注解,有哪些类型,有什么作用

java注解 注解的定义 Java 注解用于为 Java 代码提供元数据。作为元数据&#xff0c;注解不直接影响你的代码执行&#xff0c;但也有一些类型的注解实际上可以用于这一目的。Java 注解是从 Java5 开始添加到 Java 的。 首先要明确一点的是&#xff0c;注解并没有实际的作用&…

八股文(消息队列)

文章目录 1. RabbitMQ特点2. 如何保证消息的可靠性3. RabbitMQ消息的顺序性4. 实现RabbitMQ的高可用性5. 如何解决消息队列的延时以及过期失效问题&#xff1f;6. RabbitMQ死信队列7. RabbitMQ延迟队列8.RabbitMQ的工作模式9. RabbitMQ消息如何传输10. 核心概念10.1 生产者和消…

RNNLSTM

文章目录 前言引言应用示例-槽填充(slot filling)-订票系统二、循环神经网络(RNN)三、Long Short-term Memory (LSTM)LSTM原理[总结](https://zhuanlan.zhihu.com/p/42717426)LSTM例子lstm的训练RNN不但可以N2NMany2One(输入是一个矢量序列,但输出只有一个矢量)Many2Ma…

SpringBoot整合Spring Security实现权限控制

文章目录 Spring Security介绍Spring Security案例1、快速搭建一个springboot工程2、导入SpringSecurity整合springboot工程3、认证3.1、登录流程校验3.2、入门案例的原理3.3、实现思路3.4、实现认证流程&#xff08;自定义&#xff09;3.5、正式实现3.5.1 实现数据库的校验3.5…

ucore lab3 虚拟内存管理

ucore lab3 虚拟内存管理 首先查看有关该lab的数据结构 vma: 描述了一块连续的虚拟内存空间,保证start<end&#xff0c;list_link是一个双向链表&#xff0c;按照从小到大的顺序把一系列用vma_struct表示的虚拟内存空间链接起来&#xff0c;并且还要求这些链起来的vma_str…