📄 xiaoche.lst
字号:
;=================================================
; 红外遥控接收
;=================================================
ORG 0000H
0000 MAIN:
0000 30A203 JNB P2.2,IR ;遥控扫描
0003 020000 LJMP MAIN ;在正常无遥控信号时,一体化红外接收头输出是高电平,程序一直在循环。
;=================================================
; 解码程序
0006 IR:
;以下对遥控信号的9000微秒的初始低电平信号的识别,波形见图5。
0006 7E0A MOV R6,#10
0008 IR_SB:
0008 1167 ACALL DELAY882 ;调用882微秒延时子程序(0.882ms)
000A 20A22D JB P2.2,IR_ERROR ;延时882微秒后判断P2.2脚是否出现高电平如果有就退出解码程序
000D DEF9 DJNZ R6,IR_SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序(0.882*10=882ms)
;识别连发码,和跳过4.5ma的高电平。
000F 30A2FD JNB P2.2, $ ;等待高电平避开9毫秒低电平引导脉冲
0012 1175 ACALL DELAY2400
0014 30A220 JNB P2.2,IR_Rp ;这里为低电平,认为是连发码信号,见图6。
0017 1175 ACALL DELAY2400 ;延时4.74毫秒避开4.5毫秒的结果码
;以下32数据码的读取,0和1的识别 请看图2
0019 791A MOV R1,#1AH ;设定1AH为起始RAM区(系统码1)
001B 7A04 MOV R2,#4
001D IR_4BYTE:
001D 7B08 MOV R3,#8 ;用于读取8位数据
001F IR_8BIT:
001F 30A2FD JNB P2.2,$ ;等待地址码第一位的高电平信号
0022 120067 LCALL DELAY882 ;高电平开始后用882微秒(0.882ms)的时间尺去判断信号此时的高低电平状态
0025 A2A2 MOV C,P2.2 ;将P2.2引脚此时的电平状态0或1存入C中
0027 5003 JNC IR_8BIT_0 ;如果为0就跳转到IR_8BIT_0
0029 12006E LCALL DELAY1000 ; 调用1 ms延时
002C IR_8BIT_0:
002C E7 MOV A,@R1 ;将R1中地址的给A
002D 13 RRC A ;将C中的值0或1移入A中的最低位
002E F7 MOV @R1,A ;将A中的数暂时存放在R1中
002F DBEE DJNZ R3,IR_8BIT ;接收地址码的高8位
0031 09 INC R1 ;对R1中的值加1,换下一个RAM
0032 DAE9 DJNZ R2,IR_4BYTE ;接收完16位地址码和8位数据码和8位数据,
;存放在1AH /1BH/ 1CH/ 1DH的RAM中
; 系统码1 系统码2 数据码 数据反码
;解码成功
0034 02003D JMP IR_GOTO
0037 IR_Rp:
;这里为重复码执行处
;按住遥控按键时,每过108ms就到这里来
0037 02003D JMP IR_GOTO
003A IR_ERROR: ;错语退出
003A 020000 LJMP MAIN ;退出解码子程序
;=================================================
003D IR_GOTO:
;遥控执行部份
;这里还要判断1AH和1BH 两个系统码或用户码,用于识别不同的遥控器
;MOV A,1AH
;CJNE A,#xxH,IR_ERROR ;用户码1不对则退出
;MOV A,1BH
;CJNE A,#xxH,IR_ERROR ;用户码2不对则退出
;判断两个数据码是否相反
003D E51C MOV A,1CH ;1CH=数据正码*******1DH=数码反码(遥控器接收部分用反码)
003F F4 CPL A
0040 B51DF7 CJNE A,1DH,IR_ERROR ;两个数据码不相反则退出
0043 C2A3 CLR P2.3 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功????????????
0045 120075 LCALL DELAY2400
0048 120075 LCALL DELAY2400
004B 120075 LCALL DELAY2400
004E D2A3 SETB P2.3 ;蜂鸣器停止?????????
0050 E51D MOV A,1DH
0052 900081 MOV DPTR,#TAB ;功能键处理
0055 E0 MOVX A,@DPTR
0056 F590 MOV P1,A
;遥控执行部份
;MOV A,1DH ;判断对应按键
;CJNE A,#xxH,$+6
;LJMP -à跳到对应按键执行处
;CJNE A,#xxH,$+6
;LJMP -à跳到对应按键执行处
;.
;清除遥控值使连按失效
0058 751A00 MOV 1AH,#00H
005B 751B00 MOV 1BH,#00H
005E 751C00 MOV 1CH,#00H
0061 751D00 MOV 1DH,#00H
0064 020000 LJMP MAIN
;=================================================
; 延时子程序
;=============================882us
0067 DELAY882: ;1.085x ((202x4)+5)=882
0067 7FCA MOV R7,#202
0069 DELAY882_A:
0069 00 NOP
006A 00 NOP
006B DFFC DJNZ R7,DELAY882_A
006D 22 RET
;=============================1000us
006E DELAY1000: ;1.085x ((229x4)+5)=999.285
006E 7FE5 MOV R7,#229
0070 DELAY1000_A:
0070 00 NOP
0071 00 NOP
0072 DFFC DJNZ R7,DELAY1000_A
0074 22 RET
;=============================2400us
0075 DELAY2400: ;1.085x ((245x9)+5)=2397.85
0075 7FF5 MOV R7,#245
0077 DELAY2400_A:
0077 00 NOP
0078 00 NOP
0079 00 NOP
007A 00 NOP
007B 00 NOP
007C 00 NOP
007D 00 NOP
007E DFF7 DJNZ R7,DELAY2400_A
0080 22 RET
; 0 1 2 3 4 5 6 7 8 9
;
0081 0A0E06FFFF0F TAB: DB 0AH 0EH 06H 0FFH 0FFH 0FH 0FFH 0FFH 09H 0DH
FFFF090D
END
;;****** 红外遥控器键值表 ******
;; 16 14
;; 00 01 02 03
;; 04 05 06 07
;; 08 09 0A 0B
;; 0C 0D 19 1A
;; 12 15 10
;; 13 18 11
;; 1E 1C 1D 0F
;; 0E 1F 17 1B
;;==========================
;;*************************************** 小车的动作参数 ****************************************
;; P1.3 P1.2 P1.1 P1.0
;; IOB11 IOB10 IOB9 IOB8 后轮电机 前轮电机
;; 1 1 1 1 停 停 停止(0F)
;; 1 1 1 0 正转 停 前进(0E)
;; 1 1 0 1 反转 停 后退(0D)
;;**********************************************************************************************
;; 1 0 1 0 正 正 左前转(0A)
;; 0 1 1 0 正 反 右前转(06)
;;***********************************************************************************************
;; 1 0 0 1 反 正 左后转(09)
;; 0 1 0 1 反 反 右后转(05)
;;;=====================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -