模拟红外协议发送源程序(一)

2014-11-23 21:46:37 · 作者: · 浏览: 15
/*********************************************
简介:
本程序为模拟红外协议的发送程序 包含起始码和数据码
本程序现固定一次性发送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 ; }