📄 irrecv.lst
字号:
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE IRRECV
OBJECT MODULE PLACED IN IRRecv.OBJ
COMPILER INVOKED BY: c:\Keil\C51\BIN\C51.EXE IRRecv.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*********************************************************************/
3 /* 模 块 名:单片机(C51) 文件名:IRRecv.c */
4 /* 提交日期:2005年11月01日 作 者:金雨和 */
5 /* 版 本:V1.0 --Copyright(c) 2005-2006中太视讯技术有限公司 */
6 /* 描 述:单片机(C51)红外接收程序 */
7 /* 修改记录: */
8 /* 日 期 版本 修改人 修改内容 */
9 /* 1. */
10 /*********************************************************************/
11
12 #include <Reg935.h>
13 #include <stdio.h>
14 #include "uart.h"
15
16 /* IO脚定义 */
17 #define IR_SIGNAL KB0 //红外输入
18 #define IR_LED TxD //红外指示灯信号
19 #define RDIR OCB //reserved
20 #define IIC_INT KB1 //IIC中断脚
21
22 #define QUIETLED KB3 //静音指示灯
23 #define MUTELED KB6 //哑音指示灯
24
25 /* 脉冲检测范围定义,此脉冲通过定时器0检测,故脉冲宽度与定时器定时器值设置有关 */
26 /* 当定时器0为方式2时,定时值为TH0=00x10,TL0=0x10时,采用如下组值 */
27 #if 0
#define MIN_BIT0_PLS 9 //bit 0 脉冲宽度最小值
#define MAX_BIT0_PLS 16 //bit 0 脉冲宽度最大值
#define MIN_BIT1_PLS 37 //bit 1 脉冲宽度最小值
#define MAX_BIT1_PLS 45 //bit 1 脉冲宽度最大值
#define MIN_CODE_PLS 100 //前导码脉冲宽度最小值
#define MAX_CODE_PLS 125 //前导码脉冲宽度最大值
#define MIN_CONT_PLS 52 //连续按键脉冲宽度最小值
#define MAX_CONT_PLS 60 //连续按键脉冲宽度最大值
#define INVALID_PLS 200 //大于此值认为是无效脉冲值
#endif
38
39 /* 当定时器0为方式1时,定时值为TH0=00x10,TL0=0x10时,采用如下组值 */
40 #define MIN_BIT0_PLS 3 //bit 0 脉冲宽度最小值
41 #define MAX_BIT0_PLS 7 //bit 0 脉冲宽度最大值
42 #define MIN_BIT1_PLS 14 //bit 1 脉冲宽度最小值
43 #define MAX_BIT1_PLS 19 //bit 1 脉冲宽度最大值
44 #define MIN_CODE_PLS 40 //前导码脉冲宽度最小值
45 #define MAX_CODE_PLS 50 //前导码脉冲宽度最大值
46 #define MIN_CONT_PLS 21 //连续按键脉冲宽度最小值
47 #define MAX_CONT_PLS 24 //连续按键脉冲宽度最大值
48 #define INVALID_PLS 90 //大于此值认为是无效脉冲值
49
50 /* 标志位定义 */
51 bit g_rsFlag; //收到一键码
52 bit g_RSDA1; //引导码第一个下降沿指示,表示可能一按键到来
53 bit g_RSDA2; //可能一有效高脉冲
54 bit g_RSDA3; //误码,非有效按键
55 bit g_IR_SF; //连续按键指示
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 2
56
57 /* 键值及用户码保存字 */
58 unsigned char data g_rsData; //键码,返回给主程序
59 unsigned char data g_insr0; //定时器一计数器,一次中断为0.1ms,主要记录脉冲宽度
60 unsigned char data g_insr1; //Insr1=(valid)insr0 transfer to int1
61 unsigned char data g_pulseNum; //脉冲数,一个键码总共有33个脉冲信号
62 unsigned char data g_keyUser; //user code
63 unsigned char data g_keyValue; //key value
64 unsigned char data g_keyValueF; //用户码反码
65 unsigned char data g_keyUserF; //键值反码
66
67 unsigned char data g_keyPressed; //连续按键不放,spying the continue pressing a key
68
69 extern unsigned char xdata g_ucI2CSendBuf[MAX_I2CDATALEN]; //IIC数据缓存
70 extern unsigned char xdata g_ucI2CSendBuf_Len; //IIC数据缓存内容长度
71 extern unsigned char xdata g_ucI2CSendBuf_offset; //IIC缓存数据读取当前位移
72
73 /*******************************************************************
74 ** 函 数 名: IRRecvInit()
75 ** 输 入: 无
76 ** 输 出: 无
77 ** 描 述: 红外接收初始化。
78 ** 全局变量:
79 ** g_pulseNum -- 脉冲数
80 ** g_keyPressed -- 连续按键标志
81 ** g_rsFlag -- 标志,表示已正确接收到红外键码
82 ** 调用模块: 无
83 ** 被调模块: 无
84 ** 作 者:
85 ** 创建日期: 2005年11月01日
86 ** 修 改:
87 ** 日 期 版本 修改人 修改内容
88 ** 1.
89 ********************************************************************/
90 void IRRecvInit()
91 {
92 1 /* ------------------ 初始化 ------------------------- */
93 1 g_rsFlag = 0; //No active
94 1 g_IR_SF = 0; //连续按键指示
95 1
96 1 g_RSDA1 = 0; //引导码第一个下降沿指示,表示可能一按键到来
97 1 g_RSDA2 = 0; //可能一有效高脉冲
98 1 g_RSDA3 = 0; //误码,非有效按键
99 1 g_pulseNum = 0x00; //比特流bit计数器
100 1 g_insr0 = 0x00; //记录一次脉冲脉宽,单位为0.1ms
101 1 g_insr1 = 0x00; //记录一次脉冲脉宽,单位为0.1ms
102 1 g_keyPressed = 0x00;//spying the continue pressing a key
103 1
104 1 //红外接收 仅为输入
105 1 P0M1 = P0M1 | 0x01; //Input status,set P1.1 input mode
106 1 P0M2 = P0M2 & 0xFE;
107 1
108 1 IR_SIGNAL = 1;
109 1 //IR_LED = 0; //Init completed,turn off the ir indicator led
110 1
111 1 }
112
113
114 /*******************************************************************
115 ** 函 数 名: timer0_Init()
116 ** 输 入: 无
117 ** 输 出: 无
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 3
118 ** 描 述: 初始化定时器0。
119 ** 全局变量: 无
120 ** 调用模块: 无
121 ** 被调模块: 无
122 ** 作 者:
123 ** 创建日期: 2005年11月02日
124 ** 修 改:
125 ** 日 期 版本 修改人 修改内容
126 ** 1.
127 ********************************************************************/
128 void timer0_Init()
129 {
130 1 /* 使能定时器0中断 1 */
131 1 TMOD = TMOD | 0x01;
132 1 TR0 = 1;
133 1 ET0 = 1;
134 1 // TL0 = 0xB0; //100H-CEH=32H=50X2uS=100uS
135 1 // TH0 = 0xFE; //定时器0 happen per 0.1MS
136 1
137 1 TL1 = 0xD8; //100uS
138 1 TH1 = 0xFD; //定时器0 happen per 0.1MS
139 1 }
140
141
142 /*******************************************************************
143 ** 函 数 名: timer0_Isr()
144 ** 输 入: 无
145 ** 输 出: 无
146 ** 描 述: 定时器0中断函数,每0.1ms检测是否有脉冲。
147 ** 全局变量:
148 ** g_pulseNum -- 脉冲数
149 ** g_keyPressed -- 连续按键标志
150 ** 调用模块:
151 ** checkPulse -- 检测脉冲
152 ** 被调模块:
153 ** 作 者: 金雨和
154 ** 创建日期: 2005年11月02日
155 ** 修 改:
156 ** 日 期 版本 修改人 修改内容
157 ** 1.
158 ********************************************************************/
159 void timer0_Isr() interrupt 1
160 {
161 1 /* =====timer0: high pulse detect ========= */
162 1 if(g_RSDA1) //RSDA1 为1,IR_SIGNAL有下降沿来过,可能是一按键已开始,转到处理bit流
163 1 {
164 2 if(IR_SIGNAL) //IR_SIGNAL是否高,则INSR0+=1,若为低则判断脉冲宽度是否为有效
165 2 {
166 3 g_insr0++; //step one,inc about 0.1 ms
167 3 }
168 2 else //IR_SIGNAL =0,为低,在此检测遥控信号的第一个下降沿
169 2 {
170 3 if(g_RSDA3) //查询此次是否为有效按键
171 3 {
172 4 g_insr0 = 0;
173 4 g_pulseNum = 0;
174 4 }
175 3 else
176 3 {
177 4 //有效脉宽值,MIN_BIT0_PLS为bit 0的脉宽值是最小的,所以至少要比bit 0脉宽最小值大才能算有效脉宽
178 4 if(g_insr0 > MIN_BIT0_PLS) //if INSR0<3,pulse width<0.3ms, exit,not a valid pulse
179 4 {
C51 COMPILER V7.09 IRRECV 12/05/2005 10:23:18 PAGE 4
180 5 if((g_insr0 > MIN_CODE_PLS)&&(g_insr0 < MAX_CODE_PLS)) //检测到前导码
181 5 {
182 6 g_pulseNum = 0;
183 6 g_keyPressed = 0x00;
184 6 }
185 5
186 5 //MAX_BIT1_PLS为bit 1的脉宽值是最大的,以下比较可以得到bit 0或者bit 1的脉宽
187 5 if(g_insr0 <= MAX_BIT1_PLS) //bit 0或者bit 1脉冲,<2ms continue
188 5 {
189 6 g_IR_SF = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -