找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1497|回复: 0
打印 上一主题 下一主题
收起左侧

电子音调发生器 单片机汇编语言程序

[复制链接]
跳转到指定楼层
楼主
ID:937420 发表于 2021-6-15 08:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ORG 0000H
        LJMP KEYP0
KEYP0: MOV R0,#00H   
      CLR TR0
      SETB P2.4     ;关蜂鸣器
     SETB P2.3                           ;关数码管
WU:  MOV R0,P3  ;扫描键盘输入
    CJNE R0,#0FFH,KEYPO1         ;有输入时跳转
          JMP WU
KEYPO1:CJNE R0,#0FBH,KEYPO2  ;输入1音,非1音跳转
  SETB P2.4     ;关闭蜂鸣器
    MOV R3,#200
MAIN01:MOV TMOD,#01H    ;初始化,定时器0,工作方式1
       MOV TL0,#21H     ;写入计数初值
       MOV TH0,#0F9H
       SETB TR0         ;启动计数
                 
WAIT1:JNB TF0,WAIT1     
     CLR TF0         
     CPL P2.4             ;蜂鸣器响
          CLR P2.3             ;数码管显示1
          MOV A,#11111001B
                 MOV P0,A
     DJNZ R3,MAIN01
          LJMP KEYP0         ;返回程序KEYP0
         
KEYPO2:CJNE R0,#0F7H,KEYPO3  ; 输入2音,非2音跳转
SETB P2.4        ;蜂鸣器置于高电平
        MOV R3,#200  
MAIN02:MOV TMOD,#01H   
       MOV TL0,#0E1H         ;写入计数初值
       MOV TH0,#0F9H
       SETB TR0
WAIT2:JNB TF0,WAIT2
     CLR TF0
     CPL P2.4            ;蜂鸣器响
          CLR P2.3            ;数码管显示2
          MOV A,#10100100B
                 MOV P0,A
     DJNZ R3,MAIN02
        LJMP KEYP0

KEYPO3:CJNE R0,#0EFH,KEYPO4  ; 输入3音,非3音跳转
SETB P2.4         ;蜂鸣器置于高电平
        MOV R3,#200
MAIN03:MOV TMOD,#01H      
       MOV TL0,#08CH
       MOV TH0,#0FAH
       SETB TR0
WAIT3:JNB TF0,WAIT3
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#10110000B
                 MOV P0,A
     DJNZ R3,MAIN03
        LJMP KEYP0

KEYPO4:
CJNE R0,#0DFH,KEYPO5           ; 输入4音,非4音跳转
SETB P2.4
        MOV R3,#200
MAIN04:MOV TMOD,#01H            
       MOV TL0,#0D8H
       MOV TH0,#0FAH
       SETB TR0
WAIT4:JNB TF0,WAIT4
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#10011001B
                 MOV P0,A
     DJNZ R3,MAIN04
        LJMP KEYP0

KEYPO5:        CJNE R0,#0F3H,KEYPO6        ; 输入5音,非5音跳转
SETB P2.4
        MOV R3,#200   
MAIN05:MOV TMOD,#01H           
       MOV TL0,#068H
       MOV TH0,#0FBH
       SETB TR0
WAIT5:JNB TF0,WAIT5
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#10010010B
                 MOV P0,A
     DJNZ R3,MAIN05
        LJMP KEYP0

KEYPO6:CJNE R0,#0E7H,KEYPO7        ; 输入6音,非6音跳转
SETB P2.4
        MOV R3,#200            
MAIN06:MOV TMOD,#01H
       MOV TL0,#0E9H
       MOV TH0,#0FBH
       SETB TR0
WAIT6:JNB TF0,WAIT6
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#10000010B
                 MOV P0,A
     DJNZ R3,MAIN06
        LJMP KEYP0

KEYPO7:CJNE R0,#0CFH,KEYPO8       ; 输入7音,非7音跳转
SETB P2.4
        MOV R3,#200         
MAIN07:MOV TMOD,#01H
       MOV TL0,#05BH
       MOV TH0,#0FCH
       SETB TR0
WAIT7:JNB TF0,WAIT7
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#11111000B
                 MOV P0,A
     DJNZ R3,MAIN07
        LJMP KEYP0

KEYPO8:CJNE R0,#0DBH,KEYPO9      ; 输入i音,非i音跳转
       SETB P2.4
           MOV R3,#200      
MAIN08:MOV TMOD,#01H
       MOV TL0,#08FH
       MOV TH0,#0FCH
       SETB TR0
WAIT8:JNB TF0,WAIT8
     CLR TF0
     CPL P2.4
          CLR P2.3
          MOV A,#10000000B
                 MOV P0,A
     DJNZ R3,MAIN08
        LJMP KEYP0
