⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irrece1.asm

📁 红外解码程序,在中断去分析电平时间,里面含用说明,
💻 ASM
字号:
/***********************************************************
红外线解码程序
引导码: 9ms  4.5ms  
函数调用
   unsinged char IRRead();
 
***********************************************************/

      
      
	   ?PRIRRead SEGMENT  CODE
	   
	   PUBLIC IRREAD
	   
	   RSEG  ?PRIRRead
	   
IRREAD:
    
	     CLR   EA     

       SETB P3.2
       CLR P3.5
//       JB P3.2, $               ;等待红外线脉冲
    
       MOV R6,#3
SB:    LCALL YS3                ;调用900微秒延时子程序
       JB P3.2,EXIT            ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
       DJNZ R6, SB              ;重复3次,目的是检测在3000微秒内如果出现高电平就退出解码程序
                                ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
;       JNB P3.2, $              ;等待高电平避开9毫秒低电平引导脉冲
        LCALL IOLOW_ERR          ;低电平超时判断
        CJNE R4,#160,DD0
        LJMP EXITERR
        
DD0:       MOV R6,#3
SB1:   LCALL YS3                ;调用延时1600us
       JNB P3.2,EXIT            ;延时900微秒后判断P3.2脚是否出现低电平如果有就退出解码程序
       DJNZ R6, SB1              ;重复3次,目的是检测在3000微秒内如果出现高电平就退出解码程序
       
;       JB P3.2, $              ;等待高电平避开3毫秒低电平引导脉冲
       LCALL IOHEI_ERR          ;高电平超时判断
       CJNE R4,#160,DD1
       LJMP  EXITERR
	   
DD1:   SETB P3.5
       MOV R1,#1AH              ;设定1AH为起始RAM区
       MOV R2,#2 
PP:    MOV R3,#8
JJJJ:  
       
;       JNB P3.2,$               ;等待地址码第一位的高电平信号
       
        LCALL IOLOW_ERR          ;低电平超时判断
        CJNE R4,#160,DD2
        LJMP EXITERR
DD2:   LCALL YS1                ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
       MOV C,P3.2               ;将P3.2引脚此时的电平状态0或1存入C中
       JNC UUU                  ;如果为0就跳转到UUU
;       SETB P3.5
;       JB P3.2,$                ;如果为1就等待高电平信号结束
;       CLR P3.5
	     LCALL IOHEI_ERR          ;高电平超时判断
       CJNE R4,#160,UUU
       LJMP  EXITERR

UUU:   MOV A,@R1                ;将R1中地址的给A
       RLC A                    ;将C中的值0或1移入A中的最低位
       MOV @R1,A                ;将A中的数暂时存放在R1中
       DJNZ R3,JJJJ             ;接收地址码的高8位
       INC R1                   ;对R1中的值加1,换成下一个RAM
       DJNZ R2,PP               ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
    ;以下对代码是否正确和定义进行识别
       
    ;判断结束码
        
;		SETB P3.5

        LCALL  YS2             ;延时6ms
        LCALL  YS2
		LCALL  YS2             ;延时6ms
        LCALL  YS2
        CLR P3.5
;        JNB  P3.2,  EXIT       ;判断P3.2是低电平 ,说明是错误码,退出,是高电平,正确 
       
;       LCALL IOLOW_ERR          ;低电平超时判断
;       CJNE R4,#160,DD4
;       LJMP  EXITERR



EXIT:  
       SETB EA ;允许中断
	   MOV R7,#1
        RET
 
EXITERR:
        
        LCALL  YS2             ;延时6ms
        LCALL  YS2
        SETB EA ;允许中断
		MOV R7,#0
        RET
			
				
	 YS1: MOV R4,#20 ;延时子程序1,精确延时1600微秒20Mhz	 413 * 20 * (指令周期0.1808)  = 1493
		D1: MOV R5,#205 ;延时413 = (2*205+2+1)   
				DJNZ R5,$
				DJNZ R4,D1 
				RET
	 YS2: MOV R4,#30 ;延时子程序2,精确延时3018微秒	  503 * 30 * 0.1808 =  2728.272
		D2: MOV R5,#250	  ;延时 503 = (2*250+2+1)
				DJNZ R5,$
				DJNZ R4,D2 
				RET
	 YS3: MOV R4,#10;延时程序3,精确延时900微秒		 403 * 10 * 0.1808 =  728.624
		 D3:MOV R5,#200 ;延时403  //1 c	 403 = (2*200+2+1)
				DJNZ R5,$   //2	c
				DJNZ R4,D3	//2 c
				RET

//低电平超时判断 
IOLOW_ERR:
       
        MOV R4,#30 ;延时子程序2,精确延时3018微秒
	 LD1: MOV R5,#250
	 LD2: DEC R5
	      CJNE R5,#0,LD21
		  LJMP LD3
	 LD21:JNB P3.2,LD2
	      LJMP LD4             ;高电平,退出
	 LD3: DEC R4
	      CJNE R4,#0,LD1      ;说明超时了,直接退出
		  LJMP LD5
	 
	     
	 LD4:           
				MOV R4,#0AH
				RET
	 LD5: MOV R4,#160			
				RET   



//高电平超时判断 
IOHEI_ERR:
       
        MOV R4,#30 ;延时子程序2,精确延时3018微秒
	 HD1: MOV R5,#250
	 HD2: DEC R5
	      CJNE R5,#0,HD21
		  LJMP HD3
	 HD21:JB P3.2,HD2
	      LJMP HD4             ;高电平,退出
	 HD3: DEC R4
	      CJNE R4,#0,HD1      ;说明超时了,直接退出
		  LJMP HD5
	 HD4:           
				MOV R4,#0AH
				RET
	 HD5: MOV R4,#160			
				RET   

END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -