【TB作品】玩具电子琴,ATMEGA128单片机,Proteus仿真

题目 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

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

玩具电子琴设计与实现

本文介绍了一款基于单片机的玩具电子琴的设计与实现。该电子琴能够发出中音八个音阶的音乐信号,具备弹奏和音符显示功能,同时能够通过按键控制音量大小,并显示当前音量。

1. 功能介绍

  1. 具有8个音阶按键,每按下一个按键时,扬声器发声,并点亮对应的LED。
  2. 数码管显示当前音符(用数字表示,简谱)。
  3. 通过按键控制音量大小,并在数码管上显示当前音量。
  4. 音阶频率信号由单片机产生。

2. 硬件设计

2.1 按键扫描

按键扫描采用PINE端口的8个输入,每个按键对应一个输入引脚。当按键按下时,扫描函数keyscan返回对应按键的编号。

c 复制代码
unsigned char keyscan( void )
{
    if ( (PINE & 0x01) == 0 )
        return(1);
    if ( (PINE & 0x02) == 0 )
        return(2);
    if ( (PINE & 0x04) == 0 )
        return(3);
    if ( (PINE & 0x08) == 0 )
        return(4);
    if ( (PINE & 0x10) == 0 )
        return(5);
    if ( (PINE & 0x20) == 0 )
        return(6);
    if ( (PINE & 0x40) == 0 )
        return(7);
    if ( (PINE & 0x80) == 0 )
        return(8);
    return(0);
}
2.2 数码管显示

数码管采用共阴极数码管,通过端口PD和PG控制显示。xianshi数组用于存储需要显示的数字,LEDData数组用于存储对应段选的数据。

c 复制代码
unsigned char xianshi[2];
unsigned char LEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

定时器0用于数码管的动态扫描,每隔一段时间切换显示。

c 复制代码
char i=0;
#pragma interrupt_handler  TIMER0_ISR:17
void TIMER0_ISR(void)
{
    TCNT0 = 10;
    i++;
    if(i==2)i=0;
    
    PORTD = 0XFF;  
    if(i==0)
    {
        PORTG &= ~0x08;
        PORTG |= 0x04;
        PORTD = ~xianshi[0];
    }
    if(i==1)
    {
        PORTG &= ~0x04;
        PORTG |= 0x08;
        PORTD = ~xianshi[1];
    }
}
2.3 PWM信号产生

PWM信号用于控制扬声器发声,通过设置定时器1的输出比较寄存器OCR1A和周期寄存器ICR1来生成不同频率的音阶。

c 复制代码
void Set_waveform_parameters( unsigned int mu_volume, unsigned int fre_t )
{
    if ( mu_volume == 0 || fre_t == 0 )
    {
        OCR1A = 0;
        ICR1 = 0;
        return;
    }
    
    ICR1 = 57600 / fre_t;
    OCR1A = mu_volume * 5060 / fre_t;
}

3. 软件设计

在主程序中,首先进行初始化设置,包括按键端口、数码管端口、LED端口、PWM端口的配置。然后进入主循环,不断扫描按键,更新音量和数码管显示。

c 复制代码
void main( void )
{
    unsigned char key;
    delay_nms( 100 );

    DDRE = 0x00;
    PORTE = 0xff;
    
    DDRG &= ~0x03;
    PORTG |= 0x03;
    
    DDRF = 0XFF;
    PORTF = 0XFF;
    
    DDRD = 0XFF;   
    PORTD = 0XFF;  
    DDRG |= 0x0C;
    PORTG |= 0x0C;
    

    xianshi[0]=0x00;
    xianshi[1]=LEDData[mu_volume];

    while ( 1 )
    {
        key = keyscan();
        if ( key != 0 )
        {
            Set_waveform_parameters( mu_volume, tone_freq[key - 1] );
            xianshi[0] = LEDData[key];
            
            PORTF = ~(0x01 << (key - 1));
            while ( keyscan() != 0 )
                ;
            PORTF = 0XFF;
            Set_waveform_parameters( 0, 0 );
            xianshi[0] = 0x00;
        }

        if ( (PING & 0x01) == 0 )
        {
            if ( mu_volume < 9 )
                mu_volume++;
            xianshi[1] = LEDData[mu_volume];
            while ( (PING & 0x01) == 0 )
                ;
        }
        if ( (PING & 0x02) == 0 )
        {
            if ( mu_volume > 1 )
                mu_volume--;
            xianshi[1] = LEDData[mu_volume];
            while ( (PING & 0x02) == 0 )
                ;
        }
    }
}

4. 总结

本文介绍的玩具电子琴通过单片机实现了音阶发声、音符显示和音量控制功能。硬件设计包括按键扫描、数码管显示和PWM信号产生,软件设计则包括按键处理、音量控制和定时器中断处理。该设计不仅实现了基本功能,还具有较好的扩展性,可以根据需要添加更多功能。

资源:

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
相关推荐
scan12 小时前
单片机串口接收状态机STM32
stm32·单片机·串口·51·串口接收
Qingniu012 小时前
【青牛科技】应用方案 | RTC实时时钟芯片D8563和D1302
科技·单片机·嵌入式硬件·实时音视频·安防·工控·储能
深圳市青牛科技实业有限公司4 小时前
【青牛科技】应用方案|D2587A高压大电流DC-DC
人工智能·科技·单片机·嵌入式硬件·机器人·安防监控
Mr.谢尔比5 小时前
电赛入门之软件stm32keil+cubemx
stm32·单片机·嵌入式硬件·mcu·信息与通信·信号处理
LightningJie5 小时前
STM32中ARR(自动重装寄存器)为什么要减1
stm32·单片机·嵌入式硬件
西瓜籽@5 小时前
STM32——毕设基于单片机的多功能节能窗控制系统
stm32·单片机·课程设计
远翔调光芯片^138287988728 小时前
远翔升压恒流芯片FP7209X与FP7209M什么区别?做以下应用市场摄影补光灯、便携灯、智能家居(调光)市场、太阳能、车灯、洗墙灯、舞台灯必看!
科技·单片机·智能家居·能源
极客小张8 小时前
基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路
stm32·单片机·嵌入式硬件·mqtt·sqlite·毕业设计·智能充电桩
m0_7393128711 小时前
【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)
stm32·单片机·嵌入式硬件
徐嵌13 小时前
STM32项目---水质水位检测
stm32·单片机·嵌入式硬件