|
/*********************************************
简介:
本程序为模拟红外协议的发送程序 包含起始码和数据码
本程序现固定一次性发送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 ;
} |