/*********************************************
简介:
本程序为模拟红外协议的接收程序 包含起始码和数据码
本程序现固定一次性接收16BIT(2字节)的数据
起始码与数据码长度定义如下图(用户可自行更改):
![](http://up.2cto.com/2013/0913/20130913012446215.jpg)
**********************************************/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
#define P_IrRec PF4_IN //接收IO定义
//=====红外接收模式=====
#define MIR_RST (uint8)0 //空闲状态
#define MIR_P1 (uint8)1 //正接收起始码
#define MIR_P2 (uint8)2 //正接收数据
//====红外接收相关定义=============================
#define IrDatHigh (P_IrRec == 1) //接收数据高
#define IrDatLow (P_IrRec == 0) //接收数据低
#define Ir_EdgeDown ((RStatus_IR&0x03) == 0x02)//IR下降沿
#define Ir_EdgeUp ((RStatus_IR&0x03) == 0x01) //IR上升沿
//红外数据长度 N个字节
#define IrDatLong (uint8)2
//--------------起始
#define TST_LOW (uint8)50 //起始低脉宽
#define TST_LOW_L (TST_LOW - 5) //起始低判断范围
#define TST_LOW_H (TST_LOW + 5) //12
#define TST_HIGH (uint8)100 //起始高脉宽 1字节
#define TST_HIGH_L (TST_HIGH - 5) //起始高判断范围
#define TST_HIGH_H (TST_HIGH + 5) //
//---------------数据
#define TDAT_LOW (uint8)25 //数据低脉宽
#define TDAT_LOW_L (TDAT_LOW - 5) //数据
#define TDAT_LOW_H (TDAT_LOW + 5) //10
#define TDAT_HIGH (uint8)50 //数据高脉宽
#define TDAT_HIGH_L (TDAT_HIGH - 5) //数据
#define TDAT_HIGH_H (TDAT_HIGH + 5) //
//====标志位定义====
typedef
struct
Flag
{
uint8 Flg1: 1 ;
uint8 Flg2: 1 ;
uint8 Flg3: 1 ;
uint8 Flg4: 1 ;
uint8 Flg5: 1 ;
uint8 Flg6: 1 ;
uint8 Flg7: 1 ;
uint8 Flg8: 1 ;
}tFlg ;
//====结构体声明====
tFlg F1;
//=====F1=========
#define F_10MS F1.Flg1
#define F_IrRecOk F1.Flg2 //单线接收数据成功
#define F_IrStatus F1.Flg3 //单线接收数据状态0 1
uint8 RMIR = 0 ;
//单线接收模式
//--数据接收缓存区----------
uint8 IrDatRce[2] ;
uint8 R_RecDat[2] ;
//***************************************
// 函数名称:CmdRecData
// 函数功能:控制单线接收数据
// 入口参数:无
// 出口参数:无
//***************************************
void
CmdRecData(
void
)
{
if
(!F_IrRecOk)
return
;
F_IrRecOk = 0 ;
R_RecDat[0] = IrDatRce[0] ;
R_RecDat[1] = IrDatRce[1] ;
//处理接收到的数据
}
//====主程序==========
void
main(
void
)
{
while
(1)
{
while
(!F_10MS) ;
//10ms跑一次主程序
F_10MS = 0 ;
CmdRecData() ;
//接收数据处理
}
}
//中断服务程序 50u 中断一 次
void
interrupt ser(
void
)
{
static
uint8 TconIr = 0 ;
static
uint8 PIR = 0 ;
static
uint8 RStatus_IR = 0 ;
static
uint8 ByteNum=0,BitNum=0;
TIM6_SR1 = 0x00;
// 清除更新标志
TconIr ++ ;
//脉冲计数
if
(TconIr == 0)
//溢出
{
RMIR = MIR_RST ;
//退出接收状态
}
PIR <<= 1 ;
if
(IrDatHigh)
{
PIR |= 0x01 ;
}
RStatus_IR <<= 1 ;
if
((PIR & 0x03) == 0X03)
//111
{
RStatus_IR |= 0X01 ;
}
else
if
((PIR & 0x03) == 0X00)
{
RStatus_IR &= ~0X01 ;
}
else
{
if
(RStatus_IR & 0x02)RStatus_IR |= 0x01 ;
}
if
(F_IrRecOk)
return
;
//数据未取出 不再接收数据
//--//上升沿----//下降沿-------------
if
(Ir_EdgeDown || Ir_EdgeUp)
{
//-------1111--空闲--------------------
if
(RMIR == MIR_RST)
//
{
if
(Ir_EdgeUp)
{
RMIR = MIR_RST ;
//退出接收状态
}
else
{
TconIr = 0 ;
RMIR = MIR_P1 ;
//接收起始
F_IrStatus = 0 ;
// 接收起始低
}
}
//----22222--接收起始码-----------------
else
if
(RMIR == MIR_P1)
//
{
if
(!F_IrStatus)
//起始状态0 只收上升沿
{
if
(Ir_EdgeUp)
{
//接收起始码低电平脉宽
if
((TconIr >= TST_LOW_L) && (TconIr <= TST_LOW_H))
{
F_IrStatus = 1 ;
//起始低验证成功
TconIr = 0 ;
}
else
{
RMIR = MIR_RST ;
//退出接收状态
}
}
}
else
//if(F_IrStatus)//起始状态1 只收下升沿
{
if
(Ir_EdgeDown)
{
//接收起始码高电平脉宽
if
((TconIr >= TST_HIGH_L) && (TconIr <= TST_HIGH_H))
{
RMIR = MIR_P2 ;
//起始高验证成功
TconIr = 0 ;
ByteNum = 0;
BitNum = 0;
}
else
{
RMIR = MIR_RST ;
//退出接收状态
}
}
}
}
//----33333--接收数据码--------------
else
if
(RMIR == MIR_P2)
//
{
if
(Ir_EdgeUp)
//滤过低电平
{
TconIr = 0 ;
return
;
}
else
//if()
{
//接收到数据低
if
((TconIr >= TDAT_LOW_L)&&(TconIr <= TDAT_LOW_H))
{
IrDatRce[ByteNum] &= ~(1<<BitNum) ;
}
//接收到数据高
else
//if((TconIr >= TDAT_LOW_L) && (TconIr <= TDAT_LOW_H))
{
IrDatRce[ByteNum] |= (1<<BitNum) ;
}
BitNum ++ ;
if
(BitNum > 7)
{
BitNum = 0 ;
ByteNum ++ ;
if
(ByteNum >= IrDatLong)
{
ByteNum = 0 ;
RMIR = MIR_RST ;
//结束完成 退出
F_IrRecOk = 1 ;
//可以取数据
}
}
}
}
}
|