求单片机 电子琴的汇编程序

2. 基本要求:
(1)要按任务书的要求认真分析问题,并解决问题;
(2)要求用MCS-51单片机知识完成程序的设计;
(3)在实验室利用现有的设备,完成题目的设计与调试。
3. 创新要求
在基本要求达到后,可以进行创新设计,如更加完善程序功能。
4. 书写设计报告的要求
设计报告中包含以下几个方面:
1、 设计题目
2、 总体设计
1) 所实现的功能描述。
2) 设计方案的描述。
3、 硬件系统设计,包括所需设备,接线方式,以及资源分配。
4、 软件系统的设计,包括划分功能模块,写出各个功能模块实现的功能。画出程序流程图
5、 列出程序清单,并加以必要的注释
6、 写出调试程序的方法
7、 指出所设计问题的不足和改进方案
8、 自评分和收获体会
三、设计方法和基本原理
1. 问题描述:
设计一个简易的电子琴,要求用DP-51PROC的按键K1~K7作为电子琴的按键,控制蜂鸣器能够发出1、2、3、4、5、6、7等七个音符。
电路图如下:

2. 问题的解决方案:
由于一首音乐是由许多不同音阶组成,每个音阶对应不同的频率,这样我们可用不同频率组合,即可构成我们想要的音乐了,当然对单片机产生不同的频率非常方便,我们可用单片机的定时/计数器0来产生这样的方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系设定正确即可。
对于晶振频率为11.0592MHz的单片机,定时器假如选择工作方式1,那T值便为T=216-5*105/相应的频率,那么根据不同的频率计算出应该赋给定时器的计数值。建立这样一个数据表,然后采用查表程序即可。
连线要求:用导线将A2的P3.3 (INT1)与B5区的BUZZ接口相连,用排线将D1区的 J53 与 A2区的J61相连,如上图所示。

  ;DIAN ZI QIN 电子琴
  SPK EQU P1.0
  FKEY EQU 20H.0
  DI EQU 71H
  GAO EQU 72H
  KEY_NO EQU 73H
  NO EQU 74H
  TC EQU 75H
  OUTBIT EQU 08002H
  OUTSEG EQU 08004H
  IN EQU 08001H

  ORG 0000H
  JMP BEGIN
  ORG 0BH
  JMP TO_INT

  BEGIN:
  MOV TMOD,#00000000B
  MOV IE ,#10000010B
  MOV R4,#1
  MOV R3,#1
  CALL PLAY

  MOV R4,#2
  MOV R3,#1
  CALL PLAY

  JMP RUN
  JMP $

  PLAY:
  CALL LOAD_VALUE
  CALL SOUND_ON
  PL1:
  MOV R5,#30
  CALL DELAY
  DJNZ R3,PL1
  CALL SOUND_OFF
  MOV R5,#3
  CALL DELAY
  RET

  PLAY_SONG1:
  MOV TC,#0
  PA0:
  MOV DPTR,#SONG1
  MOV A,TC
  MOVC A,@A+DPTR
  MOV R4,A
  CJNE A,#0FFH,PA1
  RET
  PA1:
  MOV DPTR,#LEN
  MOV A,TC
  MOVC A,@A+DPTR
  MOV R3,A
  CALL PLAY
  INC TC
  JMP PA0
  RET

  PLAY_SONG2:
  MOV TC,#0
  PB0:
  MOV DPTR,#SONG2
  MOV A,TC
  MOVC A,@A+DPTR
  MOV R4,A
  CJNE A,#0FFH,PB1
  RET
  PB1:
  MOV DPTR,#LEN
  MOV A,TC
  MOVC A,@A+DPTR
  MOV R3,A
  CALL PLAY
  INC TC
  JMP PB0
  RET

  SOUND_ON:
  SETB TR0
  RET

  SOUND_OFF:
  CLR TR0
  RET

  LOAD_VALUE:
  MOV DPTR,#HI_LIST
  MOV A,R4
  MOVC A,@A+DPTR
  MOV GAO,A
  MOV DPTR,#LO_LIST
  MOV A,R4
  MOVC A,@A+DPTR
  MOV DI,A
  RET

  TO_INT:
  MOV TL0,DI
  MOV TH0,GAO
  CPL SPK
  RETI

  HI_LIST:
  DB 0,226,229,232,233,236,238,240
  LO_LIST:
  DB 0,4,13,10,20,3,8,6

  SONG1: DB 1,2,3,4,5,6,7,0FFH
  SONG2: DB 7,6,5,4,3,2,1,0FFH
  LEN: DB 2,2,2,2,2,2,2,0FFH

  DELAY:
  MOV R6,#50
  D1:MOV R7,#50
  DJNZ R7,$
  DJNZ R6,D1
  DJNZ R5,DELAY
  RET

  TABLE_DIG:
  DB 16H,15H,14H,0FFH
  DB 13H,12H,11H,10H
  DB 0DH,0CH,09H,0AH
  DB 0EH,03H,06H,0FH
  DB 08H,02H,05H,0BH
  DB 00H,01H,04H,07H

  SCAN:
  MOV DPTR ,#OUTBIT
  MOV A,#0
  MOVX @DPTR,A
  MOV DPTR,#IN
  MOVX A,@DPTR
  CPL A
  ANL A,#0FH
  RET

  GET_KEY:
  MOV DPTR,#OUTBIT
  MOV P2,DPH
  MOV R0,#LOW(IN)
  MOV R1,#00100000B
  MOV R2,#6
  KLOOP:
  MOV A,R1
  CPL A
  MOVX @DPTR,A
  CPL A
  RR A
  MOV R1,A
  MOVX A,@R0
  CPL A
  ANL A,#0FH
  JNZ GOON1
  DJNZ R2,KLOOP
  MOV R2,#0FFH
  SJMP EXIT
  GOON1:
  MOV R1,A
  MOV A,R2
  DEC A
  RL A
  RL A
  MOV R2,A
  MOV A,R1
  MOV R1,#4
  LOOPC:
  RRC A
  JC EXIT
  INC R2
  DJNZ R1,LOOPC
  EXIT:
  MOV A,R2
  MOV DPTR,#TABLE_DIG
  MOVC A,@A+DPTR
  MOV R2,A
  MOV KEY_NO,A
  RET

  SO:
  MOV R3,#1
  CALL PLAY
  RET

  SOP:
  CJNE A,#1,A1
  MOV R4,#1
  CALL SO
  RET
  A1:
  CJNE A,#2,A2
  MOV R4,#2
  CALL SO
  RET
  A2:
  CJNE A,#3,A3
  MOV R4,#3
  CALL SO
  RET
  A3:
  CJNE A,#4,A4
  MOV R4,#4
  CALL SO
  RET
  A4:
  CJNE A,#5,A5
  MOV R4,#5
  CALL SO
  RET
  A5:
  CJNE A,#6,A6
  MOV R4,#6
  CALL SO
  RET
  A6:
  CJNE A,#7,A7
  MOV R4,#7
  CALL SO
  RET
  A7:
  CJNE A,#0FH,A8
  CALL PLAY_SONG1
  RET
  A8:
  CJNE A,#0BH,A9
  CALL PLAY_SONG2
  RET
  A9:
  RET

  RUN:
  LOOP:
  CALL SCAN
  JZ LOOP
  CALL GET_KEY
  MOV A,KEY_NO
  CALL SOP
  LJMP LOOP
  END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2007-12-12
问题太复杂!这么点分为什么要帮你呢?
第2个回答  2007-12-13
我的博客上有几个程序,你可以去参考一下
相似回答