加载中...

实验四 电子琴模拟实验

实验四 电子琴模拟实验

实验目的

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

电路图

posted @ 2023-05-15 21:46  bujidao1128  阅读(321)  评论(0)    收藏  举报