模拟红外协议接收程序

/*********************************************
简介:
本程序为模拟红外协议的接收程序 包含起始码和数据码
本程序现固定一次性接收16BIT(2字节)的数据
起始码与数据码长度定义如下图(用户可自行更改):
 
**********************************************/
?
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 ; //可以取数据
                                     }
                             }
                     }
             }  
 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值