📄 ir.lst
字号:
A51 MACRO ASSEMBLER IR 06/23/2007 11:00:00 PAGE 1
MACRO ASSEMBLER A51 V7.10
OBJECT MODULE PLACED IN IR.OBJ
ASSEMBLER INVOKED BY: C:\Keil\C51\BIN\A51.EXE IR.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;----------------------------------
2 ; 单片机红外遥控实例
3 ; 功能:通过红外遥控实现对LED的控制
4 ;-----------------------------------
5
0000 6 ORG 0000H
7
0000 8 MAIN:
0000 30A203 9 JNB P2.2,IR ; 遥控扫描
0003 020000 10 LJMP MAIN ; 在正常无遥控信号时一体化红外接收头输出是高电平,程序一直在循环。
11
12 ;------------------------------
13 ; 解码程序
14 ;-------------------------------
0006 15 IR:
16 ; 以下对遥控信号的9000微秒的初始低电平信号的识别
17
0006 7E0A 18 MOV R6,#10
0008 19 IR_SB:
0008 1163 20 ACALL DELAY882 ; 调用882微秒延时子程序
000A 20A22B 21 JB P2.2,IR_ERROR ; 延时882微秒后判断P2.2脚是否出现高电平,如果有就退出解码程序
000D DEF9 22 DJNZ R6,IR_SB ; 重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
23
24 ; 识别连发码,和跳过4.5ms高电平
000F 30A2FD 25 JNB P2.2,$ ; 等待高电平避开9毫秒低电平引导脉冲
0012 1171 26 ACALL DELAY2400
0014 30A21F 27 JNB P2.2,IR_Rp ; 这里为低电平,认为是连发码信号?
0017 1171 28 ACALL DELAY2400
29
30 ; 以下32位数据码读取
0019 792A 31 MOV R1,#2AH ; 设定2AH为初始RAM
001B 7A04 32 MOV R2,#4
001D 33 IR_4BYTE:
001D 7B08 34 MOV R3,#8
001F 35 IR_8BIT:
001F 30A2FD 36 JNB P2.2,$ ; 等待地址码第一位的高电平信号
0022 120063 37 LCALL DELAY882 ; 高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
0025 A2A2 38 MOV C,P2.2 ; 将P2.2引脚此时的电平状态0或1存入C中
0027 5003 39 JNC IR_8BIT_0 ; 如果为0就跳到IR_8BIT_0
0029 12006A 40 LCALL DELAY1000
002C 41 IR_8BIT_0:
002C E7 42 MOV A,@R1 ; 将R1中地址给A
002D 13 43 RRC A ; 将C中的值0或者1移入A中的最高位
002E F7 44 MOV @R1,A ; 将A中的数暂时存放到R1中
002F DBEE 45 DJNZ R3,IR_8BIT ; 接收地址码的高8位
0031 09 46 INC R1 ; 对R1中的值加1,换下一个ram
0032 DAE9 47 DJNZ R2,IR_4BYTE ; 接收完16位地址码和8位数据码和8位数据反码
48 ; 存放在2AH、2bh、2ch、2dh的ram中
49 ; 解码成功
0034 8005 50 JMP IR_GOTO
51
0036 52 IR_Rp:
53 ; 这里为重复码执行处
54 ; 按住遥控按键时,每过108ms就到这里来
0036 8003 55 JMP IR_GOTO
56
0038 57 IR_ERROR:
58 ; 出错退出
A51 MACRO ASSEMBLER IR 06/23/2007 11:00:00 PAGE 2
0038 020000 59 LJMP MAIN ; 退出解码子程序
60
61 ;---------------------------
62 ; 遥控执行部分
63 ;---------------------------
003B 64 IR_GOTO:
65 ; 这里还要判断1AH和1BH两个系统码或用户码,用于识别不同的遥控器
003B E52A 66 MOV A,2AH
003D B407F8 67 CJNE A,#07H,IR_ERROR ; 用户码1不对则退出
0040 E52B 68 MOV A,2BH
0042 B411F3 69 CJNE A,#11H,IR_ERROR ; 用户码2不对则退出
70
71 ; 判断两个数据码是否相反
0045 E52C 72 MOV A,2CH
0047 F4 73 CPL A
0048 B52DED 74 CJNE A,2DH,IR_ERROR ; 两个数据码不相反则退出
75
76 ; 遥控执行部分
004B 851D90 77 MOV P1,1DH ; 将按键的键值通过P1口的8个LED显示出来
78
004E 120071 79 LCALL DELAY2400
0051 120071 80 LCALL DELAY2400
0054 120071 81 LCALL DELAY2400
82
83 ; 清除遥控值使连按失败
0057 751A00 84 MOV 1AH,#00H
005A 751B00 85 MOV 1BH,#00H
005D 751C00 86 MOV 1CH,#00H
0060 020000 87 LJMP MAIN
88
89 ;------------------------
90 ; 延时子程序
91 ;------------------------
0063 92 DELAY882:
93 ;-------------
94 ; 1.085*((202*4)+5)=882
95 ;-------------
0063 7FCA 96 MOV R7,#202
0065 97 DELAY882_A:
0065 00 98 NOP
0066 00 99 NOP
0067 DFFC 100 DJNZ R7,DELAY882_A
0069 22 101 RET
102
006A 103 DELAY1000:
104 ;-------------
105 ; 1.085*((229*4)+5)=1000
106 ;-------------
006A 7FE5 107 MOV R7,#229
006C 108 DELAY1000_A:
006C 00 109 NOP
006D 00 110 NOP
006E DFF5 111 DJNZ R7,DELAY882_A
0070 22 112 RET
113
0071 114 DELAY2400:
115 ;-------------
116 ; 1.085*((245*9)+5)=2397.85
117 ;-------------
0071 7FF5 118 MOV R7,#245
0073 119 DELAY2400_A:
0073 00 120 NOP
0074 00 121 NOP
0075 00 122 NOP
0076 00 123 NOP
0077 00 124 NOP
A51 MACRO ASSEMBLER IR 06/23/2007 11:00:00 PAGE 3
0078 00 125 NOP
0079 00 126 NOP
007A DFE9 127 DJNZ R7,DELAY882_A
007C 22 128 RET
129 END
A51 MACRO ASSEMBLER IR 06/23/2007 11:00:00 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
DELAY1000. . . . . C ADDR 006AH A
DELAY1000_A. . . . C ADDR 006CH A
DELAY2400. . . . . C ADDR 0071H A
DELAY2400_A. . . . C ADDR 0073H A
DELAY882 . . . . . C ADDR 0063H A
DELAY882_A . . . . C ADDR 0065H A
IR . . . . . . . . C ADDR 0006H A
IR_4BYTE . . . . . C ADDR 001DH A
IR_8BIT. . . . . . C ADDR 001FH A
IR_8BIT_0. . . . . C ADDR 002CH A
IR_ERROR . . . . . C ADDR 0038H A
IR_GOTO. . . . . . C ADDR 003BH A
IR_RP. . . . . . . C ADDR 0036H A
IR_SB. . . . . . . C ADDR 0008H A
MAIN . . . . . . . C ADDR 0000H A
P1 . . . . . . . . D ADDR 0090H A
P2 . . . . . . . . D ADDR 00A0H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -