系统功能说明:
1、通过八个按键是否按下发出相应的 1234567i 这 8 个音调
2、实验中可以播放三首歌曲,通过开关控制
3、播放歌曲时,液晶屏显示播放歌曲号及歌词
附录 1:晶振为 12M 的音乐频率表
音符 频率(Hz) 简谱码(T值)
低1DO 262
#1DO# 277
低2RE 294
#2RE# 311
低3M 330
低4FA 349
#4FA# 370
低5SO 392
#5SO# 415
低6LA 440
#6 466
低7SI 494
中1DO 523
#1DO# 554
中2RE 587
#2RE# 622
中3M 659
中4FA 698
#4FA# 740
中5SO 784
#5SO# 831
中6LA 880
#6 932
中7SI 988
高1DO 1046
#1DO# 1109
高2RE 1175
#2RE# 1245
高3M 1318
高4FA 1397
#4FA# 1480
高5SO 1568
#5SO# 1661
高6LA 1760
#6 1865
高7SI 1967
休止符用TH0=FFH ,TL0=FFH表示
63628
63731
63835
63928
64021
64103
64185
64260
64331
64400
64463
64524
64580
64633
64684
64732
64777
64820
64860
64898
64934
64968
64994
65030
65058
65085
65110
65134
65157
65178
65198
65217
65235
65252
65268
65283
TH0=F7H
TH0=F8H
TH0=F9H
TH0=F9H
TH0=FAH
TH0=FAH
TH0=FAH
TH0=FBH
TH0=FBH
TH0=FBH
TH0=FBH
TH0=FCH
TH0=FCH
TH0=FCH
TH0=FCH
TH0=FCH
TH0=FDH
TH0=FDH
TH0=FDH
TH0=FDH
TH0=FDH
TH0=FDH
TH0=FDH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FEH
TH0=FFH
TL0=24H
TL0=F3H
TL0=5BH
TL0=B8H
TL0=15H
TL0=67H
TL0=B9H
TL0=04H
TL0=4BH
TL0=90H
TL0=CFH
TL0=0CH
TL0=44H
TL0=79H
TL0=ACH
TL0=DCH
TL0=09H
TL0=34H
TL0=5CH
TL0=82H
TL0=A6H
TL0=C8H
TL0=E2H
TL0=06H
TL0=22H
TL0=3DH
TL0=56H
TL0=6EH
TL0=85H
TL0=9AH
TL0=AEH
TL0=C1H
TL0=D3H
TL0=E4H
TL0=F4H
TL0=03H
附录 2:LCD 相关资料
两行液晶显示的地址:(均为十六位计数)
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
命令格式要求,设置地址指针的时候第 8 位为 1,后边为地址,即 AC0~AC6,就是对应上表
的地址。
附录 3:实验程序:
RS BIT P2.0 ;定义液晶显示端口标号
RW BIT P2.1
E BIT P2.2
;********************************************
;T0 两个暂存变量
T0TH EQU 24H
T0TL EQU 23H
ORG 0000H
LJMP INITION
ORG 000BH
LJMP T0INT
ORG 0100H
;********************************************
;*************************液晶初始化******************
INITION:
MOV SP,#70H
MOV P0,#01H ;清屏
CALL ENABLE
MOV P0,#38H ;8 位,2 行显示
CALL ENABLE
MOV P0,#0CH ;屏显 on,关光标
CALL ENABLE
MOV P0,#06H ;计数地址加 1,自动右移
CALL ENABLE
;******************************************
;开机提示
;******************************************
MOV P0,#80H
CALL ENABLE
MOV DPTR,#TABLE0
CALL WRITE1
MOV P0,#00010000B
CALL ENABLE
MOV P0,#00010000B
CALL ENABLE
CALL DEL0
LJMP MAIN
;*********************************************写指令
;写数据的第一行
;光标左移两位
;查表程序,从表头到表尾
ENABLE:
CLR RS
CLR RW
SETB E
CALL DEL0
CLR E
RET
;**********************************************写数据
WRITE1:
MOV R1,#00H
A1:
MOV A,R1
MOVC A,@A+DPTR
CALL WRITE2
INC R1
CJNE A,#00H,A1
RET
WRITE2:
MOV P0,A
SETB RS
CLR RW
SETB E
CALL DEL0
CLR E
RET
DEL0:MOV R4,#020H
C0:MOV R5,#020H
C1:
DJNZ R5,C1
;未到字符串末尾继续
;直接将数据写入液晶屏
DJNZ R4,C0
RET
;******************************************
TABLE0:DB 'WELCOM HERE',00H
;*************************内存初始化******************
INITIAL:
MOV R3,#08H
MOV R0,#30H
M1:
MOV @R0,#00H
INC R0
DJNZ R3,M1
RET
;*************************选择按键播放八个音调******************
MAIN: MOV SP,#80H
;初始化堆栈
MOV TMOD,#11H
;定时器 0 工作方式 0,定时器 1 工作方式 0
SETB EA
SETB ET0
SETB ET1
START: SETB P3.7
CLR TR0
SCAN:
;计数器 0 允许
;计数器 1 允许
;关蜂鸣器
;定时器不允许
;键盘扫描
MOV A,P1
CJNE A,#0FFH,SU_KEY
;判断键盘按下,跳到 SU_KEY,若未按,继续
扫描
NOP
LJMP SCAN
SU_KEY:
SU_KEY1:
JB P1.0,SU_KEY2
MOV DPH,#0FCH
MOV DPL,#44H
SJMP PLAY
SU_KEY2:
JB P1.1,SU_KEY3
MOV DPH,#0FCH
MOV DPL,#0ACH
SJMP PLAY
SU_KEY3:
JB P1.2,SU_KEY4
MOV DPH,#0FDH
MOV DPL,#09H
SJMP PLAY
SU_KEY4:
JB P1.3,SU_KEY5
MOV DPH,#0FDH
MOV DPL,#34H
SJMP PLAY
SU_KEY5:
JB P1.4,SU_KEY6
MOV DPH,#0FDH
MOV DPL,#82H
SJMP PLAY
SU_KEY6:
JB P1.5,SU_KEY7
MOV DPH,#0FDH
MOV DPL,#0C8H
SJMP PLAY
SU_KEY7:
;如果不是第 1 个键按下,转
;如果不是第 2 个键按下,转
;如果不是第 3 个键按下,转
;如果不是第 4 个键按下,转
;如果不是第 5 个键按下,转
;如果不是第 6 个键按下,转
JB P1.6,SU_KEY8
;如果不是第 7 个键按下,转
MOV DPH,#0FEH
MOV DPL,#06H
SJMP PLAY
SU_KEY8:
;如果不是第 8 个键按下,转
JB P1.7,KEY1
MOV DPH,#0FEH
MOV DPL,#22H
SJMP PLAY
PLAY:
;存高位字符
;存低位字符
MOV T0TH,DPH
MOV T0TL,DPL
MOV TH0,T0TH
MOV TL0,T0TL
SETB TR0
MOV R2,#01B
DJNZ R2,PLAY
LCALL DELAY
SJMP JUDGE
;启动定时器 0
;1/4 拍
JUDGE:
JB P2.4,START
;按键未按下,则继续扫描,否则,开始放音乐
;*************************选择按键播放音乐******************
KEY1:
JB P2.5,KEY2
;第一个键(P2.5)按下,放音音乐 1
MOV R2,#00H
LCALL MODD
MOV DPTR,#MU_TAB1
AJMP MUSIC
;歌曲号显示
KEY2:
JB P2.6,KEY3
;第二个键(P2.6)按下,放音乐 2
MOV R2,#01H
LCALL MODD
MOV DPTR,#MU_TAB2
AJMP MUSIC
;歌曲号显示
KEY3:
JB P2.7, NEXT_2
;第三个键(P2.7)按下,放音乐 3
MOV R2,#02H
LCALL MODD
MOV DPTR,#MU_TAB3
AJMP MUSIC
NEXT_2: LJMP START
MUSIC:
MOV TMOD,#01H
MOV IE,#82H
MOV R7,#00H
;歌曲号显示
;返回
;允许 T0 中断
LOOP:
CLR A
MOVC A,@A+DPTR
MOV R1,A
INC DPTR
PUSH DPH
PUSH DPL
GECI1:
JB P2.5,GECI2
MOV DPTR,#GE1
AJMP GECI
GECI2:
JB P2.6,GECI3
MOV DPTR,#GE2
AJMP GECI
GECI3:
JB P2.7, TIAOCHU
MOV DPTR,#GE3
AJMP GECI
TIAOCHU:LJMP START
GECI:
;查表取代码
;定时器高八位存 R1
;保护现场
;第一个键(P2.5)按下,显示歌词 1
;第二个键(P2.6)按下,显示歌词 2
;第三个键(P2.7)按下,显示歌词 3
LCALL QINGCHU
MOV P0,#0C0H
CALL ENABLE
XIANSHI1:
MOV A,R7
MOVC A,@A+DPTR
CALL WRITE2
INC R7
CJNE A,#00H,XIANSHI1
MOV P0,#00010000B
CALL ENABLE
MOV P0,#00010000B
CALL ENABLE
POP DPL
POP DPH
CLR A
MOVC A,@A+DPTR
MOV R0,A
ORL A,R1
JZ NEXT0
MOV A,R0
ANL A,R1
;显示的位置
;查表取音乐汉语拼音显示
;将光标左移一位
;将光标左移一位
;定时器低八位存 R0
;相或结果全 0 为休止符
CJNE A,#0FFH,NEXT
;相与结果为 0FFH 表示乐曲结束
MOV P0,#01H
CALL ENABLE
LJMP INITION
NEXT: MOV T0TH,R1
MOV TH0,T0TH
MOV T0TL,R0
MOV TL0,T0TL
SETB TR0
SJMP NEXT1
NEXT0: CLR TR0
NEXT1: CLR A
INC DPTR
MOVC A,@A+DPTR
MOV R2,A
LOOP1:
ACALL D200
DJNZ R2,LOOP1
INC DPTR
AJMP LOOP
D200: MOV R3,#81H
D200B: MOV A,#0FFH
D200A: DEC A
JNZ D200A
DEC R3
CJNE R3,#00H,D200B
RET
QINGCHU:MOV A,#00100000B
MOV P0,#0C0H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B
MOV P0,#0C1H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B
MOV P0,#0C2H
LCALL ENABLE
LCALL WRITE2
MOV A,#00100000B
MOV P0,#0C3H
LCALL ENABLE
LCALL WRITE2
;清屏
;从头开始演奏
;装定时初值
;启动定时器
;关闭定时器
;查延时常数
;控制延时次数
;延时程序
;将第二行的第一位置 0
;将第二行的第二位置 0
;将第二行的第三位置 0
;将第二行的第四位置 0