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

📄 main.asm.bak

📁 用汇编语言编写的红外遥控解码
💻 BAK
字号:
/**红外遥控解码范例**/
/**作者:田开坤**/
/**较网上可以下载到的程序相比,本代码考虑了解码过程容易死机的问题,采取办法解决了,可以解码失败,但决不死机**/

DQ 		equ 	0ebh	;P4.3定义接口,参考STC89C51数据手册
EX2 	equ 	0c2h	;外部中断2,参考STC89C51数据手册
SEG1	equ		0ffech	;数码管1(最右)
SEG2	equ		0ffedh	;数码管2
SEG3	equ		0ffeeh	;数码管3
SEG4	equ		0ffefh	;数码管4(最左)
BYT_DLY equ		5FH		;延时函数参数变量
DA_BUF	equ		40H		;解码出的数据缓冲区,包括41H


		ORG 0000h
		LJMP main

		ORG 003bh	;外部中断2入口地址,参考STC89C51数据手册
		LJMP EINT3

		ORG 40h
main:	MOV SP,#60h
		SETB EA
		SETB EX2
		SJMP $;原地踏步,等中断解码


//中断接收解码模块

EINT3:	CLR EA//关闭
		MOV R6,#10
SB:		MOV BYT_DLY,#13 ;834uS
	 	ACALL DELAY 	;调用834微秒延时子程序
    	JB DQ,EXIT   	;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
    	DJNZ R6, SB    	;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
;-----------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!

		JNB DQ, $   	;等待,避开 起始码 低电平
		JB DQ,$			;避开结果码


/*;测试按键一次有多少位低电平,不同遥控器不一样*/
/*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
			CLR A
ADDLOOP:	JNB DQ,$
			ADD A,#1
			MOV P1,A
			JB DQ,cADD
			sjmp $
*/

		MOV R7,#16  	;忽略前16位系统识别码 (即地址码)
AAQQ:	JNB DQ,$		;通过低电平段
		;JB DQ,$		;以下6行代码可以用本行替换,但这样容易出现死机。
		MOV R6,#255
CTN2:	JNB DQ,DER7		;等待有效低电平到来,避开 结果码 高电平
		MOV BYT_DLY,#3  ;42uS
		ACALL DELAY 	;调用42微秒延时子程序,延时太短,计数器R6不够大,延时太长,会错过最佳检测点
	 	DJNZ R6,CTN2			 
		LJMP EXIT		;防止死机
DER7:	DJNZ R7,AAQQ

		MOV R1,#DA_BUF 	;设定1AH为起始RAM区
		MOV R2,#2   	;接收从DA_BUF到DA_BUF+1的2个内存,用于存放操作码 (即数据码) 和操作反码
PP: 	MOV R3,#8 		;每组数据为8位
JJJJ: 	JNB DQ,$   		;等待通过数据码的低电平信号,等高电平到来后出去;
		MOV BYT_DLY,#13 ;834uS
		ACALL DELAY 	;高电平开始后用840(560<t<1125,)微秒的时间尺去判断信号此时的高低电平状态
      	MOV C,DQ   		;将DQ引脚此时的电平状态0或1存入C中
      	JNC UUU     	;如果为0就跳转到UUU
		;JB DQ,$		;以下6行代码可以用本行替换,但这样容易出现死机。
		MOV R6,#255
CTN3:	JNB DQ,UUU		;等待有效低电平到来,避开 结果码 高电平
		MOV BYT_DLY,#3  ;42uS
		ACALL DELAY 	;调用840微秒延时子程序
	 	DJNZ R6,CTN3		
		LJMP EXIT		;防止死机

UUU: 	MOV A,@R1   	;将R1中地址的给A
     	RRC A       	;将C中的值0或1移入A中的最低位
     	MOV @R1,A   	;将A中的数暂时存放在R1数值的内存中
     	DJNZ R3,JJJJ	;接收满8位换一个内存

     	INC R1    		;对R1中的值加1,换下一个RAM
     	DJNZ R2,PP  	;接收完8位数据码和8位数据反码,存放在1AH/1BH中				

		MOV A,DA_BUF
		CPL A   				;对1AH取反后和1BH比较
		CJNE A,DA_BUF+1,EXIT 	;如果不等表示接收数据发生错误,放弃
				
		MOV R7,DA_BUF	;将按键的键值通过数码管显示出来!
		ACALL DISP
		CLR P1.0    ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功		
		MOV BYT_DLY,#50
		ACALL DELAY
		SETB P1.0   ;蜂鸣器停止
EXIT: 	SETB EA
		reti


;-------------------------延时子程序---------------------------------
;晶振22.1184M

DELAY:  PUSH    BYT_DLY
DEL31:  PUSH    BYT_DLY
DEL32:  DJNZ    BYT_DLY,DEL32
        POP     BYT_DLY
        DJNZ    BYT_DLY,DEL31
        POP     BYT_DLY
        DJNZ    BYT_DLY,DELAY
        RET

//数码管显示,数据由R7传入
DISP:	mov dptr,#ledmap
		mov a,r7
		anl a,#0fh
		movc a,@a+dptr
		mov dptr,#SEG1
		cpl a
		movx @dptr,a

		mov dptr,#ledmap
		mov a,r7
		swap a					
		anl a,#0fh
		movc a,@a+dptr
		mov dptr,#SEG2
		cpl a
		movx @dptr,a

		mov dptr,#SEG3
		mov a,#0ffh
		movx @dptr,a
		mov dptr,#SEG4		
		movx @dptr,a  
		ret

ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00

		END

⌨️ 快捷键说明

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