模拟红外协议发送源程序

/*********************************************
简介:
本程序为模拟红外协议的发送程序 包含起始码和数据码
本程序现固定一次性发送16BIT的数据
起始码与数据码长度定义如下图(用户可自行更改):
?
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
215
216
217
218
219
220
221
222
223
//文件singlelinetsmt.h
#ifndef _SINGLELINETSMT_H_
#define _SINGLELINETSMT_H_
//#include "singlelinetsmt.h"
 
 
#define     P_Transmit      PF4_OUT  //单线发送IO口定义
 
#define     PortIr_Low      P_Transmit = 0  
#define     PortIr_High     P_Transmit = 1
 
 
//=====红外接收模式=====
#define     MIR_RST         (uint8)0  //空闲状态
#define     MIR_P1          (uint8)1 //正接收起始码
#define     MIR_P2          (uint8)2 //正接收数据
 
 
//一次性发送的数据字节长度
#define     IrDatLong     (uint8)2 
//起始码脉宽定义
#define     TST_LOW             (uint8)50 //起始低脉宽
#define     TST_HIGH            (uint8)100 //起始高脉宽 1字节
 
//数据码脉宽定义
#define     TDAT_LOW            (uint8)25  //数据低脉宽
#define     TDAT_HIGH           (uint8)50  //数据高脉宽
 
 
//====工作数据定义结构体====
typedef struct IrTsmtData
{
     
         uint8 RMIR ; //发送模式
         uint8 Ircont ; //发送脉宽计时
         uint8 BitNum ; //发送多少位数 16BIT
         uint16 IrDatTsmt ;  //发送的数据
         
         uint8 IrTmp1 ; //临时变量
         
}tIrTsmtData ;
extern tIrTsmtData  IrTsmtDat ;
 
#define     RMIR                IrTsmtDat.RMIR
#define     Ircont          IrTsmtDat.Ircont
#define     BitNum          IrTsmtDat.BitNum
#define     IrDatTsmt       IrTsmtDat.IrDatTsmt
#define     IrTmp1          IrTsmtDat.IrTmp1
 
//=============================
//====标志位定义结构体====
typedef struct IrFlag
{
         uint8 Flg1: 1 ;
         uint8 Flg2: 1 ;
         uint8 Flg3: 1 ;
         uint8 Flg4: 1 ;
         uint8 Flg5: 1 ;
         uint8 Flg6: 1 ;
         uint8 Flg7: 1 ;
         uint8 Flg8: 1 ;
         
}tIrFlg ;
extern tIrFlg   tIrF1 ;
 
#define     F_IrTsmt                    tIrF1.Flg1 //发送期间
#define     F_IrStatus              tIrF1.Flg2 //发送高 低状态
 
//=================================
extern void CmdTansmitData(uint16 Data,uint8 Time)  ;
extern void CmdIrTsmtDat( void ) ;
 
#endif
 
 
 
 
/*
文件singlelinetsmt.c
1 发送中断为50U中断一次
*/
#include "global.h"
#include "singlelinetsmt.h"
 
 
tIrTsmtData IrTsmtDat ;
tIrFlg  tIrF1 ;
 
//***************************************
// 函数名称:CmdTansmitData
// 函数功能:以固定周期发送数据
// 入口参数:要发送的数据 发送周期 10MS跑一次
// 出口参数:无
//***************************************
void CmdTansmitData(uint16 Data,uint8 Time)
{
         static uint8 Tcon = 0 ;
         
         Tcon ++ ;
         if (Tcon >= Time) //1s 发送一次
         {
                 Tcon = 0 ;
                 
                 RMIR = MIR_P1 ; //发送状态复位
                 F_IrStatus = 0 ; //先发送起始低
                 Ircont = 0 ;
                 F_IrTsmt = 1 ; //允许发送
         
                 IrDatTsmt = Data ;
         }
 
}
//***************************************
// 函数名称:CmdIrTsmtDat
// 函数功能:中断发送单线数据 50U中断一次
// 入口参数:无
// 出口参数:无
//***************************************
void CmdIrTsmtDat( void )
{
 
         if (!F_IrTsmt) return ;
 
         Ircont ++ ; //发送脉宽计时器
         
         //----22222--发送起始码-----------------
         if (RMIR == MIR_P1) //
         {
                 if (!F_IrStatus) //发送起始低
                 {
                         PortIr_Low ;
                         if (Ircont >= TST_LOW)
                         {
                                 Ircont = 0 ;
                                 F_IrStatus = 1 ;
                         }
                 }
                 else //发送起始高
                 {
                         PortIr_High ;
                         if (Ircont >= TST_HIGH)
                         {
                                 Ircont = 0 ;
                                 RMIR = MIR_P2 ;
                                 F_IrStatus = 0 ; //发送低
                                 BitNum = 0 ;
                         }  
                 }
         }
         //----33333--发送数据码--------------
         else if (RMIR == MIR_P2) //
         {
                 if (!F_IrStatus) //发送低
                 {
                         PortIr_Low ;
                         if (Ircont >= TDAT_LOW)
                         {
                                 Ircont = 0 ;
                                 F_IrStatus = 1 ;
                         }
                 }
                 else //发送高
                 {
                         PortIr_High ;
                         
                         if (IrDatTsmt & 0x01) //发送1
                         {
                                 IrTmp1 = TDAT_HIGH ;
                         }
                         else
                         {
                                 IrTmp1 = TDAT_LOW ; //发送0
                         }
                         if (Ircont >= IrTmp1)
                         {
                                 Ircont = 0 ;
                                 IrDatTsmt >>= 1 ;
                                 F_IrStatus = 0 ;
                                 BitNum ++ ;
                                 if (BitNum >= (IrDatLong *8 +1)) //一次发送16个BIT
                                 {
                                         BitNum = 0 ;
                                         F_IrTsmt = 0 ; //发送结束
                                 }
                         }                  
                 }
         }      
}
 
 
 
 
//文件main.c
void main( void )
{
     uint16 R_DspIrDat ;
 
     while (1)
     {      
         if (T_10MS >= 200) //200*50u=10ms 跑一次主程序
         {
             T_10MS = 0 ;
 
             R_DspIrDat = 1234 ;
             CmdTansmitData(R_DspIrDat,100) ; //发送1234 间隔100*10MS=1S 发送1次                
 
         }
     }  
}
 
//中断服务程序
void interrupt  server( void ) //中断进入时间50U
{      
         uint8 Tmp ;
         uint8 *pTmp ;
         
         TIM6_SR1 = 0x00;  // 清除更新标志 50u 中断一 次
         
         T_10MS ++ ;
     
         CmdIrTsmtDat() ; //控制发送
         
}

你可能感兴趣的:(笔记)