找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1648|回复: 0
收起左侧

jd51单片机红外线控制音调发生器程序

[复制链接]
ID:498335 发表于 2019-6-19 23:30 | 显示全部楼层 |阅读模式
/***************************程序功能说明******************************
扫描方式,读取红外遥控器键值,并把获得的键值显示于8个LED,同时蜂鸣器响.
当所按键是0~9时,1个七段显示器显示对应的数字。液晶屏显示相应的数字
当所按键是1~8时,蜂鸣器发出音调1、2、3、4、5、6、7、i。
按下CH+时,8个LED呈跑马灯闪烁三个循环。
当所按键是0时,播放音乐1
当所按键是9时,播放音乐2
******************************************************************/  
ORG 0000H
LJMP MAIN
ORG 30H
MAIN:
    JNB    P3.2,IR        ;遥控扫描
    LJMP   MAIN           ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
;=================================================
;   解码程序
IR:
    ;以下对遥控信号的9000微秒的初始低电平信号的识别
    MOV    R6,#10
IR_SB:
    ACALL  DELAY882        ;调用882微秒延时子程序
    JB     P3.2,IR_ERROR   ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
    DJNZ   R6,IR_SB       ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
    ;识别连发码,和跳过4.5ma的高电平。
    JNB     P3.2, $         ;等待高电平避开9毫秒低电平引导脉冲
    ACALL  DELAY2400
    JNB     P3.2,IR_Rp    ;这里为低电平,认为是连发码信号。
    ACALL  DELAY2400     ;延时4.74毫秒避开4.5毫秒的结果码
    ;以下32数据码的读取 ,0和1的识别
    MOV     R1,#1AH        ;设定1AH为起始RAM区
    MOV     R2,#4
IR_4BYTE:
    MOV     R3,#8
IR_8BIT:   
    JNB     P3.2,$         ;等待地址码第一位的高电平信号
    LCALL  DELAY882        ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
    MOV    C,P3.2          ;将P2.2引脚此时的电平状态0或1存入C中
    JNC    IR_8BIT_0      ;如果为0就跳转到IR_8BIT_0
    LCALL  DELAY1000
IR_8BIT_0:
    MOV    A,@R1           ;将R1中地址的给A
    RRC    A               ;将C中的值0或1移入A中的最低位
    MOV    @R1,A           ;将A中的数暂时存放在R1中
    DJNZ   R3,IR_8BIT      ;接收地址码的高8位
    INC    R1             ;对R1中的值加1,换下一个RAM
    DJNZ   R2,IR_4BYTE     ;接收完16位地址码和8位数据码和8位数据,
                           ;存放在1AH/1BH/1CH/1DH的RAM中
     ;解码成功
    JMP    IR_GOTO
IR_Rp:
    ;这里为重复码执行处
    ;按住遥控按键时,每过108ms就到这里来
    JMP    IR_GOTO
IR_ERROR:
    ;错语退出
    LJMP   MAIN ;退出解码子程序
;=================================================
;遥控执行部份
IR_GOTO:
   
    ;判断两个数据码是否相反
    MOV    A,1CH
    CPL    A
    CJNE   A,1DH,IR_ERROR    ;两个数据码不相反则退出
   MOV     P1,1DH         ;将按键的键值通过P1口的8个LED显示出来!
    CLR     P2.4         ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
    LCALL  DELAY2400
    LCALL  DELAY2400
    LCALL  DELAY2400
    SETB   P2.4        ;蜂鸣器停止
     LCALL JZPD
    ;清除遥控值使连按失效
    MOV    1AH,#00H
    MOV    1BH,#00H
    MOV    1CH,#00H
    MOV    1DH,#00H
     
     LJMP  MAIN
;=================================================
;键值判断
JZPD:   MOV A,1DH
IRD0: CJNE A,#0E9H,IRD1        ;按键"0"判断显示,若为"0"则继续执行程序,不为零则继续判断是否为"1"
    MOV R3,#200
    MAIN0:MOV TMOD,#01H    ;初始化,工作方式1
             MOV TL0,#21H     ;写入计数初值
             MOV TH0,#0F9H
             SETB TR0         ;启动计数      
    WAIT0:JNB TF0,WAIT0     
             CLR TF0         
             CLR P2.1  
             ;数码管显示0
             MOV A,#0C0H
            MOV P0,A
             DJNZ R3,MAIN0
         LJMP MUSTART1    ;跳转到音乐1的执行程序
      
         
    RET
IRD1: CJNE A,#0F3H,IRD2    ;按键"1"判断显示
    MOV R3,#200
    MAIN01:MOV TMOD,#01H    ;初始化,工作方式1
             MOV TL0,#0E1H     ;写入计数初值
             MOV TH0,#0F9H
             SETB TR0         ;启动计数
         
    WAIT1:JNB TF0,WAIT1     
             CLR TF0         
             CPL P2.4             ;蜂鸣器响
             CLR P2.0             ;数码管显示1
             CLR P1.0;
         
             MOV A,#0F9H
            MOV P0,A
             DJNZ R3,MAIN01
           LCALL DELAY2400
             CPL P1.0;
             CPL P2.0  
    RET
IRD2: CJNE A,#0E7H,IRD3    ;按键"2"判断显示
MOV R3,#200  
MAIN02:MOV TMOD,#01H   
       MOV TL0,#021H         ;写入计数初值
       MOV TH0,#0F9H
       SETB TR0
