您的当前位置:首页正文

基于单片机的音乐播放器

2023-02-13 来源:意榕旅游网
基于51单片机的音乐播放器制作

一、设计原理

乐曲中有不音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。 二、AT89C51简介 AT89C51:是一种4K字节FLASH存储器的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AAT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。 主要功能特性:

1)与MCS-51兼容;

2)4K字节可编程FLASH存储器; 3)全静态工作:0Hz-24MHz; 4)128×8位内部RAM;

5)两个16位定时器/计数器; 6)5个中断源;

7)可编程串行通道;

8)低功耗的闲置和掉电模式; 9)片内振荡器和时钟电路。

三、硬件结构

下图是以AT89C51单片机为核心的音乐播放器系统硬件设计结构图。该系统主要是由复位电路、按键电路、时钟电路、中心模块、扬声器驱动等组成。其工作原理为:此音乐播放器,有三个按键及控制按钮:播放/暂停、下一曲、上一曲;通过控制按钮控制单片机,播放所要求的音乐,并通过放大电路和喇叭输出声音。 三、简易仿真原理图 四、音乐发声设计原理 RESET 复4.1发声原理 位一首乐曲是由多个音符构成的。每个音符都对应着一个确定的频率,乐曲中不同的音符,P1.0-P1.5 电实质就是不同频率的声音;另外每个音符会根据乐曲的要求设定一个确定的节拍。可以控路制单片机不同频率不同节拍的脉冲信号,蜂鸣器发出就产生了美妙和谐的乐曲。 AT89C51 4.2单片机产生不同频率脉冲信号的原理 1、要产生音频脉冲,只要算出来某一个音频的脉冲(1/频率),然后将此周期除以P2.7 扬声器 2,即为半周期的时间,每当计时到后就降输出脉冲I/O反相,按利用定时器计时这半周期的时间,然后重复计时此半周期的时间再对I/O反相,就可以在I/O脚上得到此频率的脉冲。 键XTAL1 驱动 2、计算脉冲值与频率的关系公式如下:N=Fi/2/Fr 电其中N表示计数值;1uS,故其频率为1MHz;Fr表示要产生的频率。 路Fi表示内部计时一次为XTAL2 3、其计数值的求法如下:T=65536-N=65536-Fi/2/Fr 4、每个音符使用1个字节,字节高4位代表音符高低,低4位代表音符节拍。假设1/4节拍为1DELAY,则1拍应为4DELAY,以此类推。只要求得1/4拍的DELAY时间,其余节拍则为它的倍数,此设计取4/4调值,延时时间125ms,其中节拍码与实际节拍对照表如下表晶振 所示。 简谱 发音 频率(Hz) 计数初值 简谱码 5 低音SO 392 64260 1 6 低音LA 440 64400 2 7 低音SI 494 64524 3 1 中音DO 523 64580 4 2 中音RE 587 64684 5 3 中音MI 659 64777 6 4 中音FA 698 64820 7 5 中音SO 784 64898 8 6 中音LA 880 64968 9 7 中音SI 988 65030 A 1 高音DO 1046 65058 B 2 高音RE 1175 65110 C 3 高音MI 1318 65157 D 4 高音FA 1397 65178 E 5 高音SO 1568 65217 F 不发音 0 5、主程序流程图如图所示:

开始

否 停止发声 五、音乐播放程序设计 系统初始化 #include

扫描键盘得到键#include

#include

#define uchar unsigned char 判断键值 #define uint unsigned int #define w_c_add XBYTE[0x2070] /* 写命令字地址蜂鸣器发声 */ #define w_d_add XBYTE[0x2071] /* 写数据地址 */ #define r_s_add XBYTE[0x2072] /* 读状态字地址 */ 扫描键盘 #define r_d_add XBYTE[0x2073] /* 读数据地址 */ uchar code * song;

uchar code * song_name; 暂停是否按下 uchar code * song_lrc; uchar code

tab[]={0xf8,0x94,0xf9,0x5c,0xfa,0x1a,0xfa,0x6a,0xfb,0x00,0xfb,0x8c,0xfc,0x0e, 结束

0xfc,0x4a,0xfc,0xae,0xfd,0x08,0xfd,0x30,0xfd,0x80,0xfd,0xc6,0xfe,0x02,

0xfe,0x2a,0xfe,0x5c,0xfe,0x84,0xfe,0x98,0xfe,0xc0,0xfe,0xe8,0xfe,0x06}; uchar code

song_name3[18]={0xc7,0xfa,0xc4,0xbf,0xc8,0xfd,0xa1,0xc3,0xc9,0xfa,0xc8,0xd5,0xbf,0xec,0xc0,0xd6,0xff};//生日快乐

uchar code

song3[]={0xC4,0x12,0x32,0x44,0x42,0x52,0x52,0x44,0x32,0x32,0x12,0x14,

0x12,0x12,0x32,0x42,0x54,0x44,0x4F,0xC4,0x12,0x32,0x44,0x42,

0x72,0x58,0x42,0x32,0x34,0x14,0x12,0x32,0x34,0x12,0x1F,0xff};

uchar code song_lrc3[]={\"祝你生日快乐 祝你生日快乐 HAPPY BIRTHDAY TO YOU 祝你生日快乐\

因篇幅问题不能全部显示,请点此查看更多更全内容