打印

遥控控制LED调光程序

[复制链接]
2255|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
善解人意|  楼主 | 2010-4-7 10:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道那里出了问题调了几天了,把原程序发上来看一下,请高手分析一下,谢谢了
  PWM      EQU      7FH    ;PWM赋初始值
  OUT      EQU      P2.6    ;LED灯的接口
           ORG      0000H
           AJMP     START
           ORG      000BH
           AJMP     INTT0
              ORG      001BH
           AJMP     INTT1
           ORG      0030H
  ;主程序
        ;定时器0工作在模式1,定时器1工作在模式2。
  START:
           MOV      SP,#50H
     MOV      TMOD,#21H
     MOV      TH1,PWM
     MOV      TL1,#00H
     MOV      TH0,#0FFH
     MOV      TL0,#00H
     SETB     EA
     SETB     ET0
     SETB     ET1
     SETB     TR0
     JNB      P0.7,IR        ;遥控扫描
     LJMP     START         ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
         ;解码程序      
     IR:   ;以下对遥控信号的9000微秒的初始低电平信号的识别。
     MOV      R5,#10
     IR_SB:
           ACALL    DELAY882
     JB       P0.7,IR_ERROR  ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
     DJNZ     R5,IR_SB       ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
      ;识别连发码,和跳过4.5ma的高电平
     JNB      P0.7,$   ;等待高电平避开9毫秒低电平引导脉冲
     ACALL    DELAY2400
     JNB      P0.7,IR_RP   ;这里为低电平,认为是连发码信号
     ACALL    DELAY2400    ;延时4.74毫秒避开4.5毫秒的结果码
     ;以下32数据码的读取 ,0和1的识别   
     MOV      R1,#28H
     MOV      R2,#4     ;设定28H为起始RAM区
     IR_4BYTE:
           MOV      R3,#8
     IR_8BIT:
           JNB      P0.7,$   ;等待地址码第一位的高电平信号
     LCALL    DELAY882   ;高电平开始后用882微秒的时间尺去判断信
     MOV      C,P0.7   ;将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位数据,存放在28H/29H/2AH/2BH的RAM中
      ;解码成功
      JMP      IR_GOTO
     IR_RP:
           JMP      IR_GOTO
     IR_ERROR:
           LJMP     START
      LOOP:   
                 MOV      R4,PWM
           CJNE     R4,#0FFH,PWMINC   ;是否到最大值?
           SJMP     LOOP
            PWMINC:  
                 INC      PWM     ;调节脉宽(脉宽减小)
           SJMP     LOOP
    LOOP1:
          CJNE      R4,#02H,PWMDEC   ;是否到最小值?
          SJMP      LOOP
             PWMDEC:
                 DEC      PWM      ;调节脉宽(脉宽增加
             LOOP2:
                 SJMP     LOOP
     IR_GOTO:
           MOV       A,2AH
     CPL       A
     CJNE      A,2BH,IR_ERROR  ;两个数据码不相反则退出
     ;遥控加值的判断
     MOV       A,2BH
     MOV       R6,A     
     CJNE      R6,#0EFH,IR_TR      
     LJMP      LOOP
     ;遥控减值的判断
   IR_TR:  
     CJNE      R6,#0FCH,IR  
       LJMP       LOOP1
     MOV       28H,#00H
                 MOV       29H,#00H
                 MOV       2AH,#00H
                 MOV       2BH,#00H
     LJMP      START
   ;T0中断服务子程序(频率)控制定时器1中断
           INTT0:
                 CLR      TR1
           MOV      TH0,#0FFH      ;256us延时常数
           MOV      TL0,#00H      ;频率调节
           MOV      TH1,PWM
           SETB     TR1
           CLR   OUT             ;启动输出
           RETI      
            ;T1中断服务子程序(脉宽)控制PWM脉冲宽度
            INTT1:
                 CLR      TR1     ;脉宽调节结束
           SETB     OUT        ;结束输出
           RETI
        
  DELAY882:   ;((219x4)+5)=882
              MOV     R7,#202
        DELAY882_A :
        NOP
         NOP
        DJNZ    R7,DELAY882_A
           RET
     DELAY1000: ;((249x4)+5)=1001
              MOV     R7,#229
     DELAY1000_A:
              NOP
        NOP
        DJNZ   R7,DELAY1000_A
        RET
     DELAY2400: ;((255x9)+5)=2397.85
              MOV    R7,#245
     DELAY2400_A:
              NOP
                 NOP
                 NOP
                 NOP
                 NOP
                 NOP
                 NOP
        DJNZ   R7,DELAY2400_A
        RET
        END

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

62

主题

324

帖子

0

粉丝