/********************************************* 簡介: 本程序為模擬紅外協議的發送程序 包含起始碼和數據碼 本程序現固定一次性發送16BIT的數據 起始碼與數據碼長度定義如下圖(用戶可自行更改):
//文件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() ; //控制發送
}