单片机红外线解码程序(日本三菱M50462系列)----原创1
本帖最后由 ddcchh 于 2012-5-5 11:01 编辑;==========================================================================
;====Power Disassembler for MCS-51 and 6502================================
;==========================================================================
; Writen by: 覃远高
; Copyright: 覃远高
; HomePage: http://coolsh.163.net
; E-mail: qinyg@163.net
; Tel: 0755-2282553
; Update: 3.Jul,2000
;==========================================================================
;===========Disassemble information========================================
;==========================================================================
; File Name: C:\My Documents\Hwx_18A
; IC Body: MCS-51
; Date: 07-11-10
;==========================================================================
;==========================================================================
;标号==============指令================================地址===机器码=======
;==========================================================================
;******************************************************************
;************红外线接收器程序 2007/11/11 修改2003年5月在合肥市原创*********************
;**************处理16位红外线编码和八位键值P3.7 ,P3.5,P3.3,P3.2*************************
; *********************************八位键值 P1.2 ,P1.3,P1.4,P1.5**********************
Q0000: NOP ; 待CPU复位
CLR A ; 清零
MOV P1,#00 ; 外部P1=0
MOV P3,#00 ; 外部P3=0
SETB P3.0 ;串行口移位寄存器方式用
SETB P3.1 ; 串行口移位寄存器方式用,应为高电平
Q0006: LCALL Q003D ; 调用89C51内部RAM单元清0子程序
LCALL Q006E ; 调用初始化和遥控数据读取子程序
NOP ;
NOP ;
NOP ;
LCALL Q0121 ; 调用键值处理子程序
LCALL WWW ;调用内存单元2FH,2EH 编码显示子程序
LCALL Q025C ;调用 延时子程序50ms
LCALL Q025C ;调用 延时子程序50ms
START: LJMPQ0006 ; 从头开始循环
;==========================================================================
Q001B: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q0023: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q002B: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q0033: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q003B: DB00H, 00H ;..
;============= 89C51内部RAM单元清0子程序 =======================================
Q003D: NOP
CLR A ;A=0
SETBP3.4 ; 红外线信号输入口置为输入壮态
MOV R0,#08H ;从内部RAM 08H单元开始清0
MOV R1,#55H ;共计77个单元清0
Q0044: MOV @R0,A ; 送0至各单元
INC R0 ; 指向下一个单元
DJNZR1,Q0044 ; 循环
MOV SP,#60H ; 内部堆栈指针
RET ;子程序返回
;==========================================================================
Q004C: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q0054: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q005C: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q0064: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q006C: DB00H, 00H ;..
;============================初始化和遥控数据读取子程序 ===============
Q006E: CLR ET1 ;关T1中断允许
CLR TR1 ;关定时器T1
CLR EX0 ;关外部中断0口
; CLR EA ;关总中断
MOV R0,#08H ; 高电平计数值存放首地址
MOV R1,#3DH ; 低电平计数值存放首地址
CLR A ;A清零
MOV DPH,A ;高位计数器清零
MOV DPL,A ;低位计数器清零
Q007F: JNB P3.4,Q0094 ;寻找红外线输入起始位,此位为0时转Q0094
;判断是否为起始位
INC DPTR ;此位为高平时对DPTR 循环计数,每过21us计数一次
NOP ; 以下为空操作延时
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
AJMPQ007F ; 转开始检测,等待低电平出现
;***********************判断是否为起始位 *********************************************
Q0094: CJNEA,DPH,Q009D ;高八位计数值不为0是起始位(255*21us=5.355ms,大于此值一般为起始位)
MOV DPH,A ; 高位计数值为0,不是起始位
MOV DPL,A ;清0
AJMPQ007F ;重新寻找起始位
Q009D: CLR A ;处理起始位开始,A清0
MOV DPH,A ; 计数器高位清零
MOV DPL,A ; 计数器低位清零
Q00A2: JB P3.4,Q00B7 ; 检测输入端电平,决定程式方向
INC DPTR ; 低电平时循环对DPTR计数
NOP ; 空操作延时
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
AJMPQ00A2 ; 循环周期为21us
Q00B7: MOV R4,DPH ; 存起始位,高八位送R4中
MOV R5,DPL ; 存起始位,低八位送R5中
MOV DPH,#00H ; 计数器高位清0
MOV DPL,#00H ; 计数器低位清0或放入校正值
AJMPQ00EE ; 转处理高平程序
;*******************************低电平处理,并且存高电平时的计数值**********************
Q00C3: NOP ;
NOP ;
MOV @R0,DPL ;存入高电平时的计数值(在08H--**H单元中)
INC R0 ; 指向下一个单元
MOV DPL,#00H ; 清0,为下一次计数作准备
MOV DPH,#00H ;
Q00CE: JB P3.4,Q00E3 ;读低电平程序,高电平时再转Q00E3
INC DPTR ; 低电平时对DPTR计数
NOP ; 空操作延时
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
AJMPQ00CE ; 每21us循环计数一次
Q00E3: NOP ;
NOP ;
MOV @R1,DPL ; 存低电平数据(地址从89C2051从3DH开始)
INC R1 ; 指向下一个单元
MOV DPL,#00H ;清零
MOV DPH,#00H ;
;***********************处理高平程序***************************************
Q00EE: JNB P3.4,Q0103 ;检测红外线输入端 ,高电平顺序执行,低电平转移至LL9
INC DPTR ; 高电平计数
NOP ; 空操作延时
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
NOP ;
AJMPQ00EE ;循环计数
Q0103: CLR A ;低电平时入口,清A
CJNEA,DPH,Q0109 ; 比较,DPH为0时,顺序执行;不为0时是停止位转Q0109处理
AJMPQ00C3 ; 转低电平处理,并且存高电平时的计数值
Q0109: MOV @R0,A ;
MOV @R1,A ;
SETBP3.4 ;
NOP ;
RET ;
;==========================================================================
Q010F: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q0117: DB00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........
Q011F: DB00H, 00H ;..
;==========================================================================
;******************************* 键值处理子程序****************************
Q0121: PUSH00H ; 压堆栈保护R0
PUSH01H ; 压堆栈保护R1
PUSH2EH ; 压堆栈保护2EH
PUSH2FH ; 压堆栈保护2FH
MOV R1,#10H ;电平计数值存放首地址(10H、11H、12H、13H、14H、15H、16H、17H)
MOV R0,#08H ;电平计数值存放首地址(08H、09H、0AH、0BH、0CH、0DH、0EH、0FH)
;*********************************处理2F.7位 ************************************************
CLR C ; 清进位位
MOV A,@R0 ; 高位一个计数值送A中
SUBBA,#47H ; 和临界值比较
JNC Q017F ;小于47转
SETBC ;大于47 置进位位
MOV 2FH.7,C ;这位值送位地址7FH
Q0136: INC R0 ;指向下一个高位计数值
;*********************************处理2F.6位 ************************************************
CLR C ;清进位位
MOV A,@R0 ;高位一个计数值送A中
SUBBA,#47H ;和临界值比较
JNC Q0184 ;小于47转
SETBC ;大于47 置进位位
MOV 2FH.6,C ;这位值送位地址7FH
Q0140: INC R0 ;
;*********************************处理2F.5位 ***************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q0189 ;
SETBC ;
MOV 2FH.5,C ;
Q014A: INC R0 ;
;*********************************处理2F.4位 ****************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q018E ;
SETBC ;
MOV 2FH.4,C ;
Q0154: INC R0 ;
;*********************************处理2F.3位 **************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q0193 ;
SETBC ;
MOV 2FH.3,C ;
Q015E: INC R0 ;
;*********************************处理2F.2位 ***************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q0198 ;
SETBC ;
MOV 2FH.2,C ;
Q0168: INC R0 ;
;*********************************处理2F.1位 ***************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q019D ;
SETBC ;
MOV 2FH.1,C ;
Q0172: INC R0 ;
;*********************************处理2F.0位 ***************************
CLR C ;
MOV A,@R0 ;
SUBBA,#47H ;
JNC Q01A2 ;
SETBC ;
MOV 2FH.0,C ;
LJMPQ01A5 ;
;==========================================================================
;*********************************处理2F.7_0位 *************************
Q017F: CLR C ; 清进位位
MOV 2FH.7,C ;0送位地址
AJMPQ0136 ;指向下一位
;*********************************处理2F.6_0位 ****************************
Q0184: CLR C ;清进位位
MOV 2FH.6,C ;0送位地址
AJMPQ0140 ;指向下一位
;*********************************处理2F.5位_0位 **************************
Q0189: CLR C ;
MOV 2FH.5,C ;
AJMPQ014A ;
;*********************************处理2F.4位_0位 **************************
Q018E: CLR C ;
MOV 2FH.4,C ;
AJMPQ0154 ;
;*********************************处理2F.3位_0位 ***************************
Q0193: CLR C ;
MOV 2FH.3,C ;
AJMPQ015E ;
;*********************************处理2F.2位_0位 ****************************
Q0198: CLR C ;
MOV 2FH.2,C ;
AJMPQ0168 ;
;*********************************处理2F.1位_0位 *****************************
Q019D: CLR C ;
MOV 2FH.1,C ;
AJMPQ0172 ;
;*********************************处理2F.0位_0位 ******************************
Q01A2: CLR C ;
MOV 2FH.0,C ;
;*********************************处理后八位键值 ******************************
;*********************************处理2E.7位_1位 ******************************
Q01A5: CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q01F6 ;
SETBC ;
MOV 2EH.7,C ;
;*********************************处理2E.6位_1位 *******************************
Q01AE: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q01FB ;
SETBC ;
MOV 2EH.6,C ;
;*********************************处理2E.5位_1位 *******************************
Q01B8: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q0200 ;
SETBC ;
MOV 2EH.5,C ;
;*********************************处理2E.4位_1位 *******************************
Q01C2: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q0205 ;
SETBC ;
MOV 2EH.4,C ;
;*********************************处理2E.3位_1位 *******************************
Q01CC: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q020A ;
SETBC ;
MOV 2EH.3,C ;
;*********************************处理2E.2位_1位 *******************************
Q01D6: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q020F ;
SETBC ;
MOV 2EH.2,C ;
;*********************************处理2E.1位_1位 *******************************
Q01E0: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q0214 ;
SETBC ;
MOV 2EH.1,C ;
;*********************************处理2E.7位_0位 *******************************
Q01EA: INC R1 ;
CLR C ;
MOV A,@R1 ;
SUBBA,#47H ;
JNC Q0219 ;
SETBC ;
MOV 2EH.0,C ;
;*******************************************************************************************
AJMPQ021A ; 转进一步处理,从外部口输出电平
;*******************************************************************************************
;*********************************处理2E.7_0位 ************************
Q01F6: CLR C ;
MOV 2EH.7,C ;
AJMPQ01AE ;
;*********************************处理2E.6_0位 ************************
Q01FB: CLR C ;
MOV 2EH.6,C ;
AJMPQ01B8 ;
;*********************************处理2E.5_0位 ************************
Q0200: CLR C ;
MOV 2EH.5,C ;
AJMPQ01C2 ;
;*********************************处理2E.4_0位 ************************
Q0205: CLR C ;
MOV 2EH.4,C ;
AJMPQ01CC ;
;*********************************处理2E.3_0位 ************************
Q020A: CLR C ;
MOV 2EH.3,C ;
AJMPQ01D6 ;
;*********************************处理2E.2_0位 ************************
Q020F: CLR C ;
MOV 2EH.2,C ;
AJMPQ01E0 ;
;*********************************处理2E.1_0位 ************************
Q0214: CLR C ;
MOV 2EH.1,C ;
AJMPQ01EA ;
;*********************************处理2E.0_0位 ************************
Q0219: CLR C ;
MOV 2EH.0,C ;
;*******************************进一步处理,从外部口输出电平*******************************
Q021A: CLR A ; A清0
CJNE A, 2FH,Q0220 ; 未按键时不存显示数据
AJMP Q021C ; 转正常显示
Q0220: MOVA,2EH ; 送代码
CPLA ;求反
MOV7FH,A ;作显示保存用
MOVA,2FH ;送数据
CPL A ;求反
MOV7EH,A ;作显示保存用
Q021C: MOV A,2FH ;键值单元送A中
CPL A ;取反
MOV B,A ;送B中保存
CJNEA,#0E2H,Q024F ;和常数E2H比较,各遥控器值不同
MOV A,2EH ;键值单元送A中
CPL A ;取反
CJNEA,#14H,Q022C ;熊猫YKF-9电视机遥控器1#键
CPL P3.7 ;口位值取反
Q022C: CJNEA,#04H,Q0231 ;熊猫YKF-9电视机遥控器2#键
CPL P3.5 ;口位值取反
Q0231: CJNEA,#18H,Q0236 ; 熊猫YKF-9电视机遥控器3#键
CPL P3.3 ;口位值取反
Q0236: CJNEA,#08H,Q023B ; 熊猫YKF-9电视机遥控器4#键
CPL P3.2 ; 口位值取反
Q023B: CJNEA,#0CH,Q0240 ; 熊猫YKF-9电视机遥控器5#键
CPL P1.5 ; 口位值取反
Q0240: CJNEA,#10H,Q0245 ; 熊猫YKF-9电视机遥控器6#键
CPL P1.4 ; 口位值取反
Q0245: CJNEA,#00H,Q024A ; 熊猫YKF-9电视机遥控器7#键
CPL P1.3 ; 口位值取反
Q024A: CJNEA,#90H,Q024F ; 熊猫YKF-9电视机遥控器0#键
CPL P1.2 ; 口位值取反
Q024F: POP 2FH ; 弹出堆栈
POP 2EH ; 弹出堆栈
POP 01H ; 弹出堆栈
POP 00H ; 弹出堆栈
RET ; 子程序返回
;==========================================================================
Q0258: DB00H, 00H, 00H, 00H ;....
;==========================================================================
;***************************** 延时子程序50ms ************************************
Q025C: PUSH05H ;
PUSH06H ;
MOV R5,#0BFH ;
Q0262: MOV R6,#0FFH ;
DJNZR6,$ ;
DJNZR5,Q0262 ;
POP 06H ;
POP 05H ;
RET ;
;==========================================================================
Q02FD: DB00H, 00H, 00H, 00H ;....
;==========================================================================
;******************** 内存单元编码显示子程序 **************************************
ORG 0500H
WWW:SETBES ;串行口中断允许
SETBEA ; 总中断允许
MOV SCON,#00H ;串行口模式为移位寄存器模式,P3.0 接数据 P3.1接时钟
;********************** 2FH单元数据显示 *******************************************
LOOP: MOV A,7FH ;送一个数据
XXX: MOV R6,A ; 数据送R6暂存
SWAP A ;半字节交换,处理高四位
ANL A,#0FH ;去掉高四位
MOV DPTR ,#TABLE ; 码表首地址
MOVC A, @A+DPTR; 查表转换
MOV SBUF,A ; 送串口发送
JNB TI,$ ; 等候发完
CLR TI ;清标致位
PUSH 06 ;
MOV A,R6 ;取出存数
ANL A,#0FH ;处理低四位
MOV DPTR ,#TABLE ; 表首地址
MOVC A, @A+DPTR; 查表
MOV SBUF,A ;送串行口发送
WAIT: JNB TI,WAIT ; 等等
CLR TI ; 清标致
AJMP PPP ;转低电平单元数据显示
;**********************2EH单元数据显示*******************************************
PPP:MOV A,7EH ;送数
MOV R6,A ; 不是0送入R6保存
SWAP A ;半字节交换,先处理高四位
ANL A,#0FH ; 去掉高四位
MOV DPTR ,#TABLE;码表地址
MOVC A, @A+DPTR ; 查表
MOV SBUF,A ; 送串行口发送
JNB TI,$ ; 等候
CLR TI ;清标致
MOV A,R6 ; 取数
ANL A,#0FH ; 处理低四位
MOV DPTR ,#TABLE; 码表
MOVC A, @A+DPTR ; 查表
MOV SBUF,A ;送串口
WAIT2: JNB TI,WAIT2 ; 等候
CLR TI ;清标致
PPP1: POP 06H ;弹出
RET ;
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H;码表--0,1,2,3,4,5,6,7,8
DB 90H,88H,83H,0C6H,0A1H,86H,8EH ;--9,A,B,C,D,E,F
END 要好好研究一下才行。。。学习了。。。谢谢共享 我用这个程序做的客厅红外线遥控灯(2008年使用至今),正如网上评论的一样,有时误动作(电视机遥控器在作怪!),抽点时间将电路整理出来!供大家点评! 楼主就是覃远高吗,这个名字好熟 没有"覃远高"老师伟大,他开的一个网页我看过,里面东东不少! 是不是反编译出来的? 2004年写的程序,注解不详,后来源文件丢失,HEX文件在,后又反汇编改写.
页:
[1]