2024-09-01
售卖作品
00

目录

玩具电子琴设计
设计背景
具体功能要求
硬件设计
软件设计
延时函数
按键检测
数码管驱动
PWM信号生成
主程序
总结

题目 7 :玩具电子琴

基于单片机设计一能够发出中音八个音阶的音乐信号的电子琴,能够实现弹奏和音符显示功

能。

具有 8 个音阶按键,每按下一个按键时,所对应的 LED 点亮,音符进行显示。

具体要求如下:

(1)具有 8 个音阶按键,每按下一个按键时,扬声器发声,所对应的 LED 点亮。

(2)数码管显示当前的音符(用数字表示,简谱)。

(3)可通过单片机控制音量大小,并进行音量显示。

(4)音阶频率信号由单片机产生。

表 2 音阶/频率对照表

音阶 1 2 3 4 5 6 7 1

频率/Hz 262 294 330 349 392 440 494 523

可添加符合题目背景的其它合理功能。

在这里插入图片描述

玩具电子琴设计

这篇博客将介绍基于单片机设计的一款玩具电子琴,该电子琴能够发出中音八个音阶的音乐信号,并具有弹奏和音符显示的功能。项目基于AVR单片机实现,主要包括按键检测、音阶生成、音量控制和数码管显示等功能。

设计背景

在音乐教育和娱乐中,电子琴是一种常见的乐器。为了提高音乐学习的兴趣和趣味性,设计一款简易的玩具电子琴是一个非常有意义的项目。本设计通过按键触发音阶的生成,并利用数码管显示当前音符,同时可以通过单片机控制音量大小。

具体功能要求

  1. 按键检测:具有8个音阶按键,每按下一个按键时,扬声器发声,所对应的LED点亮。

  2. 音符显示:数码管显示当前的音符(用数字表示,简谱)。

  3. 音量控制:可通过单片机控制音量大小,并进行音量显示。

  4. 音阶频率生成:音阶频率信号由单片机产生。

硬件设计

硬件部分主要包括单片机、按键、LED、数码管和扬声器。下图展示了主要的硬件连接。

+-------------+ +---------+ | AVR MCU | <----> | 按键 | +-------------+ +---------+ | | | | | | | | v v v v +--------+ +---------+ | LED | | 数码管 | +--------+ +---------+ | v +---------+ | 扬声器 | +---------+

软件设计

软件设计包括按键检测、延时函数、PWM信号生成、数码管驱动等模块。以下是主要的代码模块和功能介绍。

延时函数

延时函数用于产生不同的时间间隔,用于按键消抖和音频信号的控制。

c
void delay_us(void) { // 微秒级延时,具体实现略 } void delay_nms(unsigned int nms) { while (nms--) { delay_us(); } }

按键检测

按键检测函数用于读取按键状态,根据按键输入确定当前音符和音量控制。

c
unsigned char getKey(void) { if ((PIND & 0x01) == 0) return 1; if ((PIND & 0x02) == 0) return 2; // 检测其他按键 return 0; }

数码管驱动

数码管驱动函数用于控制数码管显示当前的音符。

c
void Write_Max7219(unsigned char address, unsigned char dat) { // 具体实现略 } void Init_MAX7219(void) { Write_Max7219(0x09, 0xff); Write_Max7219(0x0a, 0x03); Write_Max7219(0x0b, 0x07); Write_Max7219(0x0c, 0x01); Write_Max7219(0x0f, 0x00); }

PWM信号生成

PWM信号用于控制扬声器的音频输出,实现不同频率的音符生成。

c
void setPWM(unsigned int yinliang, unsigned int pinlv) { if (yinliang == 0 || pinlv == 0) { OCR1A = 0; ICR1 = 0; return; } ICR1 = 57600 / pinlv; OCR1A = yinliang * 10520 / pinlv; }

主程序

主程序初始化各个模块,并在循环中检测按键输入,根据按键触发相应的功能。

c
void main(void) { unsigned char key; delay_nms(100); DDRD = 0x00; // 方向控制 PORTD = 0xff; DDRA = 0xFF; // portA引脚全部输出 DDRF = 0xFF; // 小灯全部输出 PORTF = 0xFF; // 全部熄灭 Init_MAX7219(); // 数码管芯片初始化 Write_Max7219(1, 0); Write_Max7219(3, 2); // 默认音量显示 while (1) { key = getKey(); // 获取按键 if (key != 0) { setPWM(2, 262); // 设置PWM输出音频信号 Write_Max7219(1, key); PORTF = ~(0x01 << (key - 1)); // 点亮对应的LED while (getKey() != 0) ; PORTF = 0xFF; // 全部熄灭 setPWM(0, 0); // 关闭PWM Write_Max7219(1, 0); } } }

总结

通过本次设计,我们实现了一款具有基本功能的玩具电子琴。该电子琴可以发出八个音阶的音乐信号,具备音符显示和音量控制功能。通过进一步优化和扩展,还可以增加更多的功能,如多音符和弦、预设曲目播放等。

这个项目不仅提高了我们对单片机编程的理解,也增加了我们对音乐信号处理的认识。希望这款电子琴能够带给大家更多的乐趣和启发。

资源:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2

视频:

链接:https://pan.baidu.com/s/1QP7BdwvnJwhawF4UXoHPyg?pwd=3qvz 提取码:3qvz
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!