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