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

📄 jieshou.asm

📁 自己编写的一个单片机控制红外发送与接收的红外接收源程序,同时自己也做了一个板实验,是成功的哦
💻 ASM
字号:
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP WAIBU
ORG 000BH
LJMP DS0
ORG 0040H

MAIN:
	MOV 	TMOD,#11H
	MOV 	TH0,#0FFH
	MOV 	TL0,#09BH
	SETB 	ET0
    SETB    IT0
	SETB 	EX0 
	SETB 	EA
	SETB	TR0
	MOV 	P2,#0FFH
	MOV 	P1,#0
	MOV 	R0,#1FH			//接收过来的9个(起始码和结果码+8位的数据)脉冲值(没有解码之前是9个不同的时间,比如两个下降沿之间的时间差是1.5ms同,则代表数据0)存放在20H-28H里,R0用于取这些寄存器的地址
	MOV 	R2,#0			//R2用于计时,即判断接收过来的波形两连续下降沿之间的时间差,在DS0内每自增一次的时间是100us
	MOV 	R3,#0 			//R3相当于开门的钥匙,它只能取0和1,详细解释请看用到R3时的解释
	MOV		R4,#0			//R4用于存储解码出来的数据
	LJMP 	$




WAIBU:
	CLR 	EA
	CLR		TR0
	CLR		C
	CJNE 	R3,#1,K0		//如果R3等于1,就顺序执行,即进入正题(取码值和解码),否则进入K0子程序
	MOV 	TH0,#0FFH
	MOV 	TL0,#09BH
	CJNE 	R0,#28H,START		//R0是从20H(寄存器地址)开始的,要计9个(起始码和结果码+8位的数据)R2的值,所以是28H
	MOV 	R0,#20H			//跳完了9次START后,数据的采集就完成了,所以给R0赋回初值
	MOV 	R3,#0			//跳完了9次START后,也意味着下次该先进K0子程序,所以这里要“关门”
	LJMP 	JIEMA  							
START:					//START程序用于把每次R2所计到的时间存放到R0所代表的地址里。
	MOV 	A,R2
	MOV 	@R0,A
	INC 	R0
	MOV 	R2,#0			//给R2清零,以便下记此时到下一个下降沿来时之间的时间差
	SETB	TR0
	SETB	EA
	RETI
	
K0:					//K0这一段程序是为了除去每一个接收过来的数据(包括起始码、结果码和8位的数据)的第一个下降沿前面的时间(R2)。这段程序虽不能明显的看出“除去”之意,其实暗含没有采集第一个R2。
	MOV 	R3,#1			//给R3赋1,就是让下一次外部中断程序执行时,不要再执行K0程序了,而是去执行取码和解码。相当于“开门”。
	MOV 	TH0,#0FFH
	MOV 	TL0,#09BH
	MOV 	R2,#0  			//给R2清零,开始计此时到下一个下降沿到来之间的时间差。
	SETB	EA
	SETB	TR0
	RETI

 DS0:					//定时器0中断服务子程序,R2自增1,则计到时间100us
	
	INC 	R2
	MOV 	TH0,#0FFH
	MOV 	TL0,#09BH
	RETI



JIEMA:
	CLR 	C
	MOV 	A,1FH
	CJNE 	A,#100,X1
X1:
	JC 		X2
	CJNE 	A,#200,X3
X2:
	LJMP 	MAIN
X3:
	JNC 	X2
	LJMP 	JIEMA1	


JIEMA1:
	CJNE	R0,#28H,L0		//判断9次解码是不是完成,若没完成,则跳到L0里面继续解码工作,若完成,则顺序执行下面的DONE程序
	LJMP	DONE
L0:	
	CLR		C
	CJNE	@R0,#25,L1		//这里的20是2ms的意思,因为R2自增1,所代表的时间100us
L1:	
	JNC		L3		//65行到68行语句是为了判断C的值,即判断R0所指向的地址里的时间与2ms相比是大于还是小于,小于就顺序执行,继续判断解0的条件
	MOV		A,R4
	RL		A		//每一次都是把取出来的码值放入R4寄存器里的最低位,所以得向左移位
	ANL		A,#0FEH		//取0这个码值,到了这里就把0这个码值取出来了
	MOV		R4,A		//72行到75行语句的目的是为了把取出来的码值放入R4寄存器内
	INC		R0
	LJMP	JIEMA1			//解完0这个码值则返回JIEMA,继续解下一个码值

		
L3:					//L3和L4是为了取1这个码值

	CLR		C
	CJNE	@R0,#45,L4		//同上理,这里的40是4ms的意思
L4:	

	JNC		L5		//82到84行语句是为了判断C的值,加上前面对2ms的判断,就构成判断R0所指向的地址里的数是不是在“2ms-4ms”之间了
	CLR		C
	MOV		A,R4
	RL		A		//每一次都是把取出来的码值放入R4寄存器里的最低位,所以得向左移位
	ORL		A,#01H		//取1这个码值,到了这里就把0这个码值取出来了
	MOV		R4,A		//86行到89行语句的目的是为了把取出来的码值放入R4寄存器内
L5:
	INC		R0
	LJMP	JIEMA1			//解完1这个码值则返回JIEMA,继续解下一个码值




DONE:
	MOV		P2,R4
	SETB	EA
	SETB	TR0
	MOV		R4,#0
	MOV 	R0,#20H
	
	RETI
	END

⌨️ 快捷键说明

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