📄 irda.lst
字号:
C51 COMPILER V7.20 IRDA 11/25/2005 22:56:48 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE IRDA
OBJECT MODULE PLACED IN Irda.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Irda.c BROWSE DEBUG OBJECTEXTEND SRC(.\Irda.SRC)
line level source
1 /********************************************************************
2 * *
3 * 程序名:红外线遥控解码程序(芯片 HT6221) *
4 * *
5 * 设 计 人:牛余朋 *
6 * *
7 * 日 期:2005年11月24日 *
8 * *
9 * 版本:1.0 *
10 *********************************************************************/
11 #include <REGX51.H>
12 unsigned char keynumber=0xff;//定义按键值变量
13 void Delay(void);
14 void Irda(void);
15 void beep(void);
16 dispaly(unsigned char keynum);
17 void delay1ms(unsigned int count);
18 /*分别存放红外线译码后的数据*/
19 unsigned char data e1 _at_ 0x1A; /*存放低8位地址码*/
20 unsigned char data w1 _at_ 0x1B; /*存放高8位地址码*/
21 unsigned char data e2 _at_ 0x1C; /*存放8位数据码*/
22 unsigned char data w2 _at_ 0x1D; /*存放8位数据反码*/
23 //sbit IrInput=P3^2; //红外线输入引脚,可自定义
24 unsigned char LEDdata[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};//0-9段码
25 /*代表遥控器上的1--28按键红外码值*/
26 unsigned char Irda_data[]={0x5f,0x50,0x5d,0x44,0x41,0x0a,0x42,0x46,0x47,0x49,
27 0x05,0x06,0x07,0x09,0x45,0x03,0x5c,0x1e,0x5e,0x02,
28 0x58,0x1a,0x5b,0x01,0x1b,0x59,0x5a,0x18};//1--28
29 /*********************主程序***************************/
30
31 void main(void)
32 {
33 1 unsigned char i;
34 1 IT0 = 1; //INT0下降沿有效
35 1 EX0 = 1; //开INT0中断;
36 1 P0=0xff;
37 1 P1=0xff;
38 1 P2=0xff;
39 1 P3=0xff;
40 1 EA = 1; //允许CPU中断
41 1 while(1)
42 1 {
43 2 if(keynumber!=0xff)
44 2 {
45 3 for(i=0;i<10;i++)
46 3 dispaly(keynumber);
47 3 keynumber=0XFF;
48 3 }
49 2
50 2 }
51 1
52 1 }
53
54 /*******************红外线解码子程序*******************/
55 void Irda(void)
C51 COMPILER V7.20 IRDA 11/25/2005 22:56:48 PAGE 2
56 {
57 1 #pragma asm
58 1 SB:
59 1 MOV R4,#8 ;8毫秒为高电平错误
60 1 SBA:
61 1 MOV R5,#250
62 1 SBB:
63 1 JB P3.2,SXB1
64 1 DJNZ R5,SBB
65 1 DJNZ R4,SBA
66 1 MOV R4,#2
67 1 JMP SBC
68 1 SXB1:
69 1 MOV R5,#5
70 1 SXB2: ;去掉20US的尖峰干扰信号
71 1 JNB P3.2,SBB
72 1 DJNZ R5,SXB2
73 1 RET
74 1 SBC:
75 1 MOV R5,#250
76 1 SB1:
77 1 JB P3.2,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)
78 1 DJNZ R5,SB1
79 1 DJNZ R4,SBC
80 1 RET
81 1 SB2: ;去掉20US的尖峰干扰信号
82 1 MOV R5,#5
83 1 SB2_A:
84 1 JNB P3.2,SB1
85 1 DJNZ R5,SB2_A
86 1 MOV R4,#3
87 1 SB2_1:
88 1 MOV R5,#250
89 1 SB3: ;监测4.5MS高电平,如3MS内出现低电平错误
90 1 JNB P3.2,SXC
91 1 DJNZ R5,SB3
92 1 DJNZ R4,SB2_1
93 1 MOV R4,#2
94 1 JMP SB3_1
95 1 SXC: ;去掉20US的尖峰干扰信号
96 1 MOV R5,#5
97 1 SXC1:
98 1 JB P3.2,SB3
99 1 DJNZ R5,SXC1
100 1 RET
101 1 SB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误
102 1 MOV R5,#250
103 1 SB3_2:
104 1 JNB P3.2,SB4
105 1 DJNZ R5,SB3_2
106 1 DJNZ R4,SB3_1
107 1 RET
108 1 SB4: ;去掉20US的尖峰干扰信号
109 1 MOV R5,#5
110 1 SB4_1:
111 1 JB P3.2,SB3_2
112 1 DJNZ R5,SB4_1
113 1 MOV R1,#1AH ;设定1AH为起始RAM区
114 1 MOV R2,#4
115 1 PP: MOV R3,#8
116 1 JJJJ:
117 1 MOV R5,#250
C51 COMPILER V7.20 IRDA 11/25/2005 22:56:48 PAGE 3
118 1 JJJJ2: ;1MS内不为低电平错误
119 1 JB P3.2,JJJJ3
120 1 DJNZ R5,JJJJ2
121 1 RET
122 1 JJJJ3:
123 1 LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
124 1 MOV C,P3.2 ;将P3.7引脚此时的电平状态0或1存入C中
125 1 JNC UUU ;如果为0就跳转到UUU
126 1 MOV R5,#250
127 1 JJJJ4:
128 1 JNB P3.2,UUU
129 1 NOP
130 1 DJNZ R5,JJJJ4
131 1 RET
132 1 UUU: MOV A,@R1 ;将R1中地址的给A
133 1 RRC A ;将C中的值0或1移入A中的最低位
134 1 MOV @R1,A ;将A中的数暂时存放在R1中
135 1 DJNZ R3,JJJJ ;接收地址码的高8位
136 1 INC R1 ;对R1中的值加1,换成下一个RAM
137 1 DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
138 1
139 1 YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
140 1 D1: MOV R5,#20
141 1 DJNZ R5,$
142 1 DJNZ R4,D1
143 1 RET
144 1 YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
145 1 D2: MOV R5,#235
146 1 DJNZ R5,$
147 1 DJNZ R4,D2
148 1 RET
149 1 YS3: MOV R4,#2 ;延时程序3,精确延时1000微秒
150 1 D3:MOV R5,#248
151 1 DJNZ R5,$
152 1 DJNZ R4,D3
153 1 RET
154 1 #pragma endasm
155 1 }
156
157 /*****************外部中断0服务程序*********************/
158 void int0_int(void) interrupt 0
159 {
160 1 unsigned char i;
161 1 EX0 = 0;
162 1 Irda();
163 1
164 1 if((e1==~w1)&&(e2==~w2)) //判断系统码与系统反码、用户码与用户反码是否相同
165 1 {
166 2 P1=e2;
167 2 for(i=0;i<28;i++)
168 2 {
169 3 if(e2==Irda_data[i])
170 3 {
171 4 keynumber=i;
172 4 beep( );
173 4 }
174 3 }
175 2 }
176 1 e1=e2=w1=w2=0; //防止下一次误判断
177 1 EX0 = 1;
178 1 }
179
C51 COMPILER V7.20 IRDA 11/25/2005 22:56:48 PAGE 4
180 void beep(void)
181 {
182 1 P3_3=0;
183 1 delay1ms(1);
184 1 P3_3=1;
185 1 }
186 /*************************延时1毫秒子程序*****************************/
187 void delay1ms(unsigned int count)//晶振12M,延时ms
188 {
189 1 unsigned int i,j;
190 1 for(i=0;i<count;i++)
191 1 for(j=0;j<120;j++)
192 1 ;
193 1 }
194
195 dispaly(unsigned char keynum)
196 {
197 1 //unsigned char i;
198 1 // for(i=0;i<5;i++)
199 1 // {
200 1 P0=LEDdata[(keynum+1)%10];
201 1 P2=0xfb;
202 1 delay1ms(5);
203 1 P0=LEDdata[(keynum+1)/10];
204 1 P2=0xfd;
205 1 delay1ms(5);
206 1 P2=0xff;
207 1 // }
208 1
209 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 546 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 39 2
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -