单片机控制喇叭播放音乐
P1.6为喇叭控制口。程序为:ORG0000HLJMPMAINORG000BHLJMPTT0//定时器0ORG0400HMAIN:;定时器0初始化MOVTMOD,#01H...
P1.6为喇叭控制口。
程序为: ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TT0 //定时器0
ORG 0400H
MAIN:
;定时器0初始化
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H //定时60ms
MOV IE,#83H;中断开放,外中断0允许,定时中断0允许
MOV TCON,#00H //设置电平触发方式
MOV IP,#01H;外中断0为高优先级,其余为低优先级
MOV SP,#60H
LCALL BELL1
BELL1:
MOV 4FH,#00 ; 取简谱码指针
NEXT1:
MOV A,4FH ; 简谱码指针载入A
MOV DPTR,#TAB1 ; 到TABLE取简谱码
MOVC A,@A+DPTR
MOV R2,A ; 取到的简谱码暂存于R2
JZ END01 ; 是否取到00(结束码)
ANL A,#0FH ; 不是,则取低4位(节拍码)
MOV R5,A ; 将节拍码存入R5
MOV A,R2 ; 将取到的简谱码再载入A
SWAP A ; 高低4位交换
ANL A,#0FH ; 取低4位(音符码)
JNZ SING1 ; 取到的音符码是否为0?
CLR TR0 ; 开始,则不发音
SJMP D11 ; 跳至D11
SING1:
DEC A ; 取到的音符码减1(不含0)
MOV 4EH,A ; 存入(4EH)
RL A ;乘2
MOV DPTR,#TAB ; 到TAB取相对的高位字节计数值
MOVC A,@A+DPTR
MOV TH0,A ; 取到的高位字节存入TH0
MOV 4DH,A ; 取到的高位字节存入(4DH)
MOV A,4EH ; 再载入取到的音符码
RL A ; 乘2
INC A ; 加1
MOVC A,@A+DPTR ; 至TAB取相对的低位字节计数值
MOV TL0,A ; 取到的低位字节存入TL0
MOV 4CH,A ; 取到的低位字节存入(4CH)
SETB TR0 ; 启动定时器0
D11:
LCALL DELAY ; 其本单位时间1/4拍187毫秒
INC 4FH ; 取简谱码指针加1
JMP NEXT1 ; 取下一个简谱码
END01:
CLR TR0 ; 停止TIM0
RET
TT0: PUSH ACC ;定时器中断子程序0
PUSH PSW
MOV TH0,#4DH
MOV TL0,#4CH
CPL P1.6; 将P1.6位反相,控制喇叭发声
POP PSW
POP ACC
RETI
DELAY:
MOV R7,#02 //1/4节拍延时
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
TAB: DW 64580,64684,64777,64820
DW 64898,64968,65030,64260
DW 64400,64524,65058,63835,64021
TAB1: ;《精忠报国》
DB 66H,52H,36H,22H,12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22H
DB 32H,52H,22H,42H,38H,66H,52H,36H,22H,12H,22H,22H,32H,98H
DB 24H,22H,32H,54H,52H,32H,92H,12H,92H,82H,98H,66H,52H,36H,22H
DB 12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22H,32H,52H,22H,42H,38H
DB 66H,52H,36H,22H,12H,22H,22H,32H,98H,24H,22H,32H,54H,52H,32H
DB 22H,12H,92H,82H,98H,14H,24H,34H,44H,64H,0B4H,64H,32H,52H
DB 62H,0B2H,62H,52H,38H,24H,22H,32H,54H,52H,62H,52H,32H,32H,22H,38H
DB 64H,0B4H,64H,32H,52H,62H,0B2H,62H,52H,38H,22H,22H,22H,32H,52H,52H
DB 52H,62H,7FH,74H,04H,58H,6FH
DB 00
END
我调试时只有一个声音出来,没有音乐播放出来,求大侠帮忙!急用!!非常感谢!!!!!!!!! 展开
程序为: ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TT0 //定时器0
ORG 0400H
MAIN:
;定时器0初始化
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H //定时60ms
MOV IE,#83H;中断开放,外中断0允许,定时中断0允许
MOV TCON,#00H //设置电平触发方式
MOV IP,#01H;外中断0为高优先级,其余为低优先级
MOV SP,#60H
LCALL BELL1
BELL1:
MOV 4FH,#00 ; 取简谱码指针
NEXT1:
MOV A,4FH ; 简谱码指针载入A
MOV DPTR,#TAB1 ; 到TABLE取简谱码
MOVC A,@A+DPTR
MOV R2,A ; 取到的简谱码暂存于R2
JZ END01 ; 是否取到00(结束码)
ANL A,#0FH ; 不是,则取低4位(节拍码)
MOV R5,A ; 将节拍码存入R5
MOV A,R2 ; 将取到的简谱码再载入A
SWAP A ; 高低4位交换
ANL A,#0FH ; 取低4位(音符码)
JNZ SING1 ; 取到的音符码是否为0?
CLR TR0 ; 开始,则不发音
SJMP D11 ; 跳至D11
SING1:
DEC A ; 取到的音符码减1(不含0)
MOV 4EH,A ; 存入(4EH)
RL A ;乘2
MOV DPTR,#TAB ; 到TAB取相对的高位字节计数值
MOVC A,@A+DPTR
MOV TH0,A ; 取到的高位字节存入TH0
MOV 4DH,A ; 取到的高位字节存入(4DH)
MOV A,4EH ; 再载入取到的音符码
RL A ; 乘2
INC A ; 加1
MOVC A,@A+DPTR ; 至TAB取相对的低位字节计数值
MOV TL0,A ; 取到的低位字节存入TL0
MOV 4CH,A ; 取到的低位字节存入(4CH)
SETB TR0 ; 启动定时器0
D11:
LCALL DELAY ; 其本单位时间1/4拍187毫秒
INC 4FH ; 取简谱码指针加1
JMP NEXT1 ; 取下一个简谱码
END01:
CLR TR0 ; 停止TIM0
RET
TT0: PUSH ACC ;定时器中断子程序0
PUSH PSW
MOV TH0,#4DH
MOV TL0,#4CH
CPL P1.6; 将P1.6位反相,控制喇叭发声
POP PSW
POP ACC
RETI
DELAY:
MOV R7,#02 //1/4节拍延时
D2: MOV R4,#187
D3: MOV R3,#248
DJNZ R3,$
DJNZ R4,D3
DJNZ R7,D2
RET
TAB: DW 64580,64684,64777,64820
DW 64898,64968,65030,64260
DW 64400,64524,65058,63835,64021
TAB1: ;《精忠报国》
DB 66H,52H,36H,22H,12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22H
DB 32H,52H,22H,42H,38H,66H,52H,36H,22H,12H,22H,22H,32H,98H
DB 24H,22H,32H,54H,52H,32H,92H,12H,92H,82H,98H,66H,52H,36H,22H
DB 12H,12H,22H,32H,98H,84H,82H,92H,14H,12H,22H,32H,52H,22H,42H,38H
DB 66H,52H,36H,22H,12H,22H,22H,32H,98H,24H,22H,32H,54H,52H,32H
DB 22H,12H,92H,82H,98H,14H,24H,34H,44H,64H,0B4H,64H,32H,52H
DB 62H,0B2H,62H,52H,38H,24H,22H,32H,54H,52H,62H,52H,32H,32H,22H,38H
DB 64H,0B4H,64H,32H,52H,62H,0B2H,62H,52H,38H,22H,22H,22H,32H,52H,52H
DB 52H,62H,7FH,74H,04H,58H,6FH
DB 00
END
我调试时只有一个声音出来,没有音乐播放出来,求大侠帮忙!急用!!非常感谢!!!!!!!!! 展开
2个回答
展开全部
把100欧姆电阻和喇叭最好连在集电极,不要轻易接在发射极。
追问
为什么?一般资料上都是这么接的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
把你邮箱给我 我有个 但不知道行不行 你先试试
追问
450105211@qq.com
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询