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

news2025/1/11 0:49:41

四、音乐播放器
任务要求:
设计制作一个简易音乐播放器(通过手柄板上的蜂鸣器发声,播放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.coloradmin.cn/o/782495.html

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

相关文章

MCP4725介绍和STM32模拟IC2驱动

一.MCP4725 简单总结为下面几个特点。 1路DAC输出 12位分辨率 I2C 接口&#xff08;标准&#xff0c;快速&#xff0c;高速支持&#xff09; 供电电压2.7-5.5 内部EEPROM存储设置 I2C地址可配置&#xff08;A0&#xff09;&#xff08;A1、A2内置&#xff0c;默认为‘00’&…

『Dubbo SPI源码分析』@Adaptive 机制分析

『Dubbo SPI源码分析』Adaptive 机制分析 基于 2.7.0 版本上一章&#xff1a;『Dubbo SPI源码分析』依赖注入机制分析 创建测试 demo 首先创建一个接口&#xff0c;举例为 Car package com.luban.dubbo_spi.api;SPI public interface Car {public void getColor();Adaptive…

pycharm中运行py文件时,报错:找不到自己编写的包等目录问题ModuleNotFoundError: No module named ‘xxx‘

【问题描述】&#xff1a;pycharm中运行py文件时&#xff0c;报错&#xff1a;找不到自己编写的包等目录问题 【报错】: ModuleNotFoundError: No module named ‘xxx’ ERROR: file not found 【问题定位】&#xff1a;运行的py文件和用到的包或者数据不在同一个文件目录下时…

【HanLP】--自然语言处理场景应用

目录 一、前言二、Springboot集成HanLP三、HanLP分词四、HanLP的关键字提取一、前言 HanLP 是由一系列模型与算法组成的工具包,主要功能包括分词、词性标注、关键词提取、自动摘要、依存句法分析、命名实体识别、短语提取、拼音转换、简繁转换等等。 下面将介绍HanLP如何本地…

PHP swoole从入门到精通(一、如何安装swoole及phpStorm服务端代码同步设置)

swoole安装直接在宝塔后台-》安装扩展 phpStorm服务端代码同步设置 https://www.cnblogs.com/yszr/p/9009961.html 软件下载地址 代码上传下载&#xff0c;鼠标右击任何一个文件或者文件夹&#xff0c;选择 Development->上传/下载/同步 点击工具栏Tools->Development…

前端个人年终工作总结精选7篇

一、工作总结的种类 1、按总结的时间分&#xff0c;有年度总结、半年总结、季度总结、学期总结。进行某项重大任务时&#xff0c;还要分期总结或叫阶段总结。 2、按总结的范围分&#xff0c;有单位总结、个人总结、综合性总结、专题总结等。 3、按总结的性质分&#xff0c;有…

科普 | OSI模型

本文简要地介绍 OSI 模型 1’ 2’ 3。 更新&#xff1a;2023 / 7 / 23 科普 | OSI模型 术语节点链路协议网络拓扑 概念作用结构应用层表示层会话层传输层网络层数据链路层物理层 数据如何流动OSI 和TCP/IP 的对应关系和协议参考链接 术语 节点 节点&#xff08; Node &#…

vue基本语法(个人学习笔记一)

目录 友情提醒第一章、vue概述1.1&#xff09;vuej介绍1.2&#xff09;Vue 周边库1.3&#xff09;MVVM的思想 第二章、借助CDN使用Vue2.1&#xff09;vue简单引入&#xff1a;引入js文件2.2&#xff09;简单的Vue程序 第三章、vue的基本语法3.1&#xff09;Vue的数据绑定&#…

在工作中如何对文件进行批量标记和编号

大家在日常工作中&#xff0c;是如何给文件该或文件夹批量重命名或添加编号&#xff0c;有没有怎么好的方法&#xff0c;可以一键批量操作。 经过小编多次操作经验&#xff0c;得到一个结论&#xff0c;可以通过《文件批量改名高手》对这些文件进行批量标记和编号&#xff0c;…

WebGL 概念和基础入门

WebGL 概念和基础入门 WebGL 是什么 对于 WebGL 百度百科给出的解释是 WebGL 是一种 3D 绘图协议&#xff0c;而对此维基百科给出的解释却是一种 JavaScript API。由于 WebGL 技术旨在帮助我们在不使用插件的情况下在任何兼容的网页浏览器中开发交互式 2D 和 3D 网页效果&…

win10 远程桌面连接如何打开?(Win10常用快捷键总结)

一、dos窗口下输入命令 mstsc 当然用向日葵还是更简单&#xff0c;更好用一些。 二、常用DOS命令 以下是一些常用的 DOS 命令&#xff1a; dir&#xff1a;列出当前目录中的文件和子目录。cd&#xff1a;改变当前目录。md&#xff1a;创建一个新的目录。rd&#xff1a;删除…

QT+VS2019 环境搭建

一、概述 一个PC-QT 的跨平台项目要维护。需要搭建一套环境。使用的是QTVS2019的环境。 QT使用v5.9.3的版本 (这个版本qalgorithms.h文件要替换成新的&#xff0c;源码附在文尾)vs插件使用qt-vsaddin-msvc2019-2.7.1.vsix 二、安装 无脑安装上文的QT5.9.3 和qt-vsaddin-msv…

LeetCode1143.Longest-Common-Subsequence<最长公共子序列>

题目&#xff1a; 思路&#xff1a; 我也不会,看出来了是动态规划,然后想着用sort试试. 看的题解.每一次扫描 双重for循环扫描字符(感觉这和一个个对比双指针区别不大了)..这动态规划也太笨重. 循环扫描数组。当字符相同的时候 1&#xff0c;否则等于它们之前较大的那一个。…

【阿里云试用计划】免费试用GPU

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 前言试用步骤问题No CUDA GPUs are available无故被killed 致谢 前言 算力在深度学习…

ESP-EYE-使用记录

文章目录 1 测试平台2 相关网站3 搭建ESP-IDF环境4 HTML 文件修改 1 测试平台 2 相关网站 Gitee 平台下 《乐鑫开源 / esp-who》乐鑫官网ESP-EYE板子介绍Github 平台下 esp-whoGitee 平台 《ESP-EYE 入门指南》乐鑫官网ESP-EYE板子资料下载 3 搭建ESP-IDF环境 主要参考 《乐…

【OpenCV】windows环境下,java OpenCV环境搭建,java 也可以实现opencv的功能了!opencv自由了

目录 1. 下载opencv 2. 安装opencv 目录 1. 下载opencv 2. 安装opencv 3. dll文件的导入配置 dll文件的导入&#xff1a; &#xff08;C的类库文件&#xff09;&#xff0c;opencv是c开发的类库&#xff0c;java语言要调用其中的方法&#xff0c;所以依赖了dll文件 3.1…

oracle 使用笔记

1.查看用户信息 查看oracle用户信息&#xff1a;id oracle 2.查看、编辑、复制、创建文件 查看&#xff1a;cat /etc/sysctl.conf 编辑&#xff1a;vi /etc/sysctl.conf 复制&#xff1a; cp /home/oracle/database/response/* /home/oracle/etc/ 创建&#xff1a;mkdir /h…

我的踩坑记录!!!积累中......

bug记录&#xff1a; 解决 nodejs安装后&#xff0c;在安装目录下【nodejs】创建两个文件夹【node_global】及【node_cache】用来配置全局环境变量。 之后&#xff0c;打开cmd命令窗口&#xff0c;输入 npm config set prefix ”D:\Program Files\nodejs\node_global” npm con…

KubeVela篇07:terraform controller实现原理

terraform-controller是一个专门负责terraform一类的组件"安装"的Operator,通过打包成helm,再封装成kubevela的Addon,由kubevela安装到管控集群,为其它terraform provider插件提供模块定义支持。 从前面kubevela安装一个Application的原理我们了解到,当一个如a…

pytest自动化测试指定执行测试用例

1、在控制台执行 打开cmd,进入项目目录 指定执行某个模块 pytest testcases\Logistics\Platform\CarSource\test_CarSourceList.py 指定执行某个目录及其子目录的所有测试文件 pytest testcases\Logistics\Platform\CarSource 指定执行某个模块的某个类的某个测试用例 pyte…