【TB作品】MSP430F5529 单片机,简单电子琴

使用MSP430制作一个简单电子琴

作品功能

这个项目基于MSP430单片机,实现了一个简单的电子琴。通过按键输入,电子琴可以发出对应的音符声音。具体功能包括:

  1. 按下按键时发出对应音符的声音。
  2. 松开按键时停止发声。
  3. 支持C调低音、中音和高音。

硬件材料

  1. MSP430 单片机
  2. 蜂鸣器
  3. 矩阵键盘

电子元器件如何连接

按键

  • 按键1 接 P1.3
  • 按键2 接 P1.4
  • 按键3 接 P1.5
  • 按键4 接 P2.0
  • 其他按键 P1.0 P1.1 P1.2

蜂鸣器

  • 蜂鸣器控制引脚 接 P2.2

代码讲解

1. 宏定义和函数声明

定义了延时函数和不同音调的频率宏,提供了音符与频率之间的映射。

c 复制代码
#include <msp430.h>

#define SYSCLK  1000000
#define CPU_F   ( (double) 1000000)                                                    
#define delay_us(x) __delay_cycles((long)(CPU_F * (double)x / 1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F * (double)x / 1000.0))

#define L1  262
#define L2  286
#define L3  311
#define L4  349
#define L5  392
#define L6  440
#define L7  494
#define Z1  523
#define Z2  587
#define Z3  659
#define Z4  698
#define Z5  784
#define Z6  880
#define Z7  987
#define H1  1046
#define H2  1174
#define H3  1318
#define H4  1396
#define H5  1567
#define H6  1760
#define H7  1975

#define IN1 (P1IN & BIT3)
#define IN2 (P1IN & BIT4)
#define IN3 (P1IN & BIT5)
#define IN4 (P2IN & BIT0)


const char map[] = { 12, 9, 6, 3, 11, 8, 5, 2, 10, 7, 4, 1 };
int fre_st[] = { L1, L2, L3, L4, L5, L6, L7, Z1, Z2, Z3, Z4, Z5, Z6, Z7, H1, H2, H3, H4, H5, H6, H7 };

2. 主函数

初始化系统时钟、按键、蜂鸣器等模块。通过循环检测按键输入,根据按键播放对应的音调。按下按键时蜂鸣器发声,松开按键时停止发声。

c 复制代码
int main(void) {
    char key;

    WDTCTL = WDTPW + WDTHOLD; // Stop WDT

    if (CALBC1_1MHZ == 0xFF) { // If calibration constant erased
        while (1); // do not load, trap CPU!!
    }
    DCOCTL = 0; // Select lowest DCOx and MODx settings
    BCSCTL1 = CALBC1_1MHZ; // Set range
    DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation

    // 定时器中断初始化
    CCTL0 = CCIE; // CCR0 interrupt enabled
    CCR0 = 0;
    TACTL = TASSEL_2 + MC_0; // SMCLK, upmode

    // 键盘引脚初始化
    P1SEL = 0;
    P1DIR |= (BIT0 + BIT1 + BIT2); // P1.0, P1.1, P1.2是输出
    P1OUT |= (BIT0 + BIT1 + BIT2); // P1.0, P1.1, P1.2输出高电平

    P1DIR &= ~(BIT3 + BIT4 + BIT5);
    P1REN |= (BIT3 + BIT4 + BIT5);
    P1OUT |= (BIT3 + BIT4 + BIT5);

    P2DIR &= ~(BIT0);
    P2REN |= (BIT0);
    P2OUT |= (BIT0);

    // 蜂鸣器引脚初始化
    P2DIR |= BIT2; // P2.2 output
    P2SEL |= BIT2; // P2.2 for TA1.1 output

    while (1) {
        key = get_key(); // 获取按键
        if (key) {
            key = map[key - 1];
            TA1CCR0 = SYSCLK / fre_st[key - 1]; // 选一个频率
            TA1CTL = TASSEL_2 + MC_1; // SMCLK, up mode
        } else {
            TA1CTL = TASSEL_2 + MC_0; // 停止蜂鸣器
        }
    }
}

全部代码

cpp 复制代码
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
相关推荐
芯岭技术1 天前
PY32MD310单片机:高性能、低功耗的32位电机控制微控制器
单片机·嵌入式硬件
小龙报1 天前
【51单片机】深度解析 51 串口 UART:原理、配置、收发实现与工程化应用全总结
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·51单片机
Lester_11011 天前
STM32 高级定时器PWM互补输出模式--如果没有死区,突然关闭PWM有产生瞬间导通的可能吗
stm32·单片机·嵌入式硬件·嵌入式软件
小李独爱秋1 天前
“bootmgr is compressed”错误:根源、笔记本与台式机差异化解决方案深度指南
运维·stm32·单片机·嵌入式硬件·文件系统·电脑故障
进击的小头1 天前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
宵时待雨2 天前
STM32笔记归纳8:时钟
笔记·stm32·单片机·嵌入式硬件
JJRainbow2 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
宁静致远20212 天前
STM32模拟IIC读取PCF8563
stm32·单片机·嵌入式硬件
三佛科技-134163842122 天前
宠物洗澡打泡机方案,宠物泡泡机MCU方案开发设计分享
单片机·嵌入式硬件·物联网·智能家居·pcb工艺·宠物
芯岭技术2 天前
低成本315/433M接收芯片 XL420 SOP8封装,支持 1527 等常见 OOK编码
单片机·嵌入式硬件