/********************************************* 簡介: 本程序為模擬紅外協議的發送程序 包含起始碼和數據碼 本程序現固定一次性發送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() ; //控制發送 }