WAIT2:JNB TF0,WAIT2
     CLR TF0
     CPL P2.4            ;蜂鸣器响
      CLR P2.1      ;数码管显示2
      CLR P1.1;
      MOV A,#0A4H
         MOV P0,A
     DJNZ R3,MAIN02
LCALL DELAY2400
             CPL P1.1;
             CPL P2.1;
    RET
IRD3: CJNE A,#0A1H,IRD4    ;按键"3"判断显示
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.2
     
      CLR P1.2;
      
      MOV A,#0B0H
         MOV P0,A
     DJNZ R3,MAIN03
LCALL DELAY2400
             CPL P1.2
             CPL P2.2
    RET
IRD4: CJNE A,#0F7H,IRD5    ;按键"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
     CLR P1.3
      MOV A,#099H
         MOV P0,A
     DJNZ R3,MAIN04
LCALL DELAY2400
             CPL P1.3;
             CPL P2.3
    RET
IRD5: CJNE A,#0E3H,IRD6   ;按键"5"判断显示
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.1
      CLR P1.4
      MOV A,#092H
         MOV P0,A
     DJNZ R3,MAIN05
LCALL DELAY2400
             CPL P1.4;
    RET
IRD6: CJNE A,#0A5H,IRD7    ;按键"6"判断显示
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.1
      CLR P1.5
      MOV A,#082H
         MOV P0,A
     DJNZ R3,MAIN06
LCALL DELAY2400
             CPL P1.5;
    RET
IRD7: CJNE A,#0BDH,IRD8   ;按键"7"判断显示
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.1
      CLR P1.6
      MOV A,#0F8H
         MOV P0,A
     DJNZ R3,MAIN07
LCALL DELAY2400
             CPL P1.6;
    RET
IRD8: CJNE A,#0ADH,IRD9    ;按键"8"判断显示
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.1
      CLR P1.7
      MOV A,#080H
         MOV P0,A
     DJNZ R3,MAIN08
LCALL DELAY2400
             CPL P1.7;
    RET
IRD9:   CJNE A,#0B5H,IRDp ;按键"9"判断显示
        MOV R3,#200
    MAIN09:MOV TMOD,#01H    ;初始化,工作方式1
             MOV TL0,#21H     ;写入计数初值
             MOV TH0,#0F9H
             SETB TR0         ;启动计数      
    WAIT9:JNB TF0,WAIT9   
             CLR TF0         
             CLR P2.1             ;数码管显示9
             CLR P1.0
             CLR P1.1
             CLR P1.2
             CLR P1.3
             CLR P1.4
             CLR P1.5
             CLR P1.6
             CLR P1.7
             MOV A,#090H
            MOV P0,A
             DJNZ R3,MAIN09
LJMP MUSTART2   ;跳转到音乐2的执行程序
    RET
IRDp:   CJNE A,#0B8H,IRDEND   ;按键"PLAY"判断显示
    MOV A,#0FEH      ;给A赋值成11111110
    MOV R0,#24
    LOOP:MOV P1,A    ;点亮LED1
    MOV R3,#150
    MAIN10:MOV TMOD,#01H    ;初始化,工作方式1
             MOV TL0,#21H     ;写入计数初值
             MOV TH0,#0F9H
             SETB TR0         ;启动计数      
    WAIT10:JNB TF0,WAIT10     
             CLR TF0         
             DJNZ R3,MAIN10
    RL A         ;A的值循环左移一位
    DJNZ R0,LOOP
    MOV   1AH,#00H
    MOV   1BH,#00H
    MOV   1CH,#00H
    MOV   1DH,#00H
    LJMP MAIN
IRDEND:RET
;=================================================
; 延时子程序
;=============================882
;1.085x ((202x4)+5)=882
DELAY882:   
    MOV R7,#202
DELAY882_A:
    NOP
    NOP
    DJNZ   R7,DELAY882_A
RET
;=============================1000
;1.085x ((229x4)+5)=999.285
DELAY1000:
    MOV R7,#229
DELAY1000_A:
    NOP
    NOP
    DJNZ   R7,DELAY1000_A
RET
;=============================2400
;1.085x ((245x9)+5)=2397.85
DELAY2400:   
    MOV R7,#245
DELAY2400_A:
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    DJNZ R7,DELAY2400_A
RET
;=================================================
; 延时子程序TAO
;=============================882
;1.085x ((202x4)+5)=882
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                 ;输出相应音调的方波
LOOP1:MOV R5,#3BH
BBB:MOV TMOD,#01H
     MOV TL0,R4
     MOV TH0,R3
     SETB TR0
WAIT:JNB TF0,WAIT
     CLR TF0
     CPL P2.4
        
RA:  DJNZ R5,BBB            ;无打断则继续放第一首歌
     DJNZ R2,LOOP1
INC R0                       ;两个表的指针都加1
INC R1
CJNE R1,#88,RTAB              ;判断是否取完
LJMP IRD0
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:    ;歌曲2的播放程序
     MOV R0,#00H      ;节拍表指针置0
     MOV R1,#00H      ;音符表指针置0
RTAB2:
     MOV A,R0
     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
RB:  DJNZ R5,MAIN2
     DJNZ R2,LOOP2
   
INC R0
INC R1
CJNE R1,#64,RTAB2
LJMP IRD9
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
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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