利用51单片机中断、定时器计数器的基础知识,实现简单的电子音乐盒。
题目重述
实验前准备:本实验的51单片机的实验连线图如下所示
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