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

📄 ircode.asm

📁 AT89C2051程序
💻 ASM
字号:
;*******************************************************************
; iR TOSHIBA Code  -> iR NEC Code
;		V1.0  Dying ----- 2006.01.25
;*******************************************************************
        ORG 	0000H

;	Baud 		DATA 	0FEH	; 9600baudrate/second  12MHz
	DMA_Custom	DATA	00H	; NEC Cunstom
	nDMA_Custom	DATA	0FFH	;
	PowerCode	DATA    1FH

;	TV input custom is 18H
	InCustomData_TV	DATA	18H
	nInCustomData_TV DATA	18H
;	DMA Inpout custom is 10H
	InCustomData_DMA DATA 	08H
	nInCustomData_DMA DATA	08H

	In_Custom	DATA	00H	;
	nIn_Custom	DATA	00H	;

	iROut		BIT	P1.7
	Power		BIT	P1.4

	INPUTCustom	EQU	27H
	INPUTnCustom	EQU	28H
	INPUTDATA	EQU	29H
	INPUTnDATA	EQU	2AH

	OUTPUTCustom	EQU	2BH
	OUTPUTnCustom	EQU	2CH
	OUTPUTData	EQU	2DH
	OUTPUTnData	EQU	2EH

	DelayCounter0	EQU	2FH
	DelayCounter1	EQU	30H

	NECDataCode	EQU	31H
	nNECDataCode 	EQU	32H

	Bit0Counter	EQU	33H
	Bit1Counter	EQU	34H



	RepeatFlag	BIT	30H
	OutCodeFlag	BIT	31H
	noFirstEdgeFlag	BIT	32H
	CustomSmapleFlag BIT	33H

;	26H--3FH		; no used
;	40H--7FH		; If use the AT89C1051U without this RAM
;*********************************************************************
	SJMP	START

	ORG 	0003H
	AJMP	INT_Int0

	ORG	000BH
	AJMP	INT_T0

	ORG	001BH
	AJMP	INT_T1

;----------------------------------------------------------------------
	ORG	0030H
START:
	CLR	Power
;TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan
;	SETB	Power                                   ;康研台湾产品
;TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan

	SETB	iROut
	CLR	A				;clean RAM
	MOV	R0,#7FH
CleanRAM:
	MOV	@R0,A
	DJNZ   	R0,CleanRAM

	MOV	TH0,A
	MOV	TL0,A
	MOV	TH1,#0C9H
	MOV	TL0,A
	MOV	R0,#27H

Initialization:
	MOV	IE,#0BH
	MOV	TMOD,#19H			;T1 : GATE1 = 0   T0: GATE = 1
						;     C/T   = 0       C/T  = 0
						;     M1M0  =01       M1M0 = 01
	MOV	TCON,#01H
	MOV	IP,#00H

	CLR	TR0
	CLR	TR1
	SETB	EA

;-----------------------------------------------------------------------
MainLoop:
	JNB	RepeatFlag,NaturalData		;Repeat code
	CLR	EA
	CLR	iRout
	NOP
	NOP
	ACALL	Delay9000uS

	SETB	iRout
	ACALL	Delay2250uS

	CLR	iRout
	MOV	R6,#00H
	MOV	R6,#00H
	ACALL	Delay560uS
	SETB	iRout
	CLR	RepeatFlag
	SETB	EA

NaturalData:
	JNB	OutCodeFlag,MainLoop
;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
	MOV	A,INPUTDATA				;红外电源控制
	CJNE	A,#PowerCode,StartOutputNEC
	MOV	A,INPUTCustom
	CJNE	A,#InCustomData_DMA,StartOutputNEC
;TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan
;	AJMP    InputDataError				;康研台湾产品

;      	CLR	Power					;2008年7月29日
;	SJMP	$

;TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan TaiWan
	CPL	Power                           

;......................................................

StartOutputNEC:
	CLR	EA
	CLR	iRout				;Output lead code
	ACALL	Delay9000uS

	SETB	iRout
;??????????????????????????????????????????????????????????
	MOV	A,INPUTCustom
;	CJNE	A,#InCustomData_TV,InputDataError
	CJNE	A,#InCustomData_DMA,InputDataError

;	CJNE	A,#nInCustomData,InputDataError
CustomDataRight:
;???????????????????????????????????????????????????????????
	MOV	A,INPUTDATA
	MOV	OUTPUTData,A
	CPL	A
;	CJNE	A,INPUTnDATA,InputDataError
	MOV	Bit0Counter,#00H
	MOV	Bit1Counter,#00H
	MOV	OUTPUTnData,A
	MOV	OUTPUTCustom,#DMA_Custom
	MOV	OUTPUTnCustom,#nDMA_Custom
	ACALL	Delay4500uS

	MOV	R1,#2BH
LoopNextByte:
	MOV	R6,#08H
CustomLoop:
	CLR	iRout
	ACALL	Delay560uS

	SETB	iRout
	MOV	A,@R1
	RRC	A
	JNC	Custom_High_0
Custom_High_1:
	ACALL	Delay1135uS			;1690uS-565uS=1135uS
	INC	Bit1Counter
Custom_High_0:
	ACALL	Delay565uS
	MOV	@R1,A
	DJNZ	R6,CustomLoop
	INC	R1
	CJNE	R1,#2FH,LoopNextByte
	CLR	iRout
	ACALL	Delay560uS
	SETB	iRout

	CPL     P3.7

;108/1.125=96
;96-44=52
/*
	MOV	A,#52				
	SUBB	A,Bit1Counter
	MOV	R6,A
DyingDelay:
	ACALL	Delay1125uS
	DJNZ	R6,DyingDelay

	CLR	iRout
	NOP
	NOP
	ACALL	Delay9000uS

	SETB	iRout
	ACALL	Delay2250uS

	CLR	iRout
	MOV	R6,#00H
	MOV	R6,#00H
	ACALL	Delay560uS
	SETB	iRout
	CLR	RepeatFlag

*/
InputDataError:
	CLR	OutCodeFlag


	SETB	EA
	AJMP	MainLoop

;************************************************************************
Delay9000uS:
	MOV	DelayCounter0,#44
	MOV	DelayCounter0,#44
	MOV	DelayCounter0,#44
	MOV	DelayCounter0,#44
Delay9000:
	MOV	DelayCounter1,#100
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter0,Delay9000
	RET
;------------------------------------------------
Delay4500uS:
	MOV	DelayCounter0,#22
Delay4500:
	MOV	DelayCounter1,#100
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter0,Delay4500
	RET
;----------------------------------------------
Delay2250uS:
	NOP
	NOP
	MOV	DelayCounter0,#11
Delay2250:
	MOV	DelayCounter1,#100
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter0,Delay2250
	RET
;------------------------------------------
Delay1135uS:
	MOV	DelayCounter1,#56
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	RET
;------------------------------------------
Delay1125uS:
	MOV	DelayCounter1,#0
;	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	RET
;------------------------------------------
Delay565uS:
	MOV	DelayCounter1,#16
	MOV	DelayCounter1,#16
	MOV	DelayCounter1,#16
	MOV	DelayCounter1,#16
	MOV	DelayCounter1,#26
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	RET
;---------------------------------------------
Delay560uS:
	MOV	DelayCounter1,#100
	DJNZ	DelayCounter1,$
	DJNZ	DelayCounter1,$
	RET

;-----------------------------------------------------------------------
INT_Int0:
	PUSH	ACC
	JB	noFirstEdgeFlag,noFirstEdge
TheFirstEdge:
	MOV	TH1,#0C9H
	MOV	TL1,#4FH
	SETB	TR1						;Start smaple code
	SETB 	TR0
	SETB	noFirstEdgeFlag
	MOV	TH0,#00H
	MOV	TL0,#00H
	POP	ACC
	RETI

noFirstEdge:	
	JB	CustomSmapleFlag,CustomSmapleDo
	CLR	TR1
	MOV	R4,TL1
	MOV	TL1,#0EEH					;这个基数是为了出现错误时恢复用的,利用T1的中断 
								;这个基数与开始为不同
	MOV	R5,TH1
	MOV	TH1,#0C9H
	SETB	TR1
;	CLR	TR0
	CJNE	R5,#0ECH,LeadError		;23+C9		; 9000 = 2328H
        NOP
	CJNE	R4,#0B0H,LeadLowGood				; 2300H < T1 Counter < 2350H  Lead code is good
LeadLowGood:
	JNC	LeadError					; > 2350H Error
;????????????????????????????????????????????
;	CJNE	R4,#20H,LeadLowGoodxx
;LeadLowGoodxx:
;	JC	LeadError
;?????????????????????????????????????????????
	NOP
	MOV	R4,TH0
	CJNE	R4,#11H,LeadError				; 4500 = 1194H	
	MOV	R4,TL0
	CJNE	R4,#0C0H,LeadHighGood0		;0E8		; 1150H < T0 Counter < 11C8H lead code High good
