📄 ir.lst
字号:
C51 COMPILER V7.00 IR 08/21/2006 21:45:38 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE IR
OBJECT MODULE PLACED IN ir.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ir.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #ifndef _IR_C
2 #define _IR_C
3
4
5 /*****************************说明*****************************************
6 该红外线接收代码是针对红外线遥控器设计的,在使用中请根据具体的红外线感应
7 器的说明修改。
8
9 */
10
11
12 #include <stdio.h>
13 #include <REG768.H> /*Philips 87LPC768 寄存器定义头文件*/
14 #include "ir.h"
15
16
17 #define REDINT 0x06 /*红外线间隔*/
18
19 /*存放消息标志的可位寻址字节Message,Message=NULL 时无任消息*/
20 unsigned char bdata Message;
21
22 /*在接收过程中置位,检测标置位Get 可以有效防止其它进程干扰接收,防止数据丢失.*/
23 sbit RedMsg=Message^0; /*红外遥控消息*/
24 sbit RedRead=Message^1; /*位接收过程标志*/
25 sbit RedBit =Message^2; /*接收到的位值*/
26 sbit RSend =Message^3; /*红外接收中重新发送标志*/
27
28 /*存放遥控的字数据,低4 位存放接收到的bit 的位移,高12 位从低到高存放接收到的bit*/
29 unsigned char bdata RedDataL,RedDataH;
30
31 /*RedDataH 字节低6 位代表指令只有一个1 C1-C3 是用户码H 表示连续S1 S2 分别表示第一二组单发*/
32 sbit RedData0=RedDataL^4; /*C1*/
33 sbit RedData1=RedDataL^5; /*C2*/
34 sbit RedData2=RedDataL^6; /*C3*/
35 sbit RedData3=RedDataL^7; /*H*/
36 sbit RedData11=RedDataH^0; /*D6*/
37 sbit RedData10=RedDataH^1; /*D5*/
38 sbit RedData9=RedDataH^2; /*D4*/
39 sbit RedData8=RedDataH^3; /*D3*/
40 sbit RedData7=RedDataH^4; /*D2*/
41 sbit RedData6=RedDataH^5; /*D1*/
42 sbit RedData5=RedDataH^6; /*S2*/
43 sbit RedData4=RedDataH^7; /*S1*/
44 unsigned char bdata State; /*状态字节*/
45 sbit RedControl=State^6; /*遥控状态*/
46
47
48
49 /*定时器T00 的高位定时参数为Timer
50 定时256*Timer+(80--336)个周期共139Timer+(43--182)us<37ms
51 定时器T01的高位定时节参数为nTimer 定时256*nTimer+(24--280)个周期139nTimer+(13--152)us<9.1s,
52 RedCon 存放红外接收时的载波计数*/
53
54 unsigned char data RedCon;
55 unsigned int nTimer; /*定时整型参数*/
C51 COMPILER V7.00 IR 08/21/2006 21:45:38 PAGE 2
56 /*INT1 用于红外解码状态遥控解码数据处理,nTimer=1 定时152--291us*/
57 void Inte1() interrupt 2 using 2
58 {
59 1 for(nTimer=8;nTimer>1;nTimer--);/*使处理周期达到51 机器周期=27.7us 使得RedCon<32*/
60 1
61 1 if(RedRead)
62 1 {
63 2 RedCon++; /*0 信号宽度a=420us,1 信号宽度a=1260us,周期4a=1680us*/
64 2 }
65 1 else
66 1 { /*开始计数或者重新发送时开始计数*/
67 2 RedBit=0; /*复位接收位*/
68 2 RedCon=0; /*复位载波计数*/
69 2 RedRead=1; /*置位位接收标志*/
70 2 if(!ET1)
71 2 { /*首次接收时没有启动定时器T01 接收第一个位*/
72 3 TF1=0; /*复位定时器T01 益出标志*/
73 3 ET1=1; /*启动T01 定时*/
74 3 RedDataL=0; /*复位红外数据*/
75 3 RedDataH=0; /*复位红外数据*/
76 3 RSend=0;
77 3 } /*复位重新发送标志*/
78 2 }
79 1 }
80
81 void Count1(void) interrupt 3 using 3
82 {
83 1 /*定时器T01 中断,最大定时9.1s*/
84 1 if(nTimer!=0)
85 1 { /*检测定时器T01 的扩展高位*/
86 2 nTimer--;
87 2 return;
88 2 }
89 1
90 1 ET1=0; /*关闭T01 定时*/
91 1
92 1 if(RedRead)
93 1 { /*红外接收状态*/
94 2 if((RedDataL&0xF)==12)
95 2 { /*第一阶段接收已经结束*/
96 3 RSend=1; /*置位重新发送标志以便校验*/
97 3 RedDataL&=0xF0;
98 3 } /*复位位指针以便校验*/
99 2
100 2 if(RedCon>27-REDINT&&RedCon<27+REDINT) RedBit=1;
101 2 else RedBit=0; /*低电平计数9 表示0 27 表示1*/
102 2
103 2 if(RSend)
104 2 { /*检验重复发送的数据是否与第一次符合*/
105 3 switch(RedDataL&0xF)
106 3 {
107 4 case 0: /*检验重复发送的第1 位数据*/
108 4 if(RedBit!=RedData0) goto RClear;
109 4 break;
110 4 case 1: /*检验重复发送的第2 位数据*/
111 4 if(RedBit!=RedData1) goto RClear;
112 4 break;
113 4 case 2: /*检验重复发送的第3 位数据*/
114 4 if(RedBit!=RedData2) goto RClear;
115 4 break;
116 4 case 3: /*检验重复发送的第4 位数据*/
117 4 if(RedBit!=RedData3) goto RClear;
C51 COMPILER V7.00 IR 08/21/2006 21:45:38 PAGE 3
118 4 break;
119 4 case 4: /*检验重复发送的第5 位数据*/
120 4 if(RedBit!=RedData4) goto RClear;
121 4 break;
122 4 case 5: /*检验重复发送的第6 位数据*/
123 4 if(RedBit!=RedData5) goto RClear;
124 4 break;
125 4 case 6: /*检验重复发送的第7 位数据*/
126 4 if(RedBit!=RedData6) goto RClear;
127 4 break;
128 4 case 7: /*检验重复发送的第8 位数据*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -