技术文档

单片机 音乐程序 单片机实例分享,打造音乐频谱时钟

小编 2024-10-12 技术文档 23 0

单片机实例分享,打造音乐频谱时钟

(此处已添加圈子卡片,请到今日头条客户端查看)

电路原理

下面我们按各功能模块逐一给大家介绍一下这个制作的电路原理吧。

图25.1 时钟显示效果

图25.2 频谱显示效果

1.电源部分

电源电路如图25.3所示。

图25.3 电源部分的电路

电源模块采用了一支很常见的7805稳压芯片,再加一大一小两个电容进行滤波,输入端直接买了个9V/1A的电源适配器,方便省事。7805额定输出电流1A,对于这样的小系统来说,已经完全够用了。实际使用下来,7805发热不太大,无需加装散热片。为了使用方便,我在7805的输入端加装了一个开关和一个红色LED,分别作为系统电源开关和指示灯。

2.时钟、温度部分

这部分电路如图25.4所示。单片机采用的是STC89C52RC,考虑到成本和功能性问题,时钟部分我没有单独买时钟芯片,直接使用内部定时器中断作为时钟源,这直接导致的结果就是时钟误差稍大。经测试,每24小时误差在1分钟左右,作为一个功能性的DIY作品,就饶了它吧,呵呵……温度传感器采用的也是常用的DS18B20,相信大家都很熟悉。3个功能按键分别是时钟(闹铃)小时调整、时钟(闹铃)分钟调整和时钟/闹铃切换。

图25.4 时钟、温度部分的电路

为了跟“频谱”切题,时钟、温度的显示没有采用传统的数字表示,而是分别把时钟的小时、分钟的十位和个位分别用点来表示,每两列表示一位,每行表示一点,左下角是时钟,右上角是温度。是不是有点晕乎呢?其实只要你看了实物就会觉得很简单,文字的确不是很好表达。时钟没有单独设置“秒”的显示,为了增强显示效果,我特地在右下角设置了沙漏下落效果,每一秒钟下落一行。

3.频谱分析部分

电路如图25.5所示。这部分的制作跟“五色LED频谱”是一样的原理,都是把音频信号经AD采样,用快速傅里叶变换求出频点的幅值,再根据幅值大小来驱动相应的LED。只不过我设计的是每次采128个点,最后十六分频而已。单片机采用的是STC12C5A60S2,已经在信号输入端加了47pF的电容滤波,但还是发现有噪声。可能是因为使用的是洞洞板,还有就是走线过长的缘故。我试着加大了电容再次滤波,但直接导致低频响应变差,鉴于噪声不是很严重,最后只好作罢,将就一下了。

图25.5 频谱分析部分的电路

4.WAV 音乐播放部分

电路如图25.6所示。这部分应该是整个系统里面最复杂的了,WAV音乐播放部分是在数码之家论坛hit00版主的“WAV播放器”的基础上修改而来的。单片机选用的是STC12C5616AD,虽然该单片机自带有SPI接口,在一定程度上已经简化了程序,但SD卡文件的操作确实有难度。原来的程序里带有语音,受到单片机存储空间的限制,语音质量太差,没有“暂停”及”上一曲”功能。我去掉了语音,增加了暂停及上一曲功能。其中暂停功能的实现花了我不少时间,本来想当暂停的时候就让单片机进入死循环,开始的时候再跳出来,结果试了以后发现完全不是那么回事。单片机PWM信号的输出本来就用的中断,单片机进不进入死循环,中断还是一样的工作。要不就让它在暂停的时候掉电或是待机什么的呢?好吧,查STC12C5616AD的手册。一看手册我笑了,PCON电源控制寄存器不正是我想找的吗,单片机进入掉电模式,单片机状态维持当前值,呵呵……问题解决。功放部分采用了LM386功放芯片,直接引用了网上LM386的典型应用电路。

图25.6 WAV音乐播放部分的电路

5.显示部分

电路如图25.7所示。为了能有好的显示效果,显示部分用的是32×16的高亮度聚光蓝色LED组成的点阵屏,1kΩ电阻限流。全过程手工焊接,可能我焊得慢,整整焊了一晚上。焊接状态与电路细节如图25.8、图25.9所示。

图25.7 显示部分的电路

由于时钟部分跟频谱分析部分共用点阵屏,所以必须考虑两路信号的隔离分时显示。还有就是32列LED的列驱动问题。信号的隔离分时显示我用的是74HC573锁存器,通过控制OE端口将需要显示的信号线路的74HC573选通,而将另外一组信号通过74HC573的高阻态实现隔离。LED的列驱动选用的是74HC154(4线—16线译码器),只需一组I/O口就可实现32列LED的列驱动了。

到此,整个系统的介绍就完了,在这里特别感谢数码之家论坛的hit00版主在制作过程中给予的大力帮助。图25.10就是这个实物作品的全家福。

