<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