蜂鸣器演奏祝你平安——51单片机的Proteus实验

实验原理

51单片机的一个I/O口控制speaker发声,演唱祝你平安歌曲。

主要器件以及电路图

单片机——AT89C51,蜂鸣器——speaker。

proteus单片机控制蜂鸣器演奏歌曲

汇编程序源码

晶振12M,已在Proteus下测试,好像有点失真。程序是从网上照的,感觉不是很对劲,删除了一部分之后还是没有变化。部分注释是我后加上去的。

;------------------------------------
; 蜂鸣器演奏--祝你平安
; 功能:蜂鸣器-蜂鸣器奏乐-祝你平安
;------------------------------------
SPK bit P2.7 ;以后SPK就是speaker了
ORG 0000H
LJMP START
ORG 000BH
INC 20H ;T0中断服务,中断计数器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
RETI
START:
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H ;10000010B——开T0中断
MUSIC0:
NOP
MOV DPTR,#DAT ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5 ;只要A不等于FF,一直执行MUSIC5
LJMP MUSIC3 ;当A到FF的时候,执行MUSIC3
MUSIC5:
NOP
MOV R6,A ;代码送R6
INC DPTR
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR0 ;启动计数
MUSIC2:
NOP
CPL SPK
MOV A,R6 ;按R6(代码)延时
MOV R3,A ;
LCALL DEL ;利用代码(R6)来调用延时
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL: ;DEL子程序利用R3来延时一定时间
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT: ;祝你平安
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H
END ;程序结束
  1. 按钮控制LED——51单片机的Proteus实验
  2. 流水灯——51单片机的Proteus实验
  3. 数码显示管——51单片机的Proteus实验
  4. 蜂鸣器——51单片机的Proteus实验
  5. 蜂鸣器演奏祝你平安——51单片机的Proteus实验
  6. 蜂鸣器演奏兰花草——51单片机的Proteus实验
  7. 蜂鸣器演奏老鼠爱大米——51单片机的Proteus实验
  8. ADC0808模数转换——51单片机的Proteus实验
  9. 开关控制流水灯2——51单片机的Proteus实验
  10. 单片机数字钟C程序——51单片机的Proteus实验1 2
  11. 8951+1602显示字符——51单片机的Proteus实验
  12. LCD1602显示程序头文件——51单片机的Proteus实验
  13. 8951+1602数字钟——51单片机的Proteus实验
  14. 4X4矩阵键盘+1602——51单片机的Proteus实验
  15. 8952+1602测单片机内部时钟频率——51单片机的Proteus实验

返回单片机目录, ARM目录, 返回首页