为了尽量减少干扰和连线,整个板子电源全是用焊锡走的线。信号线采用杜邦线和插针连接,方便调试。

虽然制作时觉得挺累,但当看到自己做的东西“跑”起来那一刻,就什么都值了,我相信每一个DIY爱好者都会有这种感觉吧,也许这就是DIY的乐趣。相关源程序可到qq群657864614进行下载。

图25.8 焊接状态

图25.9 电路细节

图25.10 完成的电路板实物

划重点:现收集整理了1300G电子技术资料,一口价68元,需要的朋友可以私聊我!

单片机六首歌曲的音乐门铃程序

;音乐门铃程序

buzzer equ p2.4

KEY EQU P3.7

org 00h ;主程序起始地址

jmp start ;跳动主程序

org 0bh ;timer0中断起始地址

jmp tim0 ;跳至timer0在mode1

start: MOV tmod,#00000001b ;设timer0在mode1

MOV ie,#10000010b ;中断使能

jb KEY,$ ;第一次按to?

call delay1 ;消除抖动

jnb KEY,$ ;to放开?

MOV 31h,#00 ;按to次数计数指针初值为00h

start0:

MOV 30h,#low song ;取简谱码指针(第1首)

next: MOV a,30h

MOV dptr,#table

MOVc a,@a+dptr ;至相关页码,高4位为音符的高低

MOV r2,a ;低4位为音符的节拍

jz end0 ;检查简谱码是否已结束(有无00?)

anl a,#0fh ;取节拍(低4位)

MOV r5,a ;存入r5,节拍的时间

MOV a,r2

swap a

anl a,#0fh ;取音频值(高4位)

jnz sing ;是否为0,是0则不发音

clr tr0

jmp d1

sing: dec a ;因0不列入

MOV 22h,a ;存入(22h)

rl a ;乘2

MOV dptr,#table

MOVc a,@a+dptr ;至table取码,取t的值

MOV th0,a ;取到的高位字节存入th0

MOV 21h,a ;取到的高位字节存入(21h)

MOV a,22h ;再载入取到的音符码

rl a ;乘2

inc a ;加1

MOVc a,@a+dptr ;至table取相对的低位字节计数值

MOV tl0,a ;取到的低位字节存入tl0

MOV 20h,a ;取到的低位字节存入(20h)

setb tr0 ;启动timer0

d1: call delay

inc 30h ;取简谱码指针加1

jmp next

end0: clr tr0 ;停止计数器

MOV a,31h ;载入计次指针

xrl a,#00h ;是否按第1次?

jnz end1 ;不是则跳至end1

jb KEY,$ ;按第2次?

call delay1 ;消除抖动

jnb KEY,$ ;放开否?

inc 31h ;计次地址(31h)加1

MOV 30h,#low song1 ;第2首歌指针

jmp next

end1:

MOV a,31h ;载入计次指针

xrl a,#01h ;是否按第2次?

jnz end2 ;不是则跳至end2

jb KEY,$ ;按第3次?

call delay1 ;消除抖动

jnb KEY,$ ;放开否?

inc 31h ;计次地址(31h)加1

MOV 30h,#low song2 ;第3首歌指针

jmp next

end2:

MOV a,31h ;载入计次指针

xrl a,#02h ;是否按第3次?

jnz end3 ;不是则跳至end3

jb KEY,$ ;按第4次?

call delay1 ;消除抖动

jnb KEY,$ ;放开否?

inc 31h ;计次地址(31h)加1

MOV 30h,#low song3 ;第4首歌指针

jmp next

end3:

MOV a,31h ;载入计次指针

xrl a,#03h ;是否按第4次?

jnz end4 ;不是则跳至end4

jb KEY,$ ;按第5次?

call delay1 ;消除抖动

jnb KEY,$ ;放开否?

inc 31h ;计次地址(31h)加1

MOV 30h,#low song4 ;第5首歌指针

jmp next

end4:

MOV a,31h ;载入计次指针

xrl a,#01h ;是否按第5次?

jnz end5 ;不是则跳至end2

jb KEY,$ ;按第6次?

call delay1 ;消除抖动

jnb KEY,$ ;放开否?

inc 31h ;计次地址(31h)加1

MOV 30h,#low song5 ;第6首歌指针

jmp next

end5:

jmp start ;回到第1次位置

tim0: push acc ;将a的值暂存于堆栈

push psw ;将psw的值暂存于堆栈

setb rs0 ;设工作寄存器库1,rs0=1,rs1=0

clr rs1

MOV tl0,20h ;重设计数值

MOV th0,21h

cpl buzzer ;将p10位反相

clr rs0

pop psw ;至堆栈取回psw的值

pop acc ;至堆栈取回a的值

reti ;返回主程序

delay: MOV r7,#02 ;125秒

d2: MOV r4,#125

d3: MOV r3,#248

djnz r3,$

djnz r4,d3

djnz r7,d2

djnz r5,delay ;决定节拍

ret

delay1: MOV r4,#20

d4: MOV r3,#248

djnz r3,$

djnz r4,d4

ret

org 300h

table:

dw 64260,64400,64524,64580

dw 64684,64777,64820,64898

dw 64968,65030,65058,65110

dw 65157,65178,65217

song: ;第一首歌 哈 巴 狗

;1

db 42h,42h,42h,52h,62h,04h

db 62h,62h,62h,72h,84h,04h

db 92h,92h,82h,72h,64h,04h

db 82h,82h,52h,62h,44h,04h

;2

db 42h,42h,42h,52h,62h,04h

db 62h,62h,62h,72h,84h,04h

db 92h,92h,82h,72h,64h,04h

db 82h,82h,52h,62h,44h,04h

db 00h

song1: ;第2首歌 生 日 快 乐

;1

db 82h,01h,81h,94h,84h

db 0b4h,0a4h,04h

db 82h,01h,81h,94h,84h

db 0c4h,0b4h,04h

;2

db 82h,01h,81h,0f4h,0d4h

db 0b4h,0a4h,94h

db 0e2h,01h,0e1h,0d4h,0b4h

db 0c4h,0b4h,04h

db 00h

song2: ;第3首歌 不 倒 翁

;1

db 84h,94h,88h

db 64h,54h,68h

db 84h,64h,54h,44h

db 52h,42h,52h,62h,48h

;2

db 84h,94h,88h

db 64h,54h,68h

db 84h,64h,54h,44h

db 52h,42h,52h,62h,48h

db 00h

song3: ;第4首歌 妹妹背着洋娃娃

;1

db 84h,02h,82h,64h,54h

db 64h,54h,48h

db 64h,02h,52h,44h,24h

db 14h,24h,18h

;2

db 24h,02h,22h,42h,24h

db 44h,54h,68h

db 54h,02h,52h,84h,84h

db 54h,64h,48h

db 00h

song4: ;第5首歌 两只老虎

;1

db 44h,54h,64h,44h

db 44h,54h,64h,44h

db 64h,74h,88h

db 64h,74h,88h

;2

db 82h,92h,82h,72h,64h,44h

db 82h,92h,82h,72h,64h,44h

db 44h,84h,48h

db 44h,14h,48h,00H

song5: ;第6首歌 三只小猫

;1

db 62h,82h,82h,62h,98h

db 92h,0b2h,0b2h,82h,98h

db 62h,82h,82h,52h,68h

db 92h,0b2h,0b2h,82h,98h

;2

db 62h,82h,82h,62h,92h,92h,94h

db 92h,0b2h,0b2h,92h,84h,94h

db 0b8h,0b4h,04h

db 00h

end

相关问答

用c语言在 单片机 AT89C51编写 音乐程序 ,求程序,求求你们了-ZOL问答

下面是一段个完整的程序,有两首歌曲编码,看看可以吗?#include"reg52.h"unsignedcharCount;sbit_Speak=P2^3;//讯...

单片机 编写 音乐程序 中DB表示什么意思?急程序中的一段如下:WA...

[最佳回答]DB是单片机汇编语言中的指令DB指令以表达式的值的字节形式初始化代码空间.格式:[标号:]DB表达式表表达式中可包含符号、字符串、或表达式等项,...

单片机 蜂鸣器 音乐 代码怎么编写?

单片机蜂鸣器音乐代码的编写主要包括以下几个步骤:确定音符的频率:根据所需播放的音符,查阅音符对应的频率值。计算定时器溢出值:根据音符的频率和单片机...

单片机 可以通过电流改变来控制发出的声音吗,我想通过电流的变化来播放不同的 音乐 ,求大神帮忙?

单片机是不能改变电流大小,只能输出2种状态,想播放音乐可以用单片机做pwm控制就行或者用数模芯片转换都一个原理,单片机播放音乐是行的,但是不能控制电流大小...

求51 单片机 音乐 播放 程序 实验仪器必须是DP-51proc-ZOL问答

功能:歌曲播放子程序i为播放哪一段曲目-------------------------------------------------*/voidPlay_Song(unsignedchar...

用51 单片机 实现 音乐 播放的原理是什么?

通过将音乐作为数字信号编码储存在闪存中,然后通过51单片机的PWM输出模块将该信号转化成模拟信号输出,驱动音频放大器放大后输出到喇叭上,从而实现音乐播放的...

手机QQ 音乐 怎么用蓝牙传给别人,android系统!-ZOL问答

如果你的手机QQ音乐是已经安装的软件,是不能通过蓝牙传送的,智能传送你的手机QQ音乐APK安装包。通过电脑的串口工具将蓝牙设为透传模式(一般不需要设),单片机的...

猜你喜欢