12.51单片机实现电子音乐盒

本文介绍了如何使用51单片机的定时器和中断功能,结合延时子程序,实现简单电子音乐盒。通过改变定时器的定时时间产生不同频率的方波,模拟不同音阶,进而播放‘新年好’和‘小星星’两首乐曲。程序中包含了不同频率的方波设置、延时函数以及乐曲数据的存储和读取。
摘要由CSDN通过智能技术生成

利用51单片机中断、定时器计数器的基础知识,实现简单的电子音乐盒。

题目重述

实验前准备:本实验的51单片机的实验连线图如下所示
图1
在这里插入图片描述
在这里插入图片描述

1.用定时器T0方式0产生频率为500Hz的方波,由P1.5输出驱动喇叭产生蜂鸣器的效果。

2.设实验连线如图所示,用定时器产生两种频率(500Hz及1000Hz)不断交替发声,由P1.5输出驱动喇叭产生警报声的效果。

3.设实验连线如图所示,用定时器T1方式1来产生歌谱中各音符对应频率的方波,由P1.5输出驱动喇叭;节拍控制可通过调用延时子程序次数来实现。
实验说明:
① 通过控制定时器的定时时间来产生不同频率的方法,驱动喇叭发出不同音阶的声音,再利用延时来控制发音时间的长短,即可控制音调中的节拍。把乐谱中的音符和相应的节拍变换为定时常数和延时常数,作为数据表格存放在存储器中。由查表程序得到定时常数和延时常数,分别用以控制定时器产生方波的频率和发该频率方波的持续时间。当延时时间到,再查下一个音符的定时常数和延时常数。依次下去,就可自动演奏出悦耳的乐曲。
② 蜂鸣器通过ULN2003驱动。
③ 乐曲“新年好”数据表格如下,三个字节为一组,其中前两个字节表示定时常数(16位计数器),高位在前,若定时常数为00H,00H,表示休止符,若定时常数为0FFH,0FFH,表示结束,后一个字节表示延时常数(每个延时为200ms)。
0FCH,4AH,04H,0FCH,4AH,04H
0FCH,4AH,08H,0FBH,00H,08H
0FDH,08H,04H,0FDH,08H,04H
0FDH,08H,08H,0FCH,4AH,08H
0FCH,4AH,04H,0FDH,08H,04H
0FDH,80H,08H,0FDH,80H,08H
0FDH,30H,04H,0FDH,08H,04H
0FCH,0AEH,08H,00H,00H,08H
0FFH,0FFH

4.设实验连线如图及图所示,编程实现有外部中断时演奏乐曲“新年好”,有外部中断时演奏乐曲“小星星”。

问题分析以及求解思路

待完善(请耐心等待)

程序代码

问题1代码

     ORG 0000H
     LJMP MAIN
     ORG 001BH
	 LJMP BR1
MAIN:MOV TMOD,#10H
     MOV TH1,#0FFH
	 MOV TL1,#38H
	 SETB EA
	 SETB ET1
	 SETB TR1
	 SJMP $
BR1: MOV TH1,#0FFH
     MOV TL1,#38H
	 CPL P1.5
	 RETI
	 END

问题2代码

	 ORG 0000H
     LJMP MAIN
     ORG 001BH
	 LJMP BR1
MAIN:MOV R1,#10H
     MOV R2,#0F8H
	 MOV R3,#30H
     MOV TMOD,R1
     MOV TH1,R2
	 MOV TL1,R3
	 SETB EA
	 SETB ET1
	 SETB TR1
	 LCALL DELAY
	 MOV R1,#10H
	 MOV R2,#0FCH
	 MOV R3,#18H
	 LCALL DELAY
	 LJMP MAIN

BR1: MOV TH1,R2
     MOV TL1,R3
	 CPL P1.5
	 RETI
	 

DELAY: MOV R5,#2
DELAY1:MOV R6,#0FFH
DELAY2:MOV R7,#0FFH
       DJNZ R7,$
	   DJNZ R6,DELAY2
	   DJNZ R5,DELAY1
	   RET 
	   END

问题3代码

	 ORG 0000H
     LJMP MAIN
     ORG 001BH
	 LJMP BR1
MAIN:MOV R1,#10H
     MOV R2,#0F8H
	 MOV R3,#30H

	 MOV DPTR,#TAB1
	 MOV R4,#00H
