<pre name="code" class="cpp">//文件usend.h
#ifndef _USEND_H_
#define _USEND_H_
//====红外接收相关定义=============================
#define PuTx_High (P_uTx = 1) //数据高
#define PuTx_Low (P_uTx = 0) //数据低
#define V_SendDatNum 6//6 //发送数据字节数
//=======变量定义 ================
typedef struct uSendData
{
uint8 uTxDat1 ; //发送数据缓存区1
uint8 uTxDat2 ; //发送数据缓存区2
uint8 uTxDat3 ; //发送数据缓存区3
uint8 uTxDat4 ; //发送数据缓存区4
uint8 uTxDat5 ; //发送数据缓存区5
uint8 uTxDat6 ; //发送数据缓存区6
// uint8 TconTx ; //时间计时
uint8 uTxDatBit ; //发送数据位计时
uint8 uTxDatByte ; //发送数据位计时
}tuSendData ;
extern tuSendData tuSendDat ;
//----------------------
#define uTxDat1 tuSendDat.uTxDat1
#define uTxDat2 tuSendDat.uTxDat2
#define uTxDat3 tuSendDat.uTxDat3
#define uTxDat4 tuSendDat.uTxDat4
#define uTxDat5 tuSendDat.uTxDat5
#define uTxDat6 tuSendDat.uTxDat6
//#define TconTx tIrSendDat.TconTx
#define uTxDatBit tuSendDat.uTxDatBit
#define uTxDatByte tuSendDat.uTxDatByte
//====标志位定义结构体====
typedef union uFGUTX{
uint8 FguTx ;
struct FGTX{
uint8 Flg1 : 1;
uint8 Flg2 : 1;
uint8 Flg3 : 1;
uint8 Flg4 : 1;
uint8 Flg5 : 1;
uint8 Flg6 : 1;
uint8 Flg7 : 1;
uint8 Flg8 : 1;
}tFgUTx;
}uFgUTx;
//uFgUTx uFguTx1 ;
//-------uFgTx1-------------------
#define uFTx1 uFguTx1.tFgUTx
#define F_uTxEnb uFguTx1.tFgUTx.Flg1
//=================================================
extern uint16 R_uTxBuf[2] ;
extern void uTxDat(void) ;
extern void uTxInit(void) ;
void CalcateCheckSum(void) ;
#endif
//文件usend.c
/***************************************************
模拟串口发送协议
1、先发送高位 再发送低位
2、先发送4BIT低 再发送4BIT高作为起始识别码
***************************************************/
#include "global.h"
#include "usend.h"
tuSendData tuSendDat ;
uFgUTx uFguTx1 ;
uint8 *pIr ;
uint16 R_uTxBuf[2] ;
//****************************************
// 函数名称:IrSendDat
// 函数功能:ir数据发送
// 入口参数:无
// 出口参数:无
// 备注:发送数据时 先发送高位 再发送低位
// 在中断里面调用此函数 -- 1MS
//****************************************
void uTxDat(void)
{
if(!F_uTxEnb) return ;
if((*pIr) & uTxDatBit) //发送数据1时间
{
PuTx_High ;
}
else
{
PuTx_Low ; //发送0
}
uTxDatBit >>= 1 ;
if(uTxDatBit == 0x00) //1字节发送完成
{
uTxDatBit = 0x80 ;
pIr ++ ;
uTxDatByte -- ;
if(uTxDatByte == 0) //发送完成
{
F_uTxEnb = 0 ;
PuTx_High ; //释放总线
}
}
}
//****************************************
// 函数名称:IrSendInit
// 函数功能:ir数据发送前初始化
// 入口参数:无
// 出口参数:无
//****************************************
void uTxInit(void)
{
uTxDatBit = 0x80 ;
uTxDatByte = V_SendDatNum ;
pIr = &uTxDat1 ; //数据首地址
F_uTxEnb = 1 ; //发送使能
}
//****************************************
// 函数名称:CalcateCheckSum
// 函数功能:计算检验和
// 入口参数:无
// 出口参数:无
//****************************************
void CalcateCheckSum(void)
{
uint8 i ;
pIr = &uTxDat1 ; //数据首地址
uTxDat6 = 0 ;
for(i=(V_SendDatNum-1);i>0;i--)
{
uTxDat6 += *pIr ;
pIr ++ ;
}
}
//应用实例
void main(void)
{
uTxDat1 = 0X0F ; //00001111B 作为起始识别码
uTxDat2 = 2 ; //赋发送数据
uTxDat3 = 3 ;
uTxDat4 = 4 ;
uTxDat5 = 5 ;
CalcateCheckSum() ; //计算检验码
uTxInit() ; //发送初始化
while(1)
{
}
}
//----中断函数------
void interrupt(void) //1MS
{
uTxDat() ;
}原文地址:http://blog.csdn.net/libiaojs/article/details/38342465