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

📄 红外遥控开关.asm

📁 详细的中文说明 标准的程序格式 保证调试通过877a 配套红外程序
💻 ASM
字号:
;4 MHz
;RA0红外输入
;用西湖9012-011遥控器做发射控制端。
;信号格式:
;h560us+560us==0  h560us+1680us==1
;头码H4.5ms+4.5ms  地址码:01110000  01110000  数据码+数据反码
;数字“1”键:01110000  01110000 00000000  11111111 (高低位需对调)
;尾码:H560,46.7MS,H4.5ms,4.5MS,H560,1680,cH551(没使用)
;宁波歌林电子实验室
;网址:  www.nbglin.com
;电话:  0574-88464538  
;EMAIL: PICWORLD@126.COM
;=============================

	include <p16f877A.inc>	
;该程序改变头文件可直接用于16FXXXX 等28脚以上芯片.
;使用时注意各芯片RAM空间有大小.
;=========================================
#DEFINE		IRIN	PORTA,0	; 这样易于改变引脚位置。	
ID1		EQU	20H	; 8次循环计数。
DATATRUE	EQU	21H	; 红外数据码寄存器。
COMDATA		EQU	22H	; 红外数据码反码寄存器。
TEST		EQU	23H	; 存TMR0的计时值。
FLAG		EQU	24H	; 标志寄存器,为0表示错。
TEMP		EQU	26H	; 地址码1
PWRSW		EQU	27H	
R1REG		EQU	28H	; 用于比较红外脉冲的时间常数。小值
R2REG		EQU	29H	; 用于比较红外脉冲的时间常数。大值
MM		EQU	2AH	; 10MS DELAY
NN		EQU	2BH
AA		EQU	2CH	; DELAY1 用于LED闪
BB		EQU	2DH
DATAAA		EQU	2EH	; 操作码(使易于增加键和)
DATABB		EQU	2FH
COUNT1		EQU	31H	; 开关1
COUNT2		EQU	32H	; 开关2
COUNT3		EQU	33H	; 开关3
COUNT4		EQU	34H	; 开关4
COUNT5		EQU	35H	; 开关5
;=============================
		ORG	10H
START   
	BSF	STATUS,RP0	
	MOVLW   B'11111111'  ;RA0 IR IN
        MOVWF	TRISA
        MOVLW   B'11111111'
        MOVWF	TRISB          ;RC1--RC6 LED 
        MOVLW   B'00000000'   
        MOVWF	TRISC		
	MOVLW   B'00000110'	;RTCC 1:128
        MOVWF	OPTION_REG  
	BCF	STATUS,RP0	
;                
	CLRF	COUNT1
	CLRF	COUNT2
	CLRF	COUNT3
	CLRF	COUNT4
	CLRF	COUNT5             
	CLRF	ID1			
	CLRF	DATATRUE	
	CLRF	COMDATA
	CLRF	PORTC
; 	
	BSF	PORTC,1	       ;复位时闪二下,表示工作正常。
	CALL	DELAY1
	BCF	PORTC,1
	CALL	DELAY1
	BSF	PORTC,1
	CALL	DELAY1
	BCF	PORTC,1
	CALL	DELAY1
;===============================
MAIN
	BTFSS	IRIN	   ;RA0为低电平,接收到红外信号。
	GOTO	IDEC		
	GOTO	MAIN
;======判H4.5ms+4.5ms的头文件=======       
IDEC    CLRF    TMR0       ;TMR0开始计时 
        MOVLW   0X08
        MOVWF   ID1            
;        
        BTFSS   IRIN	   ;第一个解出的低电平是4.5MS的IR高电平。 
        GOTO    $-1
;
        MOVF    TMR0,0     ;当4.5ms完成 TMR0定时值存在TEST。       
        MOVWF   TEST      
        CALL    RANGE45                                 
        BTFSS   FLAG,0  	
        GOTO    MAIN        ;错误,退出。
;4.5mS 高正确。
        CLRF    TMR0  
        BTFSC   IRIN  
        GOTO    $-1
 ;
        MOVF    TMR0,0         ; 第二个高电平脉冲是4.5MS的低电平。    
        MOVWF   TEST             
        CALL    RANGE45        ; 在4.5mS 范围?
        BTFSC   FLAG,0          
        GOTO    DDDD           ; FLAG,0=1 信号正确。	
	GOTO	MAIN	       ; 错误,退出。
;4.5mS 低正确
;=========判开始8位地址码================
DDDD    
	RRF     TEMP,1   
;
	CLRF    TMR0	  ;接收一个脉冲。 
        BTFSS   IRIN     
        GOTO    $-1
        BTFSC   IRIN    
        GOTO    $-1
;
        MOVF    TMR0,0          ; 取出RTCC当前值。 
        MOVWF   TEST           
        CALL    RANGELOW        ; 查脉冲是0?
        BTFSS   FLAG,0       
        GOTO    BHITEST         
        BCF     TEMP,7          ; 是低电平,TEMP清0
        GOTO    NXTC1         
BHITEST CALL    RANGEHI         ; 查脉冲是1?
        BTFSS   FLAG,0        
        GOTO    MAIN            ; 错误,退出。
        BSF     TEMP,7         
NXTC1   DECFSZ  ID1,1          
        GOTO    DDDD
;
	MOVF	TEMP,0
	XORLW	B'00001110'	; 地址码1正确?
	BTFSS	STATUS,Z
	GOTO	MAIN		; 错误,退出。
	MOVLW	0X08		
	MOVWF	ID1

;=============8位地址码2===============
DATAS   
	CLRF    TMR0
	RRF     TEMP,1       
 	BTFSS   IRIN   
        GOTO    $-1
	BTFSC   IRIN 
        GOTO    $-1
;
        MOVF    TMR0,0         ;取出RTCC当前值。       
        MOVWF   TEST          
        CALL    RANGELOW       ; 查脉冲是0?
        BTFSS   FLAG,0  
        GOTO    GHITEST     
        BCF     TEMP,7        
        GOTO    NXTC2       
GHITEST CALL    RANGEHI        ; 查脉冲是1? 
        BTFSS   FLAG,0        
        GOTO    MAIN           ; 错误,退出。
        BSF     TEMP,7          
NXTC2   DECFSZ  ID1,1           
        GOTO   DATAS         
;
	MOVF	TEMP,0
	XORLW	B'00001110'	; 地址码2正确?
	BTFSS	STATUS,Z
	GOTO	MAIN		; 错误,退出。
	MOVLW	0X08		
	MOVWF	ID1

;=================查操作码==========
CHTTT   
        CLRF    TMR0        
	RRF     DATATRUE,1       
	BTFSS   IRIN    
        GOTO    $-1
	BTFSC   IRIN 
        GOTO    $-1
;
        MOVF    TMR0,0         ;取出RTCC当前值。    
        MOVWF   TEST                 
        CALL    RANGELOW       
        BTFSS   FLAG,0  
        GOTO    CTHITEST       ; 查脉冲是0?
        BCF     DATATRUE,7   
        GOTO    NXTTC          
CTHITEST 
        CALL    RANGEHI        ; 查脉冲是1?
        BTFSS   FLAG,0       
        GOTO    MAIN           ; 错误,退出。
        BSF     DATATRUE,7     
NXTTC   DECFSZ  ID1,1         
        GOTO    CHTTT        
;
	MOVF	DATATRUE,0
	XORLW	B'00000000'	; 是键1?
	BTFSC	STATUS,Z
	CALL	SECFF1
;
	MOVF	DATATRUE,0
	XORLW	B'00000001'	; 是键2?
	BTFSC	STATUS,Z
	CALL	SECFF2
;
	MOVF	DATATRUE,0
	XORLW	B'00000010'	; 是键3?
	BTFSC	STATUS,Z
	CALL	SECFF3
;
	MOVF	DATATRUE,0
	XORLW	B'00000011'	; 是键4?
	BTFSC	STATUS,Z
	CALL	SECFF4
;
	MOVF	DATATRUE,0
	XORLW	B'00000100'	; 是键5?
	BTFSS	STATUS,Z
	GOTO	OUTERROR
	CALL	SECFF5
	GOTO	CCHWT
OUTERROR GOTO	MAIN		; 错误,退出。
;==========查操作码反码=(未起作用)===========
CCHWT  
	MOVLW	0X08		
	MOVWF	ID1
        CLRF    TMR0         
	RRF     COMDATA,1     
	BTFSS   IRIN   
        GOTO    $-1
	BTFSC   IRIN    
        GOTO    $-1
;
        MOVF    TMR0,0         ;取出RTCC当前值。   
        MOVWF   TEST                 
        CALL    RANGELOW       ;查位是低电平?
        BTFSS   FLAG,0      
        GOTO    CCHITEST       
        BCF     COMDATA,7     
        GOTO    NXTCC           
CCHITEST 
        CALL    RANGEHI        
        BTFSS   FLAG,0      
        GOTO    MAIN           ; 错误,退出。
        BSF     COMDATA,7       
NXTCC   DECFSZ  ID1,1          
        GOTO    CCHWT          
;
	MOVF	COMDATA,0
	XORWF	DATABB,0       ; 数据码反码正确?
	BTFSS	STATUS,Z      
	GOTO	MAIN	       ; 错误,退出。

;=============范围测试子程序============      
RANGE45
        MOVLW   0X1F		;3.968ms-->5.37ms
        MOVWF   R1REG		;正确是0X24
        MOVLW   0X2A
        MOVWF   R2REG
        GOTO    RANRAM
;
RANGEHI MOVLW   0X0E		;1.8ms-->2.69ms
        MOVWF   R1REG		;正确“1”是2.25ms
        MOVLW   0X15
        MOVWF   R2REG
        GOTO    RANRAM
;
RANGELOW
        MOVLW   0X06		;0.768ms-->1.53ms
        MOVWF   R1REG		;正确“0”是1.12ms
        MOVLW   0X0C
        MOVWF   R2REG
	GOTO	RANRAM
;==========================
RANRAM  MOVF    R1REG,0         
        SUBWF   TEST,0         
        BTFSS   STATUS,C   ; TEST>=R1REG,  C=1  OK 
        GOTO    NO9            
        MOVF    TEST,0
        SUBWF   R2REG,0        
        BTFSS   STATUS,C   ; R2REG>=TEST,  C=1  OK        
        GOTO    NO9            
        BSF     FLAG,0     ; 说明TEST在这个范围将被认为是正确的信号。 
        GOTO	BACK	
NO9     BCF     FLAG,0     ; R2REG>=TEST >=R1REG
BACK    RETURN 
;====== 改变一次开关状态 ======
SECFF1	MOVLW	B'00000001'	
	XORWF	COUNT1,1	
	MOVF	COUNT1,0
	BTFSS	STATUS,Z
	GOTO	LEDON1		
	BCF	PORTC,1		
	GOTO	LEDOUT1
LEDON1	BSF	PORTC,1	
LEDOUT1	RETURN
;====== 改变一次开关状态 ======
SECFF2	MOVLW	B'00000001'	
	XORWF	COUNT2,1	
	MOVF	COUNT2,0
	BTFSS	STATUS,Z
	GOTO	LEDON2		
	BCF	PORTC,2		
	GOTO	LEDOUT2
LEDON2	BSF	PORTC,2	
LEDOUT2	RETURN
;====== 改变一次开关状态 ======
SECFF3	MOVLW	B'00000001'	
	XORWF	COUNT3,1	
	MOVF	COUNT3,0
	BTFSS	STATUS,Z
	GOTO	LEDON3		
	BCF	PORTC,3		
	GOTO	LEDOUT3
LEDON3	BSF	PORTC,3	
LEDOUT3	RETURN
;====== 改变一次开关状态 ======
SECFF4	MOVLW	B'00000001'	
	XORWF	COUNT4,1	
	MOVF	COUNT4,0
	BTFSS	STATUS,Z
	GOTO	LEDON4		
	BCF	PORTC,4		
	GOTO	LEDOUT4
LEDON4	BSF	PORTC,4	
LEDOUT4	RETURN
;====== 改变一次开关状态 ======
SECFF5	MOVLW	B'00000001'	
	XORWF	COUNT5,1	
	MOVF	COUNT5,0
	BTFSS	STATUS,Z
	GOTO	LEDON5		
	BCF	PORTC,5		
	GOTO	LEDOUT5
LEDON5	BSF	PORTC,5	
LEDOUT5	RETURN
;=========== 3ms键去抖 =============
DELAY	MOVLW	0X04
	MOVWF	MM
DY1	MOVLW	0XFF
	MOVWF	NN
DY2	DECFSZ	NN
	GOTO	DY2
	DECFSZ	MM
	GOTO	DY1
        RETURN 
;=========== LED闪 =============
DELAY1	MOVLW	0XFF
	MOVWF	AA
DYA1	MOVLW	0XFF
	MOVWF	BB
DYA2	DECFSZ	BB
	GOTO	DYA2
	DECFSZ	AA
	GOTO	DYA1
        RETURN 
;==========================
	END


⌨️ 快捷键说明

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