STM32制作音乐盒

前言

        STM32F103C8T6是一款基于ARM Cortex-M3内核的32位微控制器,由意法半导体公司(STMicroelectronics)生产。STM32F103C8T6以其高性能、低功耗、低成本和丰富的外设接口,成为嵌入式系统设计中广泛使用的微控制器之一。

  1. 基本参数

    • CPU:ARM Cortex-M3 32位RISC内核
    • 最大主频:72MHz
    • 程序存储器容量:64KB Flash存储器
    • RAM容量:20KB SRAM
    • 电压-电源(Vcc/Vdd):2V ~ 3.6V
    • 工作温度:-40°C ~ 85°C
  2. 外设与接口

    • 支持多种通信接口,包括SPI、I2C、USART等
    • 具有12位ADC转换器,最大采样速率为1Msps
    • 具有37个GPIO引脚
    • 还包括DMA、电机控制PWM、温度传感器等外围设备
  3. 性能特点

    • 高性能:采用ARM Cortex-M3内核,支持多种外设,可应用于智能家居、工业自动化、电机控制等领域
    • 低功耗:采用低功耗技术,待机模式下消耗极少的电量,可节省电池使用寿命
    • 低成本:性价比较高,满足大多数应用场景的需求
  4. 封装与尺寸

    • 封装/外壳:48-LQFP
    • 高度: 1.4 mm
    • 长度: 7 mm
  5. 其他参数

    • 定时器:具有多个定时器,包括基本定时器、高级定时器和通用定时器
    • 封装类型:STM32F103xx中密度性能线系列包括六种不同封装类型的设备,从36针到100针

  1.功能初始化

              主要包含对按键、LED、定时器以及所要播放的音乐进行低中高音、PWM脉宽和OLED显示屏初始化。

              1、通过按键控制操作,K1播放下一首、K2播放下一首的按键操作。

              2、接收到按键操作命令,做出相应的音乐。

              3、正在播放的音乐会通过OLED显示屏显示。

              4.LED亮起显示音乐播放。

2.硬件简介

   2.1连接扬声器/蜂鸣器

        将扬声器或蜂鸣器的正极连接到STM32的GPIO引脚(如PA0),并在扬声器/蜂鸣器的负极与STM32的GND之间连接一个适当的电阻(如8Ω扬声器可接100Ω电阻)。

   2.2电源连接

        4使用USB线将STM32开发板连接到电脑或使用适当的电池供电

    3. 核心软件设计

        3.1功能描述

        主程序实现进行初始化后, 进入播放音乐环节。对音乐播放进行循环判断, 得到按键的命令后再进行按键播放。 按下K1则播放下首歌, 显示屏显示正在播放音乐名字。;按下K2则播放上一首歌。

        3.2核心代码

#include "stm32F4xx.h"
#include "stm32f4xx_conf.h"
#include "stdio.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "uart.h"
#include "ADC.h"
#include "bsp_lcd.h"
#include "bsp_sdram.h" 
#include "fonts.h"
#include "bsp_general_tim.h"
#include "lcd_show_zn.h"
#include "lcd_show_zn_font.h"
//µÍ
#define M0 0
#define M1 261
#define M2 293
#define M3 329
#define M4 349
#define M5 392
#define M6 440
#define M7 493
//ÖÐ
#define L0 0
#define L1 523
#define L2 587
#define L3 659
#define L4 698
#define L5 784
#define L6 880
#define L7 988
//¸ß
#define H0 0
#define H1 1046
#define H2 1175
#define H3 1318
#define H4 1397
#define H5 1568
#define H6 1760
#define H7 1976
 
int couter = 0;
uint8_t key1;
uint8_t key2;
uint8_t key2_data = 0;
uint8_t color = 0;
 
uint32_t delay_time =10000;
 
uint32_t system_time = 0;//±íʾµÄÊÇϵͳµÄ¿ª»úʱ¼ä£¬Ä¬ÈÏÊÇ0
uint8_t beep_state = 0;
uint8_t led_state1 = 0;
uint8_t led_state2 = 0;
 
 
uint16_t music1[][2]=
{//СÐÇÐÇ
{M1,500},{M1,500},{M5,500},{M5,500},{M6,500},{M6,500},{M5,500},{M0,500},
{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M2,500},{M1,500},{M0,500},
 
//{M5,500},{M5,5{M5,500},{M5,500},{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M0,500},00},{M4,500},{M4,500},{M3,500},{M3,500},{M2,500},{M0,500},
 
};
 
