金牌会员
- 积分
- 1236
- 金钱
- 1236
- 注册时间
- 2015-5-14
- 在线时间
- 352 小时
|
这个是一个红外发送函数模块,很简单,欢迎大家拍砖:
/**********************************************************************
FileName : infrared.h
Date : 2015.10.23
Author :
Company :
Version : 1.0.0
Description : 红外
**********************************************************************/
#ifndef __INFRARED_H__
#define __INFRARED_H__
#include "../heard/include.h"
/***********************************
Name: 数据速率
Overview:
Attention: None
************************************/
#define InfraredDataRate 1200 //1.2k
/***********************************
Name: 红外发送管速率
Overview:
Attention: None
************************************/
#define InfraredRate 38000 //38k
/***********************************
Name: 红外逻辑
Overview: 1:正逻辑,发送数据不取反;
0:负逻辑,发送数据按位取反
Attention: None
************************************/
#define InfraredDataLogic 1
/***********************************
Name: 红外发送模式
Overview: 1:中断方式;0:延时方式
Attention: 如果用延时,需要用户提供
一个38K*2的延时函数
Warning: 中断方式为实现
************************************/
#define InfraredTXModel 0
/***********************************
Name: 红外发送数据校验模式
Overview: Parity_NONE,Parity_0DD,
Parity_EVEN,Parity_MARK,
Parity_SPACE
Attention:
************************************/
#define InfraredDataModel Parity_EVEN
/***********************************
Name: 红外发送数据起始位方向
Overview: 1:先发高位;0:先发低位
Attention:
************************************/
#define InfraredDataDirection 0
/***********************************
Name: 红外发送管电源接通方式
Overview: 1:H导通;0导通
Attention: None
************************************/
#define InfraredTurnOnModel 1
//底层驱动相关
#define IR_TXD_Direction TRISBbits.TRISB5
#define IR_TXD_OUT() {TRISBbits.TRISB5=OUTPUT_PIN;}
#define IR_TXD PORTBbits.RB5
#define IR_TXD_H() {IR_TXD=1;}
#define IR_TXD_L() {IR_TXD=0;}
#if InfraredTurnOnModel
#define IR_ON() IR_TXD_H()
#define IR_OFF() IR_TXD_L()
#else
#define IR_ON() IR_TXD_L()
#define IR_OFF() IR_TXD_H()
#endif
#define IR_IO_Init() do{ \
IR_TXD_OUT(); \
IR_OFF(); \
}while(0)
//红外初始化函数
void InfraredInit(void);
//应用层接口函数
void InfraredSendData(void (*delay)(void),const _UBYTE *pSendData,_UBYTE DataCnt);
#endif
/******************************************************************************
红外应用说明:
1、红外发射管发送38K信号;
2、红外接收管空闲为高,接收到38K信号输出低;
3、用户数据调制38K信号:
如:用户要发送1010,速率为1.2K:则38/1.2=31.6,所以一个bit时间内有31个完成的38K:
|------------>数据速率<-----------|
| |
v v
1
----|-----|-----------------|-----|
-- | -- | ------- | -- |
| | ------- | | --->31个
| | ------- | |
-- |-- | ------- |-- |
|
|
|
v
38k信号
4、底层驱动是:0发送红外,1不发送红外;
*******************************************************************************/
/**********************************************************************
FileName : infrared.c
Date : 2015.10.23
Author :
Company :
Version : 1.0.0
Description : 红外
**********************************************************************/
#include "../heard/infrared.h"
#define Infrared38kCnt (_UBYTE)(InfraredRate/InfraredDataRate)
//内部函数声明
static void InfraredSendDrive(void (*delay)(void),_UBYTE SendData);
/******************************************************************************
* Function: InfraredInit
* PreCondition: None
* Input: None
* Output: None
* Side Effects: None
* Overview: 用于初始化红外发射管接口
* Warning: None
*****************************************************************************/
void InfraredInit(void)
{
IR_IO_Init();
}
#if InfraredTXModel //中断方式
#else //查询方式
/******************************************************************************
* Function: InfraredSendDrive
* PreCondition: 用户实现延时函数
* Input: void (*delay)()
* Output: None
* Side Effects: None
* Overview: 红外发射管发送驱动
* Warning: None
*****************************************************************************/
static void InfraredSendDrive(void (*delay)(void),_UBYTE SendData)
{
_UBYTE TXD9=0;
_UBYTE i=0;
_UBYTE n=0;
/*
IR_OFF();
*/
#if InfraredDataLogic
SendData = SendData;
#else
SendData = ~SendData;
#endif
//计算校验位
switch(InfraredDataModel)
{
case Parity_NONE:
TXD9=0;
break;
case Parity_0DD:
TXD9=!ParityFunctions(SendData);
break;
case Parity_EVEN:
TXD9=ParityFunctions(SendData);
break;
case Parity_MARK:
TXD9=1;
break;
case Parity_SPACE:
TXD9=0;
break;
default:
return;
}
//发送起始位
for(i=0;i<Infrared38kCnt;i++)
{
IR_ON();
(*delay)();
IR_OFF();
(*delay)();
}
//发送数据位
#if InfraredDataDirection //先发高位
for(n=0;n<8;n++)
{
if(SendData & 0x80)
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_OFF();
(*delay)();
IR_OFF();
(*delay)();
}
}
else
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_ON();
(*delay)();
IR_OFF();
(*delay)();
}
}
SendData=SendData<<1;
}
#else //先发低位
for(n=0;n<8;n++)
{
if(SendData & 0x01)
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_OFF();
(*delay)();
IR_OFF();
(*delay)();
}
}
else
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_ON();
(*delay)();
IR_OFF();
(*delay)();
}
}
SendData=SendData>>1;
}
#endif
#if (InfraredDataModel !=Parity_NONE)
//发送校验位
if(TXD9)
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_OFF();
(*delay)();
IR_OFF();
(*delay)();
}
}
else
{
for(i=0;i<Infrared38kCnt;i++)
{
IR_ON();
(*delay)();
IR_OFF();
(*delay)();
}
}
#endif
//发送停止位
for(i=0;i<Infrared38kCnt;i++)
{
IR_OFF();
(*delay)();
IR_OFF();
(*delay)();
}
}
void InfraredSendData(void (*delay)(void),const _UBYTE* pSendData,_UBYTE DataCnt)
{
while(DataCnt--)
{
InfraredSendDrive(delay,*(pSendData++));
}
}
#endif
|
|