📄 +
字号:
C51 COMPILER V7.50 IR 09/09/2010 18:00:01 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE IR
OBJECT MODULE PLACED IN IR.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IR.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************************
2 * 描述: *
3 * lcd1602显示 遥控键值读取器 *
4 * lcd1602显示 遥控器接p3.2 *
5 * 喇叭接p1.5 继电器接p1.4 *
6 * 17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。 *
7 * 连接方法:使用红外功能时 J1跳线短接
- *
8 *******************************************************************************/
9 #include <reg51.h>
10
11 sbit IRIN = P3^2; //红外接收器数据线
12 sbit RELAY= P1^4; //继电器驱动线
13 sbit BEEP = P1^5; //蜂鸣器驱动线
14
15 void IRdelay(char x); //x*0.14MS
16 void beep();
17
18 unsigned char IRCOM[7];
19 extern unsigned char Y0;
20 /*******************************************************************/
21 void IRInit()
22 {
23 1 IE |= 0x81; //允许总中断中断,使能 INT0 外部中断
24 1 TCON |= 0x01; //触发方式为脉冲负边沿触发
25 1
26 1 IRIN=1; //I/O口初始化
27 1 RELAY=1;
28 1 }
29
30 /**********************************************************/
31 void IR_IN(void) interrupt 0
32 {
33 1 unsigned char j,k,N=0;
34 1 EX0 = 0;
35 1 IRdelay(15);
36 1 if (IRIN==1)
37 1 { EX0 =1;
38 2 return;
39 2 }
40 1 //确认IR信号出现
41 1 while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
42 1 {IRdelay(1);}
43 1
44 1 for (j=0;j<4;j++) //收集四组数据
45 1 {
46 2 for (k=0;k<8;k++) //每组数据有8位
47 2 {
48 3 while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
49 3 {IRdelay(1);}
50 3 while (!IRIN) //等 IR 变为高电平
51 3 {IRdelay(1);}
52 3 while (IRIN) //计算IR高电平时长
53 3 {
54 4 IRdelay(1);
C51 COMPILER V7.50 IR 09/09/2010 18:00:01 PAGE 2
55 4 N++;
56 4 if (N>=30)
57 4 { EX0=1;
58 5 return;} //0.14ms计数过长自动离开。
59 4 } //高电平计数完毕
60 3 IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
61 3 if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补“1”
62 3 N=0;
63 3 }//end for k
64 2 }//end for j
65 1
66 1 if (IRCOM[2]!=~IRCOM[3])
67 1 { EX0=1;
68 2 return; }
69 1
70 1 IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
71 1 IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
72 1
73 1 if(IRCOM[5]>9)
74 1 { IRCOM[5]=IRCOM[5]+0x37;}
75 1 else
76 1 IRCOM[5]=IRCOM[5]+0x30;
77 1
78 1 if(IRCOM[6]>9)
79 1 { IRCOM[6]=IRCOM[6]+0x37;}
80 1 else
81 1 IRCOM[6]=IRCOM[6]+0x30;
82 1
83 1 if(IRCOM[2]==0x4c) RELAY=0; //打开继电器
84 1 else RELAY=1; //关闭继电器
85 1
86 1 beep();
87 1
88 1 /*
89 1 ;================================
90 1 ;****** 红外遥控器键值表 ******
91 1
92 1 ; 4c 0e 4d 0d
93 1 ; 0f 4f 4e 0c
94 1 ; 0b 4b 4a 08
95 1 ; 48 12 16 4C
96 1 ; 40 48 04 00
97 1 ; 02 05 54 4D
98 1 ; 0A 1E 0E 1A
99 1 ; 1C 14 0F 0C
100 1 ;================================ */
101 1
102 1 Y0=0;
103 1 switch(IRCOM[2])
104 1 {
105 2 case 0x0C: Y0=1; break;
106 2 case 0x18: Y0=2; break;
107 2 case 0x5E: Y0=3; break;
108 2 case 0x08: Y0=4; break;
109 2 case 0x1C: Y0=5; break;
110 2 case 0x5A: Y0=6; break;
111 2 case 0x42: Y0=7; break;
112 2 case 0x52: Y0=8; break;
113 2 case 0x4A: Y0=9; break;
114 2 case 0x16: Y0=0; break;
115 2
116 2 }
C51 COMPILER V7.50 IR 09/09/2010 18:00:01 PAGE 3
117 1
118 1 EX0 = 1;
119 1 }
120
121
122 /**********************************************************/
123 void IRdelay(unsigned char x) //x*0.14MS
124 {
125 1 unsigned char i;
126 1 while(x--)
127 1 {
128 2 for (i = 0; i<13; i++) {}
129 2 }
130 1 }
131
132
133
134
135 void beep()
136 {
137 1 unsigned char i;
138 1 for (i=0;i<100;i++)
139 1 {
140 2 IRdelay(4);
141 2 BEEP=!BEEP; //BEEP取反
142 2 }
143 1 BEEP=1; //关闭蜂鸣器
144 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 393 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 3
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 + -