uint16_t music2[][2]={
//Сë¿
{M1,400},
{M1,400},
{M1,400},
{M3,400},
{M5,400},
{M5,400},
{M5,400},
{M5,400},
{M6,400},
{M6,400},
{M6,400},
{H1,400},
{M5,400},
{M0,500},
 
{M4,400},
{M4,400},
{M4,400},
{M6,400},
{M3,400},
{M3,400},
{M3,400},
{M3,400},
{M2,400},
{M2,400},
{M2,400},
{M2,400},
{M5,400},
{M0,1000},
 
{M5,400},
{M1,400},
{M1,400},
{M1,400},
{M3,400},
{M5,400},
{M5,400},
{M5,400},
{M5,400},
{M6,400},
{M6,400},
{M6,400},
{H1,500},
{M5,400},
{M0,1000},
 
};
 
uint16_t music3[][2]={
//ÉúÈÕ¿ìÀÖ
{M5,500},
{M5,500},
{M6,500},
{M5,500},
{H1,500},
{M7,500},
{M0,500},
 
{M5,500},
{M5,500},
{M6,500},
{M5,500},
{H2,500},
{H1,500},
{M0,500},
 
//{M5,500},
//{M5,500},
//{H5,500},
//{H3,500},
//{H1,500},
//{M7,400},
//{M6,400},
//{M0,500},
 
};
void play1()
{
    static uint16_t i = 0;
    static uint16_t dekay = 0;
    //delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
    if(dekay == 0)
        PWM_SetFrequency(music1[i][0]);//²¥·Å¸ÃÒô·û
    
    //¼ÆËã¸ÃÒô·ûÒѾ­²¥·ÅµÄʱ¼ä
    dekay+=10;
    //Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
    if(dekay>=music1[i][1])
    {
        //Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
    dekay = 0;
        //²¥·ÅÏÂÒ»¸öÒô·û
    i++;
    if(i>24)//дÁ˶àÉپʹóÓÚ¶àÉÙ
        i = 0;
    }
}
 
void play2()
{
    static uint16_t i = 0;
    static uint16_t dekay = 0;
    //delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
    if(dekay == 0)
        PWM_SetFrequency(music2[i][0]);//²¥·Å¸ÃÒô·û
    
    //¼ÆËã¸ÃÒô·ûÒѾ­²¥·ÅµÄʱ¼ä
    dekay+=10;
    //Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
    if(dekay>=music2[i][1])
    {
        //Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
    dekay = 0;
        //²¥·ÅÏÂÒ»¸öÒô·û
    i++;
    if(i>22)//дÁ˶àÉپʹóÓÚ¶àÉÙ
        i = 0;
    }
}
void play3()
{
    static uint16_t i = 0;
    static uint16_t dekay = 0;
    //delayµÈÓÚ0±íʾ¿ªÊ¼²¥·ÅÕâ¸öÒô·û
    if(dekay == 0)
        PWM_SetFrequency(music3[i][0]);//²¥·Å¸ÃÒô·û
    
    //¼ÆËã¸ÃÒô·ûÒѾ­²¥·ÅµÄʱ¼ä
    dekay+=10;
    //Èç¹û¸ÃÒô·û²¥·Åʱ¼ä´ú
    if(dekay>=music3[i][1])
    {
        //Çå¿Õͳ¼ÆÊ±¼äµÄ±äÁ¿
    dekay = 0;
        //²¥·ÅÏÂÒ»¸öÒô·û
    i++;
    if(i>14)//дÁ˶àÉپʹóÓÚ¶àÉÙ
        i = 0;
    }
}
 
//±àдÖжϷþÎñº¯Êý key1
void EXTI0_IRQHandler()
{    
        if(EXTI_GetITStatus(EXTI_Line0) != RESET)//Ö¤Ã÷
        {    
        //100ms = 100 000us
        color++;
        if(color>2)
            color = 0;
 
        EXTI_ClearITPendingBit(EXTI_Line0);        
     }
}
//±àдÖжϷþÎñº¯Êý key2
void EXTI15_10_IRQHandler()
{    
        if(EXTI_GetITStatus(EXTI_Line13) != RESET)//Ö¤Ã÷
        {       
        key2_data++;
            if(color>2)
        color=0;
 
        EXTI_ClearITPendingBit(EXTI_Line13);        
        }
}
 
int main(void)
{
    GPIO_InitTypeDef gpio_info;
    TIMx_Configuration();
    GPIO_ResetBits(GPIOA,GPIO_Pin_5);
        LED_init();
        key1_init();     
        key2_init();
        Delay_init();
        UART_init(115200);
      ADC_init();
        ADC_GetValue();
 
                //¹Ø±Õ3¸öµÆ
                LED_Red_Ctrl(LED_OFF); //¹Ø
                LED_Blue_Ctrl(LED_OFF);//¹Ø
                LED_Green_Ctrl(LED_OFF);//¹Ø
    
    //ÆÁÄ»³õʼ»¯
    LCD_Init();
    //ÆÁÄ»ÏÔʾ²ã³õʼ»¯
    LCD_LayerInit();
    //LTCDÍâÉè³õʼ»¯
    LTDC_Cmd(ENABLE);
 
    /*°Ñ±³¾°²ãË¢³ÉºÚÉ«*/
    //Ñ¡¶¨¿ØÖƱ³¾°²ã
    LCD_SetLayer(LCD_BACKGROUND_LAYER);
    //Çå³ýÆÁÄ»²¢ÓúÚÉ«Ìî³ä
    LCD_Clear(LCD_COLOR_BLACK);
    
    /*³õʼ»¯ºóĬÈÏʹÓÃǰ¾°²ã*/
    LCD_SetLayer(LCD_FOREGROUND_LAYER);
    /*ĬÈÏÉèÖò»Í¸Ã÷£¬¸Ãº¯Êý²ÎÊýΪ²»Í¸Ã÷¶È£¬·¶Î§ 0-0xff,0Ϊȫ͸Ã÷£¬0xffΪ²»Í¸Ã÷*/
    LCD_SetTransparency(0xFF);
    //Çå³ýÆÁÄ»²¢ÓúÚÉ«Ìî³ä
    LCD_Clear(LCD_COLOR_BLACK);
        
#if 1
    //P11·äÃùÆ÷
    //³õʼ»¯GPIO¡ªIʱÖÓ
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOI,ENABLE);
    
    gpio_info.GPIO_Mode = GPIO_Mode_OUT;
    gpio_info.GPIO_OType = GPIO_OType_PP;
    gpio_info.GPIO_Pin = GPIO_Pin_11;
    gpio_info.GPIO_PuPd = GPIO_PuPd_UP;
    gpio_info.GPIO_Speed = GPIO_Low_Speed;
        GPIO_Init(GPIOI,&gpio_info);
#endif
 
    /*ÉèÖÃ×ÖÌåÑÕÉ«¼°×ÖÌåµÄ±³¾°ÑÕÉ«*/
    LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
    
    /*Ñ¡Ôñ×ÖÌå*/
    LCD_SetFont(&Font16x24);
    
    #define LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)
    
    while(1)                
    {
        Delay_ms(10);
 
      //¶ÁÈ¡°´¼ü״̬
    uint8_t key1 = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);    
        uint8_t key2 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);
        
        system_time = system_time + 10;//Â̵Æ
        if(system_time%1000 == 0)
        {        
                    if(beep_state == 0)//
                    {
                        LED_Green_Ctrl(LED_ON);    
                        beep_state = 1;
                    }
                    else
                    {
                        LED_Green_Ctrl(LED_OFF); 
                        beep_state = 0;
                    }        
        }    
            
            if(color == 0)
                {                    
                LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
                LCD_DispString_EN_CH(100,200,"Сë¿");
                LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");    
                LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
                LCD_DispString_EN_CH(100,100,"СÐÇÐÇ");
                }
            else if(color == 1)
            {
                LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
                LCD_DispString_EN_CH(100,100,"СÐÇÐÇ");
                LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
                LCD_DispString_EN_CH(100,200,"Сë¿");
            }
            else if(color == 2)
            {
                LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
                LCD_DispString_EN_CH(100,200,"Сë¿");
                LCD_SetColors(LCD_COLOR_BLACK,LCD_COLOR_WHITE);
                LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");
            }
            else if(color == 3)
            {
                LCD_SetColors(LCD_COLOR_WHITE,LCD_COLOR_BLACK);//×ÖÌå°×É« ±³¾°ºÚÉ«
                LCD_DispString_EN_CH(100,300,"ÉúÈÕ¿ìÀÖ");
            }        
                
        if(color == 0 && key2_data ==1)//ÒôÀÖ1
        {
            play1();    
 
        }        
        else if(color == 1 && key2_data ==2)
        {
            play2();    
        }
            
        else if(color == 2 && key2_data ==3)
        {                
            play3(); 
        }
            
        else if(color == 3 && key2_data ==4)
        {                
            play1();
        
        }        
    }
}

        4.结尾

        通过本博客,我们介绍了如何使用STM32F103C8T6制作一个简单的音乐盒。您可以根据自己的需求添加更多的音符和旋律,甚至可以添加一些控制功能,如通过按钮选择不同的歌曲或旋律。希望这个项目能激发您对嵌入式编程和音乐制作的兴趣!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值