技术文档

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

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

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

;音乐门铃程序

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语言+ARM实现自定义语音的无线门铃(附代码)

如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿时间——很短的一点儿时间。 —— 王尔德

不巧,家里的门铃坏掉了,迫不得已先制作一个无线门铃应急:):)。 前面讲过单片机制作MP3,这次还是在MP3的基础上,实现无线门铃的制作。

项目目标:

实现无线门铃功能,接收端可以正确解码

实现音乐自定义,自己可以替换自己喜欢的铃声

每次按门铃更换一首门铃音乐,并循环播放,总共8首门铃音乐

工具:

keil for ARM V5.22

MP3开发版

RF315M模块

32位ARM单片机GD32F130

实现代码,这里只贴出关键部分的主函数,具体细节可以下载代码自行学习研究

uint8_t * code=NULL;//无线模块解码结果

int main(void)

{

int song=0;//音乐播放

rcu_config();//时钟配置

gpio_config();//GPIO配置

RF_Decode_Init();//无线模块初始化

gd_eval_ledinit(LED1);//指示灯初始化

systick_config();//系统定时器初始化,delay函数需要用到

uartInit();//串口初始化,给MP3模块发送指令

delay_1ms(1000); //延时1秒,等待MP3模块上电完成

SendDataN((uint8_t *)(Command1[0]),6);//设置MP3模块音量大小

while (1)

{

if(RF_Decode(&code)) //检查是否正确接受到无线数据

{

//如果接受到无线数据,检查是否和绑定的门铃按键一致

if(code[0]==0x45&&code[1]==0x75&&code[2]==0x05) {

//如果一致,点亮指示灯

gd_eval_ledon(LED1);

rf_en=1;//设置标志,停止无线接收解码

//给MP3模块发送指令,播放门铃声音

SendDataN((uint8_t *)(songs[song++]),7);

//音乐循环

if(song>7)song=0;

}

}

else

gd_eval_ledoff(LED1);

if( rf_en)//解码成功后,延时2秒,避免重复解码

{

delay_1ms(2000);

rf_en=0;//清除标志,表示可以接收解码了

}

}

}

效果演示:

视频加载中...

相关问答

视得安sd 750非可视对讲 门铃 系统原理

经过查资料、选方案、设计电路、撰写设计报告、使学生得到一次较全面的工程实践训练。理论联系实际,提高和培养创新能力,为后续课程的学习,毕业设计...

猜你喜欢