📄 infrared_receive.lst
字号:
C51 COMPILER V8.02 INFRARED_RECEIVE 10/19/2007 21:27:23 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE INFRARED_RECEIVE
OBJECT MODULE PLACED IN infrared_receive.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE infrared_receive.c LARGE BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************INFRARED DRIVER********************************/
2 /* */
3 /* SYSTEM CLOCK 11.0592M */
4 /* */
5 /******************************************************************************/
6
7 #define INFRARED_EXTERN
8 #include<c8051f020.h>
9 #include"infrared_receive.h"
10
11
12 sbit P37=P3^7;
13 unsigned char val[8]=0;
14 bit Head_ok=0,Got=0; //Head_ok: 头帧正确,有新的按键 Got:接收完毕
15
16 void Timer3_Init()
17 {
18 1 TMR3CN &=0xfb; //关定时器3
19 1 TMR3RL = T_3MS; //延时3ms
20 1 TMR3 = T_3MS;
21 1 }
22
23 void Infrared_Init()
24 {
25 1 IE=0x80; //开总中断
26 1 EIE2|=0x21;//开中断7和定时器3中断
27 1 Timer3_Init();
28 1 }
29
30
31 unsigned char Wait_Infrared()
32 {
33 1 unsigned char keyvalue;
34 1
35 1 while(!Got); //等待接收完毕
36 1 if(val[2]+val[3]==0xff) //较验,最后两个字节相互为反码
37 1 keyvalue=val[2]; //第三个字节为有效信息
38 1 Got=0;
39 1
40 1 return(keyvalue);
41 1 }
42
43
44
45 void ex_interrupt() interrupt 19 //下降沿中断,收到低电平开始
46 {
47 1
48 1 if(!Head_ok) //头帧是否检测完毕
49 1 {
50 2 EIE2&=0xdf;//关中断7
51 2 P3IF&=0x7f;//清中断7的中断标志
52 2 Timer3_Init();//定时器3初始化
53 2 TMR3CN|=0x04; //开定时器3
54 2 }
55 1 else
C51 COMPILER V8.02 INFRARED_RECEIVE 10/19/2007 21:27:23 PAGE 2
56 1 {
57 2 while(P37==0)
58 2 {if(TMR3CN>0x80) return;} //等待变高 定时器3溢出则跳出 多级中断的实现
59 2
60 2 P3IF&=0x7f;//清中断7的中断标志
61 2 TMR3 = T_0_8MS;//延时0.8ms
62 2 TMR3CN|=0x04; //开定时器3
63 2
64 2 }
65 1 }
66
67 void T3_inter() interrupt 14
68 {
69 1 static unsigned char i=0,n=0;
70 1 static bit h=0;
71 1 unsigned int v;
72 1 TMR3CN&=0x7f; //清中断标志
73 1
74 1 if(Head_ok==0&&h==0&&P37==0) h=1; //开始后第一个3ms处应为低
75 1 else if(Head_ok==0&&h==1&&P37==1) // 开始后第二个3ms处应为高
76 1 {
77 2 EIE2|=0x20; //开中断7
78 2 TMR3CN&=0xfb; //关定时器3
79 2 h=0;Head_ok=1;return;
80 2 }
81 1 else if(Head_ok)
82 1 {
83 2 TMR3CN&=0xfb; //关定时器3
84 2 n=i++/8;
85 2 if(P37) //每0.8ms读一次数据
86 2 {
87 3 val[n]=val[n]>>1;
88 3 val[n]|=0x80;
89 3 }
90 2 else
91 2 val[n]=val[n]>>1;
92 2 // n=++i/8;
93 2 if(i==32)
94 2 {
95 3 i=0;n=0;Head_ok=0;
96 3 EIE2&=0xdf;//关中断7
97 3 for(v=0;v<60000;v++); //避开重复码
98 3 EIE2|=0x20; //开中断7
99 3 Got=1;
100 3 }
101 2 }
102 1 else //还原为最原始状态
103 1 {
104 2 EIE2|=0x20;//开中断7
105 2 Timer3_Init();
106 2 h=0;Got=0;Head_ok=0;
107 2 }
108 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 350 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 10 2
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
C51 COMPILER V8.02 INFRARED_RECEIVE 10/19/2007 21:27:23 PAGE 3
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -