【TB作品】20以内加减法训练机,ATMEGA128单片机,Proteus仿真

news/2024/7/7 19:12:30 标签: 单片机, proteus, 电子琴, atmega128

题目 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信号生成、数码管驱动等模块。以下是主要的代码模块和功能介绍。

延时函数

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

void delay_us(void) {
    // 微秒级延时,具体实现略
}

void delay_nms(unsigned int nms) {
    while (nms--) {
        delay_us();
    }
}
按键检测

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

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

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

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信号用于控制扬声器的音频输出,实现不同频率的音符生成。

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;
}

主程序

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

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 

http://www.niftyadmin.cn/n/5534873.html

相关文章

如何在PhpStorm中运行SQL文件?

如何在PhpStorm中运行SQL文件&#xff1f; 提问&#xff1a;如何在PhpStorm中运行SQL文件&#xff1f; 解答&#xff1a;本文将详细介绍如何在PhpStorm中运行SQL文件的步骤&#xff0c;包括如何配置数据库连接和执行SQL脚本&#xff0c;并附带示例SQL代码。 1. 配置数据库连…

golang实现网卡流量监控

获取当前时刻一分钟前的网卡流量排序 package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""sort""strconv""time" )var arr []map[string]int var arr2 []map[string]…

JavaScript——属性的增删改查

目录 任务描述 相关知识 属性的获取 方式一 方式二 属性的修改与新增 删除属性 编程要求 任务描述 Luma Restaurant 以前的财务人员在统计销售额的时候不小心把数据弄错了&#xff0c;现在的财务人员想通过一个 JavaScript 函数方便的修改数据&#xff0c;并署上自己的…

基于 Windows Server 2019 部署域控服务器

文章目录 前言1. 域控服务器设计规划2. 安装部署域控服务器2.1. 添加 Active Directory 域服务2.2. 将服务器提升为域控制器2.3. 检查域控服务器配置信息 3. 管理域账号3.1. 新建域管理员账号3.2. 新建普通域账号 4. 服务器加域和退域4.1. 服务器加域操作4.2. 服务器退域操作 总…

word图题表题公式按照章节编号(不用题注)

预期效果&#xff1a; 其中3表示第三章&#xff0c;4表示第3章里的第4个图。标题、公式编号也是类似的。 为了达到这种按照章节编号的效果&#xff0c;原本可以用插入题注里的“包含章节编号” 但实际情况是&#xff0c;这不仅需要一级标题的序号是用“开始->多级列表”自动…

Spring Boot 学习第八天:AOP代理机制对性能的影响

1 概述 在讨论动态代理机制时&#xff0c;一个不可避免的话题是性能。无论采用JDK动态代理还是CGLIB动态代理&#xff0c;本质上都是在原有目标对象上进行了封装和转换&#xff0c;这个过程需要消耗资源和性能。而JDK和CGLIB动态代理的内部实现过程本身也存在很大差异。下面将讨…

CSS filter(滤镜)属性,并实现页面置灰效果

目录 一、filter&#xff08;滤镜&#xff09;属性 二、准备工作 三、常用的filter属性值 1、blur(px) 2、brightness(%) 3、contrast(%) 4、grayscale(%) 5、opacity(%) 6、saturate(%) 7、sepia(%) 8、invert(%) 9、hue-rotate(deg) 10、drop-shadow(h-shadow v…

flutter开发实战-ListWheelScrollView与自定义TimePicker时间选择器

flutter开发实战-ListWheelScrollView与自定义TimePicker 最近在使用时间选择器的时候&#xff0c;需要自定义一个TimePicker效果&#xff0c;当然这里就使用了ListWheelScrollView。ListWheelScrollView与ListView类似&#xff0c;但ListWheelScrollView渲染效果类似滚筒效果…