LLL: MOV A,R4
	 MOV B,#1
     MOV TMOD,R1
	 MOVC A,@A+DPTR
	 MOV R2,A
     MOV TH1,R2
	 INC R4
	 MOV A,R4
 
	 MOVC A,@A+DPTR
	 MOV R3,A
	 MOV TL1,R3
	 INC R4
	 MOV A,R4 
 
	 MOVC A,@A+DPTR
	 MUL AB
	 MOV 30H,A
	 INC R4
 
	 SETB EA
	 SETB ET1
	 SETB TR1
	 CJNE R3,#00H,CLOSE
	 LCALL DELAY
XH:  CJNE R3,#0FFH,LLL
     LJMP MAIN
	 
CLOSE:CLR TR1
      LCALL DELAY
	  SETB TR1
	  LJMP XH

BR1: MOV TH1,R2
     MOV TL1,R3
	 CPL P1.5
	 RETI
	 
DELAY: MOV R5,30H
DELAY1:MOV R6,#080H
DELAY2:MOV R7,#0FFH
       DJNZ R7,$
	   DJNZ R6,DELAY2
	   DJNZ R5,DELAY1
	   RET 

TAB1:DB     0FCH,4AH,04H,0FCH,4AH,04H
	 DB		0FCH,4AH,08H,0FBH,00H,08H
	 DB		0FDH,08H,04H,0FDH,08H,04H
	 DB		0FDH,08H,08H,0FCH,4AH,08H
	 DB		0FCH,4AH,04H,0FDH,08H,04H
	 DB		0FDH,80H,08H,0FDH,80H,08H
	 DB		0FDH,30H,04H,0FDH,08H,04H
	 DB		0FCH,0AEH,08H,00H,00H,08H
     DB		0FFH,0FFH
	   END

问题4代码

     ORG 0000H
     LJMP MAIN
     ORG 001BH
	 LJMP BR1
MAIN:MOV R1,#10H
     MOV R2,#0F8H
	 MOV R3,#30H
	 MOV DPTR,#TAB2
	 MOV R4,#00H
LLL: MOV A,R4
	 MOV B,#1
     MOV TMOD,R1
	 MOVC A,@A+DPTR
	 MOV R2,A
     MOV TH1,R2
	 INC R4
	 MOV A,R4
 
	 MOVC A,@A+DPTR
	 MOV R3,A
	 MOV TL1,R3
	 INC R4
	 MOV A,R4 
 
	 MOVC A,@A+DPTR
	 MUL AB
	 MOV 30H,A
	 INC R4
	 SETB EA
	 SETB ET1
	 SETB TR1
	 LCALL DELAY	 
	 LJMP LLL
	 
BR1: MOV TH1,R2
     MOV TL1,R3
	 CPL P1.5
	 RETI
	 
DELAY: MOV R5,30H
DELAY1:MOV R6,#080H
DELAY2:MOV R7,#0FFH
       DJNZ R7,$
	   DJNZ R6,DELAY2
	   DJNZ R5,DELAY1
	   RET 

TAB1:DB     0FCH,4AH,04H,0FCH,4AH,04H
	 DB		0FCH,4AH,08H,0FBH,00H,08H
	 DB		0FDH,08H,04H,0FDH,08H,04H
	 DB		0FDH,08H,08H,0FCH,4AH,08H
	 DB		0FCH,4AH,04H,0FDH,08H,04H
	 DB		0FDH,80H,08H,0FDH,80H,08H
	 DB		0FDH,30H,04H,0FDH,08H,04H
	 DB		0FCH,0AEH,08H,00H,00H,08H
     DB		0FFH,0FFH
     
TAB2:DB  0FCH,55H,08H,0FCH,55H,08H
     DB  0FDH,82H,08H,0FDH,82H,08H
	 DB  0FDH,0C8H,08H,0FDH,0C8H,08H
	 DB  0FDH,82H,08H,00H,00H,08H
	 DB  0FDH,34H,08H,0FDH,34H,08H
	 DB  0FDH,0AH,08H,0FDH,0AH,08H
	 DB  0FCH,0ADH,08H,0FCH,0ADH,08H
	 DB  0FCH,55H,08H,0FFH,0FFH,08H

	   END
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值