KEYPO9:CJNE R0,#0EBH,KEYPO10    ;跳转到第一首歌程序
       LJMP MUSTART1
KEYPO10:CJNE R0,#0D7H,JIELI     ;跳转到第二首歌程序
       LJMP MUSTART2
JIELI:JMP KEYP0                 ;返回主程序

MUSTART1:                      ;歌曲1的播放程序
     MOV R0,#00H               ;节拍表指针置零
     MOV R1,#00H               ;音符表指针置零
RTAB:MOV A,R0
     MOV DPTR,#RYTH
     MOVC A,@A+DPTR            ;查表法将一个节拍数据取出放R2计数器中
     MOV R2,A
TTAB:MOV A,R1
     MOV DPTR,#TONE
     MOVC A,@A+DPTR
     MOV R3,A                  ;取出音符表高8位
     INC R1                    ;指针加1
     MOV A,R1
     MOV DPTR,#TONE
     MOVC A,@A+DPTR
     MOV R4,A                  ;取出低8位
     SETB P2.4                 ;准备输出相应音调的方波,关闭蜂鸣器
LOOP:MOV R5,#3BH
MAIN:MOV TMOD,#01H             ;定时器0,工作方式1
     MOV TL0,R4                ;传入音符,作为及时T0的初始值
     MOV TH0,R3
     SETB TR0                  ;允许定时器0计时
WAIT:JNB TF0,WAIT
     CLR TF0
     CPL P2.4
MAYA:JB P3.2,MAYB             ;判断P3.2口是否有为1
     JB P3.4,MAYB             ;判断P3.4口是否有为1
     LJMP RA                  ;P3.4口为0则跳转到程序RA
MAYB:JB P3.3,JIELI            ;判断P3.3口是否有为1
     JB P3.5,JIELI            ;判断P3.5口是否有为1
     LJMP MUSTART2            ;P3.5口为0则放第二首歌
RA:  DJNZ R5,MAIN             ;无打断则继续放第一首歌
     DJNZ R2,LOOP
INC R0                        ;两个表的指针都加1
INC R1
CJNE R1,#88,RTAB              ;判断是否取完
LJMP KEYP0
TONE:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
RYTH:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04
MUSTART2:         
     MOV R0,#00H
     MOV R1,#00H

RTAB2:
     MOV A,R1
     MOV DPTR,#TABLE1
     MOVC A,@A+DPTR
     MOV R2,A
TTAB2: MOV A,R1
     MOV DPTR,#TONE2
     MOVC A,@A+DPTR
     MOV R3,A
     INC R1
          MOV A,R1
          MOV DPTR,#TONE2
          MOVC A,@A+DPTR
          MOV R4,A
     SETB P2.4
LOOP2: MOV R5,#9BH
MAIN2:
      MOV TMOD,#01H
     MOV TL0,R4
     MOV TH0,R3
     SETB TR0
WAITR:JNB TF0,WAITR
     CLR TF0
     CPL P2.4
MAYA1:JB P3.3,MAYB1
      JB P3.5,MAYB1
      LJMP RB
MAYB1:JB P3.2,BACK
      JB P3.4,BACK
      LJMP MUSTART1
BACK:LJMP JIELI
RB:  DJNZ R5,MAIN2
     DJNZ R2,LOOP2

INC R0
INC R1
CJNE R1,#64,RTAB2
LJMP KEYP0
TONE2:
DB 0FBH,68H,0FDH,6EH,0FDH,45H,0FCH,0EFH,0FCH,8FH,0FCH,8FH,0FCH,8FH,0FCH,5BH,0FCH,8FH
DB 0FCH,0EFH,0FDH,45H,0FBH,68H,0FBH,68H,0FCH,8FH,0FCH,5BH,0FBH,0E9H,0FBH,68H,0FBH,68H
DB 0FAH,0DBH,0FAH,8CH,0F9H,21H,0FAH,8CH,0FAH,0D8H,0FBH,68H,0FBH,68H,0FBH,68H,0FBH,68H
DB 0FBH,0E9H,0FBH,0E9H,0FBH,68H,0FBH,0E9H,0FCH,5BH,0FAH,8CH,0FCH,8FH,0FCH,8FH,0FCH,5BH
DB 0FCH,8FH,0FCH,0EFH,0FCH,0EFH,0FCH,0EFH,0FCH,8FH,0FDH,45H,0FDH,6EH,0FCH,0EFH
TABLE1:
DB 04,04,04,04,04,04,04,04,04,04
DB 04,05,04,04,04,04,04,04,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,06,04,04,04,07,04,04
DB 04,04,04,04

END


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表