单片机六首歌曲的音乐门铃程序
;音乐门铃程序
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;//清除标志,表示可以接收解码了
}
}
}
效果演示:
视频加载中...
相关问答
单片机 技术是一门即将被淘汰的技术吗?感谢邀请答题!目前来说,这十几年内是不可能淘汰的,即使面临着人工AI、大数据和云计算等技术的多方面竞争,单片机也可以说是立于不败之地!毕竟需求放在那里。...
自己怎么制作蜂鸣器?如果声音质量要求不高,比如市面上那种生日贺卡发出的蜂鸣声,只有音高变化即可的话,用单片机就行了,把乐谱写成数组,写程序按照乐谱输出对应音高频率的方波给...
物联网专业怎么样?找到职业新方向,从全面了解IoT开始全文共4726字,预计学习时长10分钟物联网(IoT)正以前所未有的速度蓬勃发展,并将长期为各行各业带来新的机遇,助力成功。...这...
楼宇对讲 门铃 故障如何维修?_住范儿家装官网系统装置不能上电1、220V交流电源故障:检查220V交流输入端;2、系统电源故障:检查系统电源是否有输出,正常为18V~24V,如果没有则查看系统...故障...
视得安sd 750非可视对讲 门铃 系统原理《电子课程设计》课程简介课程名称电子课程设计课程编号03s009课程英文名称:课程性质必修学时/学分1周/1适用专业自、电、通...
楼宇对讲系统2线分机的打不开锁?你好分机是俩线的主机都是由单片机控制的,并且俩根线是无极性的接法,当分机开锁键按下时,并不是俩线短路,而是使两根线上的电压升高,主机芯片接受到,然后去...
对讲 门铃 怎么进行维修_住范儿家装官网对讲门铃的电路原理与维修;目前很多的高层住宅都使用了对讲门铃了,在频繁使用;中,门铃会出现一些小毛病,具体怎么维修,你可以去专业的维修人员联系...
问问大家 门铃 对讲机怎么用- 一起装修网[回答]该系统线为两条传输线;该室外机包括对讲电路、*器、*电路、第一音频耦合器以及顺序连接的摄像头、*信号调制器和第一*耦合器,其中对讲电路所产生的...
防盗对讲 门铃 如何修理_其他[回答]1如果能确定是设备问题的话,则可以根据故障判断,无反应一般查电源模块,或者单片机芯片是否故障,其次通讯模块或者语音模块都要相应去查各个模块。2...
小区对讲 门铃 修理怎么做?_住范儿家装官网1如果能确定是设备问题的话,则可以根据故障判断,无反应一般查电源模块,或者单片机芯片是否故障,其次通讯模块或者语音模块都要相应去查各个模块。2...