新闻  |   论坛  |   博客  |   在线研讨会
红外线遥控器码测试
tvb2058 | 2007-09-10 14:08:53    阅读:2609   发布文章

 

---------------------------------------------------------------------------

;=================================================
; 定时中断数码管显示加遥控

;=================================================
;
可用来测试常用家电遥控器的码
;=================================================
;
诚电工作室
;=================================================
LED1 EQU 10H
LED2 EQU 11H
LED3 EQU 12H
LED4 EQU 13H
LED5 EQU 14H
LED6 EQU 15H
LED7 EQU 16H
LED8 EQU 17H
LED9 EQU 18H
LED10 EQU 19H

IrDataA EQU 1AH
IrDataB EQU 1BH
IrDataC EQU 1CH
IrDataD EQU 1DH

LedT0 EQU 1EH
LedJS EQU 1FH

ORG 0000H
LJMP START;转入主程序

ORG 000BH ;定时器0中断入口

INT_TO:
PUSH ACC
PUSH PSW
SETB RS0

CLR TF0 ;清定时0中断标?
MOV TH0,#0F6H ;2.5MS
MOV TL0,#03DH ;

INC LedJS
MOV A,LedJS
CJNE A,#200,INT_TO_JS ;500MS
MOV LedJS,#00H

MOV R0,#LED1
MOV R1,#9
INT_T0_DDD:
INC R0
MOV A,@R0
DEC R0
XCH A,@R0
INC R0
MOV @R0,A
DJNZ R1,INT_T0_DDD

INT_TO_JS:

MOV A,#11110000B ;关数码管
ORL P2,A

MOV A,LedT0
CJNE A,#0,INT_T0_1
MOV A,LED1
MOVC A,@A+DPTR
MOV P0,A
CLR P2.7
MOV LedT0,#1
LJMP INT_T0_END
INT_T0_1:

MOV A,LedT0
CJNE A,#1,INT_T0_2
MOV A,LED2
MOVC A,@A+DPTR
MOV P0,A
CLR P2.6
MOV LedT0,#2
LJMP INT_T0_END
INT_T0_2:

MOV A,LedT0
CJNE A,#2,INT_T0_3
MOV A,LED3
MOVC A,@A+DPTR
MOV P0,A
CLR P2.5
MOV LedT0,#3
LJMP INT_T0_END
INT_T0_3:

MOV A,LED4
MOVC A,@A+DPTR
MOV P0,A
CLR P2.4
MOV LedT0,#0
LJMP INT_T0_END

INT_T0_END:

POP PSW
POP ACC

RETI

 

START:
MOV SP,#60H

MOV TMOD,#01H ;设定T0为十六位定时模式。
MOV TH0,#0F6H ;2MS
MOV TL0,#03DH ;
SETB TR0 ;
开定时器0
SETB ET0 ;致能定时0中断

CLR TF0 ;清定时0中断标志
SETB EA ;开总中断

MOV LedT0,#00H
MOV LedJS,#00H
MOV DPTR,#TABLE

MOV LED1,#0EH
MOV LED2,#0EH
MOV LED3,#5H
MOV LED4,#1H
MOV LED5,#10H
MOV LED6,#08H
MOV LED7,#08H
MOV LED8,#08H
MOV LED9,#08H
MOV LED10,#11H

MAIN:

JNB P2.2,IR

LJMP MAIN

;以下为进入P3.2脚外部中断子程序,也就是解码程序
IR:
MOV R6,#9
SB:
ACALL DELAY882 ;
调用882微秒延时子程序
JB P2.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲
ACALL DELAY2400
JNB P2.2,IR_Rp ;
ACALL DELAY2400 ;
延时4.74毫秒避开4.5毫秒的结果码
MOV R1,#IrDataA ;设定1AH为起始RAM区
MOV R2,#4
PP:
MOV R3,#8
JJJJ:
JNB P2.2,$ ;
等待地址码第一位的高电平信号
LCALL DELAY882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P2.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
LCALL DELAY1000
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 ;接收完16位地址码和8位数据码和8位数据,存放在1AH/1BH/1CH/1DH的RAM中

; MOV P1,1DH ;将按键的键值通过P1口的8个LED显示出来!
CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功

LCALL DELAY2400
LCALL DELAY2400
LCALL DELAY2400
SETB P2.3;
蜂鸣器停止

MOV A,IrDataA
ANL A,#11110000B
SWAP A
MOV LED1,A

MOV A,IrDataA
ANL A,#00001111B
MOV LED2,A

MOV A,IrDataB
ANL A,#11110000B
SWAP A
MOV LED3,A

MOV A,IrDataB
ANL A,#00001111B
MOV LED4,A

MOV A,IrDataC
ANL A,#11110000B
SWAP A
MOV LED6,A

MOV A,IrDataC
ANL A,#00001111B
MOV LED7,A

MOV A,IrDataD
ANL A,#11110000B
SWAP A
MOV LED8,A

MOV A,IrDataD
ANL A,#00001111B
MOV LED9,A

MOV LED5,#10H
MOV LED10,#11H

MOV LedJS,#201

LJMP MAIN

IR_Rp:
LJMP MAIN

EXIT:
LJMP MAIN ;退出解码子程序

;=============================882
DELAY882: ;1.085x ((202x4)+5)=882
MOV R7,#202
DELAY882_A:
NOP
NOP
DJNZ R7,DELAY882_A
RET
;=============================1000
DELAY1000: ;1.085x ((229x4)+5)=999.285
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
;=============================2400
DELAY2400: ;1.085x ((245x9)+5)=2397.85
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET

TABLE:
DB 00101000B ;0
DB 11101011B ;1
DB 00110010B ;2
DB 10100010B ;3
DB 11100001B ;4
DB 10100100B ;5
DB 00100100B ;6
DB 11101010B ;7
DB 00100000B ;8
DB 10100000B ;9
DB 01100000B ;A
DB 00100101B ;b
DB 00111100B ;C
DB 00100011B ;d
DB 00110100B ;E
DB 01110100B ;F
DB 11110111B ;-
DB 11111111B ;
END

 

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客