首页 > 其他分享 >实验四 电子琴模拟实验

实验四 电子琴模拟实验

时间:2023-05-15 21:55:44浏览次数:35  
标签:P1 MOV mov 键盘 键值 模拟实验 实验 电子琴 MLOOP

实验四 电子琴模拟实验

实验目的

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

电路图

标签:P1,MOV,mov,键盘,键值,模拟实验,实验,电子琴,MLOOP
From: https://www.cnblogs.com/bujidao1128/p/17403257.html

相关文章

  • 网络对抗实验七 网络欺诈防范
    一、实践内容(一)简单应用SET工具建立冒名网站1.使用命令vi/etc/apache2/ports.conf将Apache服务端口更改为80(HTTP)。2.使用命令apachectstart开启Apache服务3.使用命令setoolkit开启SET工具4.选择1(社会工程学攻击)->2(钓鱼网站攻击向量)->3(登陆密码截取)->2(网站克隆)5.输入i......
  • 算法基础上机实验——2023.5.15
    1.#include<cmath>#include<cstdio>#include<iostream>#include<algorithm>usingnamespacestd;intmain(){inta[310],n,k=0;cin>>n;while(n!=-99999){a[k++]=n;cin>>......
  • 软件构造实验三
    本次实验的要求是实现轨道系统CircularOrbit,并实现三个具体应用。面向复用的设计CircularOrbit<L,E>对于每个轨道系统CircularOrbit<L,E>,L为其中心物体类型,E为其轨道物体类型。Set<Track>tracks为其轨道集合,Map<E,Track>object_trackMap表示其物体在轨道系统上的分布,Lcenter......
  • 火山引擎DataTester:A/B实验平台数据集成技术分享
    DataTester的数据集成系统,可大幅降低企业接入A/B实验平台门槛。 当企业想要接入一套A/B实验平台的时候,常常会遇到这样的问题:企业已经有一套埋点系统了,增加A/B实验平台的话需要重复做一遍埋点,费时费力;企业有多个客户端和数据中台并行的情况,这些不同来源的数据难以整合......
  • 工程数学 上机实验 (二)
    上机实验二:最速下降法程序设计1、基本要求通过最速下降法的程序设计,为今后的约束优化方法的学习和编程奠定基础;掌握负梯度方向的定义和最速下降法的迭代;通过此次实验,进一步巩固最速下降法的基本原理和思想。2、主要内容(1)求解无约束优化问题(2)终止准则取;(3)完成最速下降法(负梯度......
  • 工程数学上机实验(四)
    共轭梯度法程序设计1、实验目的掌握共轭梯度法的基本思想及其迭代步骤;学会运用MATLAB编程实现常用优化算法;能够正确处理实验数据和分析实验结果及调试程序。2、实验内容(1)求解无约束优化问题;(2)终止准则取,搜索方法采用非精确搜索Armijo;(3)完成FR共轭梯度法的MATLAB编程、......
  • 软件构造实验一
    任务一:幻方幻方是一个行和、列和、对角线和均相等的方阵。要求一是编写一个程序读入文本文件,判断是否为幻方。publicstaticbooleanisLegalMagicSquare(StringfileName)throwsFileNotFoundException{FileReaderf=newFileReader(fileName);Scannerin=newSca......
  • MSTP-VRRP-DHCP-OSPF-BFD实验(二)
    所有交换机需启用MSTP服务[JR_SW7]stpregion-configuration[JR_SW7-mst-region]region-nameaa[JR_SW7-mst-region]revision-level1[JR_SW7-mst-region]instance1vlan23200[JR_SW7-mst-region]instance2vlan456[JR_SW7-mst-region]activeregion-configuration......
  • IIR卡尔曼滤波器:使用IIR滤波器(使用二阶形式的陷波滤波器)和非时不变卡尔曼滤波器进行实
    IIR卡尔曼滤波器:使用IIR滤波器(使用二阶形式的陷波滤波器)和非时不变卡尔曼滤波器进行实验ID:92200672832644749......
  • pta python实验3-6
    python实验4循环结构 1importmath23defestimate_pi(n):4total=05ret=06foriinrange(n+1):7ifi%2==0:8sign=19else:10sign=-111term=sign/((2*i+1)*mat......