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

📄 wanneng_remote.c

📁 随着家用电器种类的增多
💻 C
📖 第 1 页 / 共 5 页
字号:


LOJI0_V_L:    ;适合低电平时间大于1ms的逻辑0
	MOV R4,L02
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI0_VL_L
	MOV A,R4
	SUBB A,#1
	MOV R4,A
LOJI0_VL_L:            ;低电平为基数40us 加上循环次数* 60us
	lcall delay60us
	DJNZ R4,LOJI0_VL_L
	RET




LOJI1_V_L:     ;适合低电平时间大于1ms的逻辑1 

	MOV R2,L11
LOJI1_VH_L:            ;;高电平为 循环次数*( 载波)
	lcall zaibo
	DJNZ R2,LOJI1_VH_L

	RET


LOJI_H_V:       ;引导码的高
	MOV R2,LH
LOJIH_H_V:
	lcall zaibo
	DJNZ R2,LOJIH_H_V
	RET

LOJI_L_V:               ;引导码的低
	MOV R4,LL
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJIH_L_V
	MOV A,R4
	SUBB A,#1
	MOV R4,A
LOJIH_L_V:
	lCALL DELAY60US
	DJNZ R4,LOJIH_L_V
	RET


LOJID_H_V:
	MOV R2,D_H
LOJID_H1_V:
	lcall zaibo
	DJNZ R2,LOJID_H1_V
	RET

LOJID_L_V:
	MOV R4,D_L
LOJID_L1_V:
	LCALL DELAY60US
	DJNZ R4,LOJID_L1_V
	RET

LOJID_H2_V:
	MOV R2,D_H
LOJID_H22_V:
	lcall zaibo
	DJNZ R2,LOJID_H22_V
	RET

LOJID_L2_V:
	MOV R4,D_L2
LOJID_L22_V:
	LCALL DELAY60US
	DJNZ R4,LOJID_L22_V
	RET




;---------------------- 无载波调制子程序 --------------

SENDDATA_Nothing:
;无载波调制(高位在前先发,延时带一高电平) 
;根据位数可选四种数据类型,和连续发送四个字节数据值
;类型为1则是发短的逻辑0和1,为2则是另一种长的0和1
;类型为3引导码的高和低,为4则是发延时的高和低
    

         
	MOV A,BIT_TEMP
	CJNE A,#0,N_SEND_4BYTE
	LJMP SENDDATA_N_OUT				
N_SEND_4BYTE:

N_1:                         ;根据数据的三种类型选择发哪种逻辑

	MOV A,TYPE_TEMP
	CJNE A,#1,N_2



	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC N_LOJI1
	LCALL LOJI0_N_S
	LJMP N_4BYTE_NEXTBIT
N_LOJI1:
	LCALL LOJI1_N_S
	LJMP N_4BYTE_NEXTBIT
	
N_2: 
	MOV A,TYPE_TEMP
	CJNE A,#2,N_3

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC N_LOJI2
	LCALL LOJI0_N_L
	LJMP N_4BYTE_NEXTBIT
N_LOJI2:
	LCALL LOJI1_N_L
	LJMP N_4BYTE_NEXTBIT



N_3:
	MOV A,TYPE_TEMP
	CJNE A,#3,N_4

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	
	JC N_LOJIH
	LCALL LOJI_L_N
	LJMP N_4BYTE_NEXTBIT
N_LOJIH:
	LCALL LOJI_H_N
	LJMP N_4BYTE_NEXTBIT

N_4:
	MOV A,TYPE_TEMP
	CJNE A,#4,N_5
;	MOV P0,#0FFH
	
	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC N_LOJID_H
	LCALL LOJID_L_N
	LJMP N_4BYTE_NEXTBIT
N_LOJID_H:
	LCALL LOJID_H_N
	LJMP N_4BYTE_NEXTBIT	
N_5:
	MOV A,TYPE_TEMP
	CJNE A,#5,SENDDATA_N_OUT1
;	MOV P0,#0FFH

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A


	JC N_LOJID_H2
	LCALL LOJID_L2_N
	LJMP N_4BYTE_NEXTBIT

SENDDATA_N_OUT1:
	LJMP SENDDATA_N_OUT


N_LOJID_H2:
	LCALL LOJID_H2_N
	LJMP N_4BYTE_NEXTBIT

N_4BYTE_NEXTBIT:
	DEC BIT_TEMP

	LJMP SENDDATA_Nothing


SENDDATA_N_OUT:
	RET


LOJI0_N_S:    ;适合高电平和低电平时间小于1ms的逻辑0

	MOV R2,L01
	MOV R4,L02
LOJI0_NH:            ;高电平为5us
	SETB P2.2
	nop
	nop
	DJNZ R2,LOJI0_NH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI0_NL
	MOV A,R4
	SUBB A,#8
	MOV R4,A
LOJI0_NL:            ;低电平为基数35us 加上循环次数* 5us
	CLR P2.2
	nop
	nop
	DJNZ R4,LOJI0_NL
	RET

LOJI1_N_S:   ;适合高电平和低电平时间小于1ms的逻辑1
	MOV R2,L11
	MOV R4,L12
LOJI1_NH:            ;高电平为5us
	SETB P2.2
	nop
	nop
	DJNZ R2,LOJI1_NH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI1_NL
	MOV A,R4
	SUBB A,#8
	MOV R4,A
LOJI1_NL:            ;低电平为基数45us 加上循环次数* 5us
	nop
	nop
	nop
	DJNZ R4,LOJI1_NL
	RET



LOJI0_N_L:    ;适合低电平时间大于1ms的逻辑0

	MOV R2,L01
	MOV R4,L02
LOJI0_NH_L:            ;高电平为5us
	SETB P2.2
	nop
	nop
	DJNZ R2,LOJI0_NH_L
	CLR P2.2
LOJI0_NL_L:            ;低电平为基数35us 加上循环次数* 60us
	lcall delay60us
	DJNZ R4,LOJI0_NL_L
	RET




LOJI1_N_L:     ;适合低电平时间大于1ms的逻辑1 

	MOV R2,L11
	MOV R4,L12
LOJI1_NH_L:            ;高电平为5us
	SETB P2.2
	nop
	nop
	DJNZ R2,LOJI1_NH_L
	CLR P2.2
LOJI1_NL_L:            ;低电平为基数35us 加上循环次数* 60us
	lcall delay60us
	DJNZ R4,LOJI1_NL_L
	RET


LOJI_H_N:       ;引导码的高
	MOV R2,LH
LOJIH_H_N:
	SETB P2.2
	NOP
	NOP
	DJNZ R2,LOJIH_H_N
	CLR P2.2
	RET

LOJI_L_N:               ;引导码的低

	MOV R4,LL

	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJIH_L_N
	MOV A,R4
	SUBB A,#1
	MOV R4,A
LOJIH_L_N:
	lCALL DELAY60US
	DJNZ R4,LOJIH_L_N
	RET

LOJID_H_N:
	MOV R2,D_H
LOJID_H1_N:
	SETB P2.2
	NOP
	NOP
	DJNZ R2,LOJID_H1_N
	CLR P2.2
	RET

LOJID_L_N:
	MOV R4,D_L
LOJID_L1_N:
	LCALL DELAY60US
	DJNZ R4,LOJID_L1_N
	RET

LOJID_H2_N:
	MOV R2,D_H
LOJID_H22_N:
	SETB P2.2
	NOP
	NOP
	DJNZ R2,LOJID_H22_N
	CLR P2.2
	RET

LOJID_L2_N:
	MOV R4,D_L2
LOJID_L22_N:
	ACALL DELAY60US
	DJNZ R4,LOJID_L22_N
	RET


DELAY60US:
	MOV R5,#26
	DJNZ R5,$
	nop
	RET


;------------------------  特殊调制子程序(无载波的)  -------------------------
SENDDATA_ESPECIAL: 
         
	MOV A,BIT_TEMP
	CJNE A,#0,E_SEND_4BYTE
	LJMP SENDDATA_E_OUT				
E_SEND_4BYTE:

E_1:                         ;根据数据的类型选择发哪种逻辑

	MOV A,TYPE_TEMP
	CJNE A,#1,E_2

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A
	DEC BIT_TEMP
	
	JC E_LOJI2          ;第一位如果是0则移第二位,根据两位确定是哪种类型
	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A



	JC E_LOJI1
	LCALL LOJI0_E_S
	LJMP E_4BYTE_NEXTBIT
E_LOJI1:
	LCALL LOJI1_E_S
	LJMP E_4BYTE_NEXTBIT	

E_LOJI2:                 ;如果第1位为1则判断第二位为0则是逻辑2,为1则是逻辑3
	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC E_LOJI3
	LCALL LOJI2_E_S
	LJMP E_4BYTE_NEXTBIT
E_LOJI3:
	LCALL LOJI3_E_S
	LJMP E_4BYTE_NEXTBIT
	



E_2:
	MOV A,TYPE_TEMP
	CJNE A,#2,E_3

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	
	JC E_LOJIH
	LCALL LOJI_L_E
	LJMP E_4BYTE_NEXTBIT
E_LOJIH:
	LCALL LOJI_H_E
	LJMP E_4BYTE_NEXTBIT

E_3:
	MOV A,TYPE_TEMP
	CJNE A,#3,SENDDATA_E_OUT1	

;	MOV P0,#0FFH	
	
	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC E_LOJID_H
	LCALL LOJID_L_E
	LJMP E_4BYTE_NEXTBIT
E_LOJID_H:
	LCALL LOJID_H_E
	LJMP E_4BYTE_NEXTBIT	

SENDDATA_E_OUT1:
	LJMP SENDDATA_E_OUT



E_4BYTE_NEXTBIT:
	DEC BIT_TEMP

	LJMP SENDDATA_ESPECIAL


SENDDATA_E_OUT:
	RET


LOJI0_E_S:    ;适合高电平和低电平时间小于1ms的逻辑0

	MOV R2,L01
	MOV R4,L02
	SETB P2.2
LOJI0_EH:            ;高电平为5us
	nop
	nop
	nop
	DJNZ R2,LOJI0_EH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI0_EL
	MOV A,R4
	SUBB A,#6
	MOV R4,A


LOJI0_EL:            ;低电平为基数50us 加上循环次数* 5us
	NOP
	nop
	nop
	DJNZ R4,LOJI0_EL
	RET

LOJI1_E_S:   ;适合高电平和低电平时间小于1ms的逻辑1
	MOV R2,L11
	MOV R4,L12
	SETB P2.2
LOJI1_EH:            ;高电平为5us
	nop
	nop
	nop
	DJNZ R2,LOJI1_EH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI1_EL
	MOV A,R4
	SUBB A,#6
	MOV R4,A
LOJI1_EL:            ;低电平为基数50us 加上循环次数* 5us
	nop
	nop
	nop
	DJNZ R4,LOJI1_EL
	RET

LOJI2_E_S:              ;逻辑2
	MOV R2,L21
	MOV R4,L22
	SETB P2.2
LOJI2_EH:            ;高电平为5us
	nop
	nop
	nop
	DJNZ R2,LOJI2_EH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI2_EL
	MOV A,R4
	SUBB A,#9
	MOV R4,A
LOJI2_EL:            ;低电平为基数50us 加上循环次数* 5us
	NOP
	nop
	nop
	DJNZ R4,LOJI2_EL
	RET

LOJI3_E_S:                ;逻辑3
	MOV R2,L31
	MOV R4,L32
LOJI3_EH:            ;高电平为5us
	SETB P2.2
	nop
	nop
	DJNZ R2,LOJI3_EH
	CLR P2.2
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJI3_EL
	MOV A,R4
	SUBB A,#9
	MOV R4,A
LOJI3_EL:            ;低电平为基数50us 加上循环次数* 5us
	NOP
	nop
	nop
	DJNZ R4,LOJI3_EL
	RET


LOJI_H_E:       ;引导码的高
	MOV R2,LH
	SETB P2.2
LOJIH_H_E:
	nop
	NOP
	NOP
	DJNZ R2,LOJIH_H_E
	CLR P2.2
	RET

LOJI_L_E:               ;引导码的低

	MOV R4,LL
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJIH_L_E
	MOV A,R4
	SUBB A,#2
	MOV R4,A

LOJIH_L_E:
	LCALL DELAY30US
	DJNZ R4,LOJIH_L_E
	RET

LOJID_H_E:              ;延时高
	MOV R2,D_H
	SETB P2.2
LOJID_H1_E:
	nop
	NOP
	NOP
	DJNZ R2,LOJID_H1_E
	CLR P2.2
	RET

LOJID_L_E:
	MOV R4,D_L
	MOV A,BIT_TEMP      ;发另外一段波时有误差,在这里判断如果是最后一位就把误差减去
	CJNE A,#1,LOJID_L1_E
	MOV A,R4
	SUBB A,#2
	MOV R4,A
LOJID_L1_E:
	LCALL DELAY30US
	DJNZ R4,LOJID_L1_E
	RET







	
;---------------------------   时间调制子程序 ------------------------


SENDDATA_TIME:    ;时间调制(低位在前先发,延时带一高电平) 
;根据位数可选三种数据类型,和连续发送四个字节数据值   子程序(时间调制)
;类型为1则是发逻辑0和1,为2则是发引导码的高和低,为3则是发延时的高和低
;类型为4时发延时2的高和低  

              
	MOV A,BIT_TEMP
	CJNE A,#0,T_SEND_4BYTE
	LJMP SENDDATA_T_OUT				
T_SEND_4BYTE:

T_1:                         ;根据数据的三种类型选择发哪种逻辑

	MOV A,TYPE_TEMP
	CJNE A,#1,T_2

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	JC T_LOJI1
	LCALL LOJI0
	LJMP S_4BYTE_NEXTBIT
T_LOJI1:
	LCALL LOJI1
	LJMP S_4BYTE_NEXTBIT	

T_2:
	MOV A,TYPE_TEMP
	CJNE A,#2,T_3

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2
	RRC A
	MOV DATA_TEMP2,A
	MOV A,DATA_TEMP1
	RRC A
	MOV DATA_TEMP1,A

	
	JC T_LOJIH
	LCALL LOJI_L
	LJMP S_4BYTE_NEXTBIT
T_LOJIH:
	LCALL LOJI_H
	LJMP S_4BYTE_NEXTBIT

T_3:
	MOV A,TYPE_TEMP
	CJNE A,#3,T_4
	MOV P0,#0FFH

	MOV A,DATA_TEMP4
	RRC A
	MOV DATA_TEMP4,A
	MOV A,DATA_TEMP3
	RRC A
	MOV DATA_TEMP3,A
	MOV A,DATA_TEMP2

⌨️ 快捷键说明

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