LeadHighGood0:
	JNC	LeadError
;;	CJNE	R4,#20H,LeadHighGood1
;;LeadHighGood1:
;;	JC	LeadError
	MOV	TH0,#00H
	MOV	TL0,#00H
	
;	SETB	TR0
	SETB	CustomSmapleFlag
	MOV	R7,#08H
	POP	ACC
	RETI

LeadError:
	CLR	TR1
	CLR	TR0
	MOV	TH1,#0C9H
	MOV	TL1,#4FH
	MOV	TH0,#00H
	MOV	TL0,#00H
	CLR	noFirstEdgeFlag
	CLR	CustomSmapleFlag
	MOV	R0,#27H
	POP	ACC
	RETI

CustomSmapleDo:
	CLR	TR1
	MOV	R4,TL1
	MOV	TL1,#0EEH
	MOV	R5,TH1
	MOV	TH1,#0C9H
	SETB	TR1

	CJNE	R5,#0CEH,CycleBit1	;04+C9			; 1125 = 0465H
CycleBit0:							; 0410H < "0" < 04C9H
;;	CJNE	R4,#90H,Cyclemuch0	
;;Cyclemuch0:
;;	JNC	LeadError					; > 04C9H Error
;	CJNE	R4,#5FH,Cyclemuch1	
;Cyclemuch1:
;	JC	LeadError					; < 0410H Error

;???????????????????????????????????????????
;	MOV	R4,TH0						; 0201H < "0" high < 0265H
;	CJNE	R4,#01H,LeadError				; the high <> 02FFH Error
;	MOV	R4,TL0
;;	CJNE	R4,#50H,Cyclemuch00
;;Cyclemuch00:
;;	JNC	LeadError					; the high >0235H Error
;	CJNE	R4,#0B0H,Cyclemuch11
;Cyclemuch11:
;	JC	LeadError					; < 0201H Error
;??????????????????????????????????????????
	CLR	C

WaitNextDataInput:
	MOV	A,@R0
	RRC	A
	MOV	@R0,A
	MOV	TH0,#00H
	MOV	TL0,#00H
	DJNZ	R7,WaitNextInt
	MOV	R7,#08H
	CJNE	R0,#29H,WaitNextInt1				;由于时间不足只采集了3个字节
	SETB	OutCodeFlag
	SJMP	LeadError
WaitNextInt1:
	INC	R0
WaitNextInt:
	POP	ACC
	RETI

CycleBit1:
	CJNE	R5,#0D2H,LeadError		;08+C9		; 2250 = 08CAH
;	CJNE	R4,#04FH,Cyclemuch2				; 086AH < "1" < 08FFH
;Cyclemuch2:
;	JNC	LeadError					; > 08FFH Error

;;	CJNE	R4,#04FH,Cyclemuch3		
;;Cyclemuch3:
;;	JC	LeadError					; < 086AH Error
;?????????????????????????????????????????????
;	MOV	R4,TH0						; 066AH < "1" high < 06CAH
;	CJNE	R4,#06H,LeadError				; <>06xx Error
;	MOV	R4,TL0
;	CJNE	R4,#090H,Cyclemuch22
;Cyclemuch22:
;	JNC	LeadError					; the high > 06CAH Error
;	CJNE	R4,#50H,Cyclemuch33
;Cyclemuch33:
;	JC	LeadError					; the high < 066AH Error
;???????????????????????????????????????????????
	SETB	C
	SJMP	WaitNextDataInput

;-----------------------------------------------------------------------
INT_T1:
	CJNE	R7,#07H,NotRepeatCode
	SETB	RepeatFlag
NotRepeatCode:
	CLR	TR1
	CLR	TR0
	MOV	TH1,#0C9H
	MOV	TL1,#4FH
	MOV	TH0,#00H
	MOV	TL0,#00H
	CLR	noFirstEdgeFlag
	CLR	CustomSmapleFlag
	MOV	R0,#27H
	RETI

;------------------------------------------------------------------------
INT_T0:
	CLR	TR1
	CLR	TR0
	MOV	TH1,#0C9H
	MOV	TL1,#4FH
	MOV	TH0,#00H
	MOV	TL0,#00H
	CLR	noFirstEdgeFlag
	CLR	CustomSmapleFlag
	MOV	R0,#27H
	RETI

;********************************** END *********************************
	END


⌨️ 快捷键说明

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