OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5221|回复: 6

分享一个自己写的红外发送函数--欢迎拍砖

[复制链接]

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2015-10-23 17:24:30 | 显示全部楼层 |阅读模式
这个是一个红外发送函数模块,很简单,欢迎大家拍砖:

/**********************************************************************
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






30年众生牛马,60年诸佛龙象!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-10-23 22:32:13 | 显示全部楼层
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-10-24 17:09:51 | 显示全部楼层
谢谢分享,用到的时候再学习~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2015-10-24 17:52:45 | 显示全部楼层
经过我的板子测试,没有问题!
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2015-10-24 18:55:20 | 显示全部楼层
谢谢分享...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
 楼主| 发表于 2015-10-24 18:59:24 | 显示全部楼层
我想听听大家的测试结果,或者改进意见,这才是我发出来的目的。毕竟闭门造车不能获得成功!!!!!!!
30年众生牛马,60年诸佛龙象!
回复 支持 反对

使用道具 举报

32

主题

284

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1335
金钱
1335
注册时间
2014-3-27
在线时间
352 小时
发表于 2015-12-2 14:39:39 | 显示全部楼层
MARK,谢谢分享。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 12:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表