实验四 电子琴模拟实验
实验目的
1、了解单片机系统发声原理
2、进一步熟悉定时器编程方法
实验说明
1、利用定时器,可以发出不同频率的脉冲,不同频率的脉冲经喇叭驱动电路放大滤波后,就会发出不同的音调。
2、定时器按设置的定时参数产生中断,这一次中断发出脉冲低电平,下一次反转发出脉冲高电平。由于定时参数不同,就发出了不同频率的脉冲。本实验中当有键按下,会发出连续脉冲,直到按键松开,才停止发音。发完后继续检测键盘,如果键还按下,继续发音。
各音阶标称频率值:
音 阶 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
频率(HZ) | 261.1 | 293.7 | 329.6 | 349.2 | 392.0 | 440.0 | 493.9 |
实验内容及步骤
利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音调。用P3.2 口发出音频脉冲,驱动喇叭。
1、单片机最小应用系统的 P1口接查询式键盘,单片机INT0口接扬声器的SP+,SP-接GND,扬声器的J19打在23处,P1口接查询式键盘的JD3口
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加“Organ.ASM”源程序,进行编译,直到编译无误。
4、全速运行程序,按查询式键盘的1~7键,扬声器发出高低不同的声音。
5、也可以把源程序编译成可执行文件,把可执行文件用ISP烧录器烧录到89S52/89S51芯片中运行。(ISP烧录器的使用查看附录二)
流程图及源程序
流程图
源程序:
PULSE BIT 10H ;脉冲
TONEHIGH EQU 30H ;高音调
TONELOW EQU 31H ;低音调
TONE EQU 32H ;音调
SPEAKER BIT P3.2
LJMP START
ORG 000BH
TIMER0INT: ;定时中断
PUSH PSW
CLR TR0
MOV TH0, TONEHIGH
MOV TL0, TONELOW
SETB TR0
MOV C, PULSE
MOV SPEAKER,C
CPL PULSE
POP PSW
RETI
TONETABLE:
DW 64578, 64686, 64778, 64821
DW 64898, 64968, 65029
TESTKEY:
MOV P1, #0FFH
MOV A, P1 ;读入键状态
RET
KEYTABLE:
DB 0FEH,0FDH,0FBH,0F7H ;键值表
DB 0EFH,0DFH,0BFH,07FH
GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP
K01: MOV R3, #8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR, #K0TAB
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
RET
K04: INC R2 ;不相等,到继续访问键值表
MOV A,#0FFH ;键值不在键值中,即多键同时按下
LJMP MLOOP
DELAY: ;延时子程序
MOV R7,#0
DELAYLOOP:
DJNZ R7,DELAYLOOP
DJNZ R6,DELAY
RET
START:
MOV SP, #70H
MOV TMOD,#01 ;TIMER
MOV IE, #82H ;EA=1, IT0 = 1
MOV TONE,#0
MLOOP:
CALL TESTKEY
JZ MLOOP
CALL GETKEY
MOV B,A
JZ MLOOP ;= 0, < 1
ANL A, #8
JNZ MLOOP ;> 7
DEC B
MOV A,B
RL A ;A = A*2
MOV B,A
MOV DPTR,#TONETABLE
MOVC A, @A+DPTR
MOV TONEHIGH,A
MOV TH0,A
MOV A,B
INC A
MOVC A,@A+DPTR
MOV TONELOW, A
MOV TL0, A
SETB TR0
MOV P1,#OFFH
WAIT: MOV A,P1
CJNE A,#OFFH,WAIT
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP
END
/*
利用实验仪上提供的键盘,使数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音调。用P3.2 口发出音频脉冲,驱动喇叭。
1、单片机最小应用系统的 P1口接查询式键盘,单片机INT0口接扬声器的SP+,SP-接GND,扬声器的J19打在23处,P1口接查询式键盘的JD3口
2、用串行数据通信线连接计算机与仿真器,把仿真器插到模块的锁紧插座中,请注意仿真器的方向:缺口朝上。
3、打开Keil uVision2仿真软件,首先建立本实验的项目文件,接着添加“Organ.ASM”源程序,进行编译,直到编译无误。
4、全速运行程序,按查询式键盘的1~7键,扬声器发出高低不同的声音。
5、也可以把源程序编译成可执行文件,把可执行文件用ISP烧录器烧录到89S52/89S51芯片中运行。(ISP烧录器的使用查看附录二)
*/
;电子琴 -----------连续型 查询式键盘
;P3.2(INT0) 接扬声器
;P1 键盘读入口 查询式
Pulse equ 10h ;脉冲
PulseCNT equ 50h ;脉冲计数
ToneHigh equ 40h ;高音调
ToneLow equ 41h ;低音调
Tone equ 42h ;音调
KeyBuf equ 54h
Speaker BIT P3.2
ORG 0000H
ljmp Start
org 000bh
LJMP Timer0Int
ORG 0030H
Timer0Int: ;定时中断
push PSW
clr TR0
mov TH0, ToneHigh
mov TL0, ToneLow
setb TR0
mov C, Pulse
MOV Speaker,C
CPL Pulse
pop PSW
reti
ToneTable:
DW 64578,64686,64778,64821
DW 64898,64968,65029
TestKey:
MOV P1, #0FFH
MOV A, P1
CPL A ; 读入键状态
ret
KeyTable:DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH ; 键码定义
GETKEY:
MOV R6,#10
ACALL DELAY
MOV A,P1
CJNE A,#0FFH,K01 ;确有键按下
LJMP MLOOP
K01: MOV R3,#8 ;8个键
MOV R2,#0 ;键码
MOV B,A ;暂存键值
MOV DPTR,#KeyTable
K02: MOV A,R2
MOVC A,@A+DPTR ;从键值表中取键值
CJNE A,B,K04 ;键值比较
MOV A,R2 ;得键码
INC A
RET
K04: INC R2 ;不相等,到继续访问键值表
DJNZ R3,K02
MOV A,#0FFH ;键值不在键值中,即多键同时按下
LJMP MLOOP
Delay: ; 延时子程序
mov r7, #0
DelayLoop:
djnz r7, DelayLoop
djnz r6, Delay
ret
;#########################
Start:
mov sp, #70h
mov TMOD, #01 ; Timer
mov IE, #82h ; EA=1, IT0 = 1
mov Tone,#0
MLoop:
call TestKey
jz MLoop
call GetKey
mov b, a
jz MLoop ; = 0, < 1
anl a, #8
jnz MLoop ; > 8
dec b
mov a, b
rl a ; a = a*2
mov b, a
mov dptr, #ToneTable
movc a, @a+dptr
mov ToneHigh, a
mov TH0, a
mov a, b
inc a
movc a, @a+dptr
mov ToneLow, a
mov TL0, a
SETB TR0
MOV P1,#0FFH
WAIT:
MOV A,P1
CJNE A,#0FFH, WAIT
MOV R6,#10
ACALL DELAY
CLR TR0
LJMP MLOOP
END