DSP28335课设:音乐流水灯的设计

news2024/11/26 12:01:53

本题目为音乐流水灯的设计,目的是熟练掌握DSP定时器的控制、中断系统的应用以及程序的编写调试。

1、让DSP发出不同的音乐音调;   

2、存储一个简单音乐(自选);

3、音乐的音调对应不同的灯

4、启动开关按下时,音乐流水灯开始运行,在播放音乐的同时,LED灯根据不同音调点亮;

5、按要求编写课程设计报告书,正确、完整的阐述设计和实验结果。

我们单片机的发声是通过蜂鸣器发出的,所以我们先了解一下蜂鸣器:

1.蜂鸣器介绍

             蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、 打印机、 复印机、 报警器、 电子玩具、 汽车电子设备、 电话机、 定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。  

             压电式蜂鸣器主要由多谐振荡器、 压电蜂鸣片、 阻抗匹配器及共鸣箱、 外壳等组成。 多谐振荡器由晶体管或集成电路构成, 当接通电源后( 1.5~15V 直流工作电压),多谐振荡器起振,输出 1.5~5kHZ 的音频信号, 阻抗匹配器推动压电蜂鸣片发声。(无源蜂鸣器

所以要使蜂鸣器发声,只需要频率在1.5到5khz之间即可

下面我们通过一个实验使DSP芯片发声:

打开ccs软件

1.新建一个项目:在我之前的博客写过

2.项目中的文件如下:(采用的是模块化编程),每个模块写好之后具有移植性

leds.c

#include "leds.h"

/*******************************************************************************
* 函 数 名         : LED_Init
* 函数功能         : LED初始化函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void LED_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟

    //LED1端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
    GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
    GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻

    //LED2端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;
    GpioCtrlRegs.GPCDIR.bit.GPIO67=1;
    GpioCtrlRegs.GPCPUD.bit.GPIO67=0;

    //LED3端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;
    GpioCtrlRegs.GPCDIR.bit.GPIO66=1;
    GpioCtrlRegs.GPCPUD.bit.GPIO66=0;

    //LED4端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;
    GpioCtrlRegs.GPCDIR.bit.GPIO65=1;
    GpioCtrlRegs.GPCPUD.bit.GPIO65=0;

    //LED5端口配置
    GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;
    GpioCtrlRegs.GPCDIR.bit.GPIO64=1;
    GpioCtrlRegs.GPCPUD.bit.GPIO64=0;

    //LED6端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;
    GpioCtrlRegs.GPADIR.bit.GPIO10=1;
    GpioCtrlRegs.GPAPUD.bit.GPIO10=0;

    //LED7端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;
    GpioCtrlRegs.GPADIR.bit.GPIO11=1;
    GpioCtrlRegs.GPAPUD.bit.GPIO11=0;



    GpioDataRegs.GPCSET.bit.GPIO68=1;
    GpioDataRegs.GPCSET.bit.GPIO67=1;
    GpioDataRegs.GPCSET.bit.GPIO66=1;
    GpioDataRegs.GPCSET.bit.GPIO65=1;
    GpioDataRegs.GPCSET.bit.GPIO64=1;
    GpioDataRegs.GPASET.bit.GPIO10=1;
    GpioDataRegs.GPASET.bit.GPIO11=1;

    EDIS;
}

leds.h

#ifndef _LEDS_H_
#define _LEDS_H_

#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


#define LED1_OFF        (GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)

#define LED2_OFF        (GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)

#define LED3_OFF        (GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)

#define LED4_OFF        (GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)

#define LED5_OFF        (GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)

#define LED6_OFF        (GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6_ON         (GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6_TOGGLE     (GpioDataRegs.GPATOGGLE.bit.GPIO10=1)

#define LED7_OFF        (GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7_ON         (GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7_TOGGLE     (GpioDataRegs.GPATOGGLE.bit.GPIO11=1)


void LED_Init(void);


#endif /* LED_H_ */

 beep.c

#include "beep.h"

void BEEP_Init(void)
{
    EALLOW;
    SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK=1;//开启GPIO时钟
    //BEEP端口配置
    GpioCtrlRegs.GPAMUX1.bit.GPIO6=0;
    GpioCtrlRegs.GPADIR.bit.GPIO6=1;
    GpioCtrlRegs.GPAPUD.bit.GPIO6=0;

    EDIS;
    GpioDataRegs.GPACLEAR.bit.GPIO6=1;
}

beep.h

#ifndef BEEP_H_
#define BEEP_H_


#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件


#define BEEP_ON         (GpioDataRegs.GPASET.bit.GPIO6=1)
#define BEEP_OFF        (GpioDataRegs.GPACLEAR.bit.GPIO6=1)
#define BEEP_TOGGLE     (GpioDataRegs.GPATOGGLE.bit.GPIO6=1)

void BEEP_Init(void);

#endif /* BEEP_H_ */

我们先了解一下音乐与单片机如何结合在一起的原理

 

通过这些频率取倒数,得到周期,再除以2,即得到一个音调高电平持续的时间。 

下面是一些表格计算的周期时间:

 有了这些数据,我们便可以使用数组来存储这些值。


有关音乐的知识在这里就不再写了,大家可以百度上去查看,

最重要的是   音调加节奏     

节奏就是一个音持续多长时间,这里我可以先简单说一下,

4分音符     8分音符      16分音符        2分音符

一般我们是以4分音符为标准,假如让它的时值为1,

那么2分音符就是它的时值的两倍。

8分音符的时值就是它的1/2。

16分音符的时值就是它的1/4.

这样每个音持续的时间我们也可以用一个1数组存起来。

下面我们以一闪一闪亮晶晶这首歌为例子

4/4表示的是以四份音符为一拍,每小节四拍

比如  1   1   5    5    都是四分音符,刚好四个合在一起为4拍。

—表示的声音的延长,如果与5结合的话,表示的是两拍。所以我们把四分音符定义为2的速度的··话,5-表示的四

 下图所示即我们的音乐

Uint16 Song[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,5,5,4,4,3,3,2,22}; //一闪一闪亮晶晶


Uint16 DT[]  ={2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4};      //节拍

我们课设的第三个任务是音乐的音调对应不同的灯,我们又写了一个函数,LEDx_TOGGLE表示的是LED翻转,我们通过a来控制

void ledSelect(int a)
{
    switch(a)
    {
        case 0: LED1_TOGGLE; break;
        case 1: LED2_TOGGLE; break;
        case 2: LED3_TOGGLE; break;
        case 3: LED4_TOGGLE; break;
        case 4: LED5_TOGGLE; break;
        case 5: LED6_TOGGLE; break;
        case 6: LED7_TOGGLE; break;
    }
}

最后是与这句话连接在一起的,song是我们前面创建的歌曲的音调数组,addr从0开始,比如song[0]=1, 1+1=2,  2%7=2,    2-对应第三盏LED灯亮 也就是

 do--3

 re--4

mi--5

fa--6

sol-7

la--1

xi--2

ledSelect((Song[addr]+1) % 7);
addr++;

main.c如下 

#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "leds.h"
#include "key.h"


/*******************************************************************************
* 函 数 名         : main
* 函数功能         : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File

#include "leds.h"
#include "beep.h"
Uint16 Musi[23]={       //单位us,不同频率下,不同声调的声音
                0,      //静止符
                3816,   //L_do
                3496,   //L_re
                3215,   //L_mi
                2865,   //L_fa
                2551,   //L_so
                2272,   //L_la
                2024,   //L_xi
                1912,   //do
                1703,   //re
                1517,   //mi
                1432,   //fa
                1275,   //so
                1136,   //la
                1013,   //xi
                956,    //H_do
                851,    //H_re
                758,    //H_mi
                716,    //H_fa
                638,    //H_so
                568,    //H_la
                506,    //H_xi
                0xFF    //STOP
                };

//Uint16 Song[]={1,1,5,5,6,6,5,4,4,3,3,2,2,1,5,5,4,4,3,3,2,5,5,4,4,3,3,2,22}; //一闪一闪亮晶晶
//Uint16 DT[]  ={2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4,2,2,2,2,2,2,4};      //节拍



//Uint16 Song[]={5,5,6,5,8,7,5,5,6,5,8,7,5,5,5,10,8,7,6,11,10,8,9,8,22};    //祝你生日快乐
//Uint16 DT[]  ={2,2,5,4,6,8,2,2,5,6,6,9,4,2,5,4,6,12,2,2,5,6,8,12 };           //节拍

Uint16 Song[]={15,16,13,15,12,19,21,20,19,17,19,16,16,17,14,13,
               12,13,15,16,10,15,13,12,13,15,12,17,19,14,16,13,
               15,12,10,12,10,12,13,14,16,13,12,13,15,16,19,17,
               16,17,16,15,13,12,10,10,15,13,15,13,12,10,12,13,
               15,12,22};                                                   //梁祝
Uint16 DT[]  ={3,1,1,1,2,3,1,1,1,1,1,4,3,1,2,2,
               3,1,2,2,2,2,1,1,1,1,4,3,1,2,2,1,
               1,4,1,2,2,1,1,1,1,4,1,1,3,1,2,2,
               2,1,1,2,1,1,2,4,4,3,1,1,1,1,1,1,
               1,4};                                                        //节拍

Uint32 gain = 600000;//以600ms为一个四分音符的节拍,

void ledSelect(int a)
{
    switch(a)
    {
        case 0: LED1_TOGGLE; break;
        case 1: LED2_TOGGLE; break;
        case 2: LED3_TOGGLE; break;
        case 3: LED4_TOGGLE; break;
        case 4: LED5_TOGGLE; break;
        case 5: LED6_TOGGLE; break;
        case 6: LED7_TOGGLE; break;
    }
}
/*******************************************************************************
* 函 数 名         : main
* 函数功能         : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void main()
{
    InitSysCtrl();

    LED_Init();
    BEEP_Init();
    KEY_Init();
    while(1)
    {
        Uint16 addr = 0;
        while(1)
        {

            if(Musi[Song[addr]] == 0xFF)//如果music到了停止符,
            {
                break;//跳出循环,停止播放音乐
            }
            else
            {
                Uint32 countTime = 0;//countTime来计算时间
                ledSelect((Song[addr]+1) % 7);

                while(countTime < gain * DT[addr])//
                {
                    if(countTime % Musi[Song[addr]] == 0)
                    BEEP_TOGGLE;//蜂鸣器响
                    countTime++;
                }
                ledSelect((Song[addr]+1) % 7);
                Uint32 i = 0;
                for(i = 0;i < gain; i++);
                addr++;
            }
        }
    }
}

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

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

相关文章

C++Muduo网络库初探

Muduo初探 Muduo网络库简介 Muduo是由【陈硕】大佬个人开发的TCP网络编程库&#xff0c;基于Reactor模式&#xff0c;提供了高效的事件驱动网络编程框架&#xff0c;有助于快速搭建高性能的网络服务端。 什么是Reactor模式&#xff1f; I/O多路复用 在网络I/O中&#xff0…

eclipse中没有SERVER的解决办法(超详细)

将 Tomcat 和 Eclipse 相关联时&#xff0c;Eclipse有的版本发现 发现eclipse->【Window】->【Preferences】里没有【server】从而配置不了Runtime Environment。所以需要通过eclipse进行安装。 通过我个人的经验下面给出解决办法&#xff1a; 一、获取 Eclipse版本 点击…

性能测试并发量评估新思考:微服务压力测试并发估算

性能测试并发量评估新思考 相信很多人在第一次做压力测试的时候&#xff0c;对并发用户数的选择一直有很多的疑惑&#xff0c;那么行业内有一些比较通用的并发量的计算方法&#xff0c;但是这些方法在如今微服务的架构下多少会有一些不适合&#xff0c;下面的文章我们对这些问题…

JS【数组】交集、差集、补集、并集

var a [1,2,3,4,5] var b [2,4,6,8,10]var sa new Set(a); var sb new Set(b); // 交集 let intersect a.filter(x > sb.has(x)); // 差集 let minus a.filter(x > !sb.has(x)); // 补集 let complement [...a.filter(x > !sb.has(x)), ...b.filter(x > !sa…

MicroBlaze IP核中Local Memory Bus (LMB)接口描述

LMB&#xff08;Local Memory Bus&#xff09;是一种同步总线&#xff0c;主要用于访问FPGA上的块RAM&#xff08;Block RAM&#xff0c;BRAM&#xff09;。LMB使用最少的控制信号和一个简单的协议&#xff0c;以保证块RAM能在一个时钟周期内被存取。所有的LMB信号都是高电平有…

[深度学习]--分类问题的排查错误的流程

原因复现&#xff1a; 原生的.pt 好使&#xff0c; 转化后的 CoreML不好使&#xff0c; 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…

Unet已死,Transformer当立!详细解读基于DiT的开源视频生成大模型EasyAnimate

Diffusion Models视频生成-博客汇总 前言&#xff1a;最近阿里云PIA团队开源了基于Diffusion Transformer结构的视频生成模型EasyAnimate&#xff0c;并且提出了专门针对视频的slice VAE&#xff0c;对于目前基于Unet结构的视频生成最好如SVD形成了降维打击&#xff0c;不论是生…

快消品经销商的仓库管理,有哪些是必须注意的事项?

快消品经销商仓库管理是一个复杂而关键的过程&#xff0c;它涉及到产品的存储、保管、发货以及库存控制等多个环节。一个高效的仓库管理系统不仅有助于减少成本&#xff0c;提高运营效率&#xff0c;还能确保产品质量和满足客户需求。以下是一些快消品经销商在仓库管理过程中需…

JDBC之API(DriverManager)详解

之前在 JDBC 的快速入门写代码的时候&#xff0c;遇到了很多的API。这篇博客主要学习一些API。 目录 一、API&#xff08;介绍&#xff09; 二、JDBC之API——DriverManager &#xff08;1&#xff09;DriverManager &#xff08;获取 Connection 的连接对象&#xff09; 1、…

玩转热门游戏,选对系统是关键!游戏专用电脑系统在这里!

如果我们给电脑安装上游戏专用系统&#xff0c;那么就能体验到更加流畅、稳定的游戏运行环境&#xff0c;享受沉浸式的游戏体验。但是&#xff0c;许多新手用户不知道去哪里才能下载到玩游戏专用的电脑系统&#xff1f;接下来小编给大家分享玩游戏专用电脑系统&#xff0c;这些…

Windows应急响应靶机 - Web2

一、靶机介绍 应急响应靶机训练-Web2 前景需要&#xff1a;小李在某单位驻场值守&#xff0c;深夜12点&#xff0c;甲方已经回家了&#xff0c;小李刚偷偷摸鱼后&#xff0c;发现安全设备有告警&#xff0c;于是立刻停掉了机器开始排查。 这是他的服务器系统&#xff0c;请你…

【YOLOv5/v7改进系列】引入特征融合网络——ASFYOLO

一、导言 ASF-YOLO结合空间和尺度特征以实现精确且快速的细胞实例分割。在YOLO分割框架的基础上&#xff0c;通过引入尺度序列特征融合(SSFF)模块来增强网络的多尺度信息提取能力&#xff0c;并利用三重特征编码器(TFE)模块融合不同尺度的特征图以增加细节信息。此外&#xff…

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址&#xff1a;一套上手ClickHouse-OLAP分析引擎&#xff0c;囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…

前端基础操作1——利用nvm任意切换(管理)node版本

在实际前端项目开发过程中&#xff0c;同时开发多个项目或者切换新项目时&#xff0c;因为node版本问题造成项目无法运行的问题比比皆是&#xff0c;这时候通过nvm管理切换不同版本的node&#xff0c;就能很快进入开发模式&#xff0c;避免因为环境问题浪费大量精力&#xff0c…

太爱这种数据可视化效果,零售行业的都看过来

在当今数字化浪潮下&#xff0c;数据可视化已成为零售行业洞察市场趋势、优化运营决策的关键技术。奥威BI零售数据分析方案凭借其卓越的数据可视化效果&#xff0c;成为零售企业的得力助手。接下来就通过BI节假日分析报表来简单地感受一下。 注&#xff1a;该BI节假日分析报表…

ArcGIS消除碎图斑

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 这次是上次 我们经常在相交、标识、更新等操作后或者是栅格转矢量可能存在很多的细碎图斑&#…

反激开关电源输出整流二极管选型及计算

1、电压 输出整流二极管电压应力&#xff1a;VoutVin/n尖峰电压余量5373/14.22010&#xff08;选60V左右的二极管&#xff09; 通常为了降低电压尖峰&#xff0c;需要在二极管上加RC吸收&#xff0c;来降低尖峰 2、电流 整流二极管的电流也是需要根据变压器输出绕组的峰值电流来…

深度学习500问——Chapter12:网络搭建及训练(3)

文章目录 12.3.5 Caffe有哪些接口 12.4 网络搭建有什么原则 12.4.1 新手原则 12.4.2 深度优先原则 12.4.3 卷积核size一般为奇数 12.4.4 卷积核不是越大越好 12.5 有哪些经典的网络模型值得我们去学习的 12.6 网络训练有哪些技巧 12.6.1 合适的数据集 12.6.2 合适的预…

console.log日志展示

console.log日志展示 1.特定颜色打印 console.log("%caaa","color:#1e80ff") 解释&#xff1a;重点就是%c和color。

IDEA2023中使用run Dashboard面板?实现批量运行微服务

1、直接点击Add service--->Run Configuration Type---->Spring Boot 2、这样就出现了run Dashboard面板&#xff0c;可同时运行多个工程模块&#xff0c;shift选中所有启动类组命名&#xff08;Group Configurations&#xff09; 3、启动所有的项目