大型项目急求有开发红外自学习发射模块经验的高手

tljjysj 2007-12-07 09:45:57
大型项目急求有开发红外自学习发射模块经验的高手.
要求非常熟悉单片机开发,有红外自学习开发经验.
比如开发一个模块,可以学习电视,空调等遥控设备的红外码
最终将所有遥控设备统一由一个遥控设备来控制.
急!急!!急!!!
有意者请联系:013310884499,013826119335

...全文
386 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
czzhouyun 2008-05-28
  • 打赏
  • 举报
回复
提供红外学习模块

红外遥控应用领域非常广泛,给消费者带来了很大的便利,但由于红外通讯协议的庞杂,也给使用者造成了一定的麻烦,同样也给设备集成商造成了不变,不同种控制设备的遥控器均不相同,据统计全世界红外遥控码类型已经超过一万种,中国国内应用的红外码型已经超过600种,其中有很多都是生产厂家为避免与其他设备串码而自定义的,这样对于红外学习来说造成了很大的难度。
红外遥控学习的方法有很多,大体上归纳为两种,一拷贝波形,二分析波形,拷贝波形的优点是能学习所有波形,缺点是学习过程中波形畸变也完全复制了,另红外码有多种载波,拷贝波形如加载波一起拷贝显然数据量非常大,因而通行拷贝波形不会拷贝载波,这就导致了可能波形拷贝对了,但载波不对,依然不能控制设备;分析波形的优点是取得波形片段后无论波形如何畸变均能按标准波形发出红外码,缺点是需要建立一个庞大的标准码库,这个工作只能通过不断的积累来完成。
本红外学习模块折中了以上两种方式,对于普遍使用的码型采用波形分析的方法,对于不常用的码型采用拷贝波形的方式,并且对于所有的红外码均采用了特征纠偏的方法,经大量实验证明,这种学习方法比较优秀,可以学习电视、DVD、机顶盒、空调、CD、投影机等设备的红外控制信号,同时可以不断更新标准码库,如果已将本红外学习模块应用到产品上,依然可以通过标准串口更新标准码库。
本红外学习模块如果大量应用在产品上,为避免每个模块都要学习,可以先学习一个模块,测试成功后通过标准串口将学习好的红外数据传输到其他未学习的模块上,为批量产品提供了便利。
本红外学习模块提供了两种电气接口供使用者选择,SPI或TTL电平的串口,通过一个功能选择接口即可选择合适的接口,同时提供给用户三个额外的I/O口,用户可使用命令来控制或读取这三个I/O口,如使用SPI接口则用户可得到一个额外的标准串口,这对于使用多个串口的用户提供了便利,其中SPI接口和串口均为硬件接口,并非通过I/O口模拟的,因而用户可以放心使用,其中SPI接口提供了无SPI功能的MCU与之通讯的模拟程序,方便用户移植,串口则提供了从110~512000bps的波特率,用户可通过寄存器设置(使用SPI做为控制接口时)
本红外学习模块提供给用户一个状态复位控制引脚,在本模块上电前将此引脚接地则可以恢复到出厂前的设置,但已学习好的数据不会擦除。
本红外学习模块可提供外壳封装版本,可以为客户提供OEM版,为大客户提供单芯片版。
关于本模块的使用和应用上的任何问题,请来电或邮件咨询,升级信息及改版信息请见网站通告。
http://www.flymcu.com
http://shop34549393.taobao.com/
QQ:47414986
EMAIL:czzhouyun@hotmail.com
手机:15951211943
icandoit_shiyang 2008-05-07
  • 打赏
  • 举报
回复
我做过个简单点的,楼主要是有兴趣的话,联系我,不过关键看酬金了。。。。
freeskyo 2008-05-06
  • 打赏
  • 举报
回复
不错~~~
woainy 2008-05-05
  • 打赏
  • 举报
回复
把不同遥控器集于一身,要转换模式,用起来有点麻烦
fycom200 2008-05-05
  • 打赏
  • 举报
回复
dingxia
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
支持搂主,收藏
色郎中 2007-12-29
  • 打赏
  • 举报
回复
红外遥控器软件解码原理和程序



#include "at89x52.h"
#define NULL 0x00//数据无效
#define RESET 0X01//程序复位
#define REQUEST 0X02//请求信号
#define ACK 0x03//应答信号,在接收数据后发送ACK信号表示数据接收正确,
也位请求信号的应答信号
#define NACK 0x04//应答信号,表示接收数据错误
#define BUSY 0x05//忙信号,表示正在忙
#define FREE 0x06//空闲信号,表示处于空闲状态
#define READ_IR 0x0b//读取红外
#define STORE_IR 0x0c//保存数据
#define READ_KEY 0x0d//读取键值
#define RECEIVE 0Xf400//接收缓冲开始地址
#define SEND 0xfa00//发送缓冲开始地址
#define IR 0x50//红外接收缓冲开始地址
#define HEAD 0xaa//数据帧头
#define TAIL 0x55//数据帧尾
#define SDA P1_7
#define SCL P1_6



unsigned char xdata *buf1; //接受数据缓冲
unsigned int buf1_length; //接收到的数据实际长度
unsigned char xdata *buf2; //发送数据缓冲
unsigned int buf2_length; //要发送的数据实际长度
bit buf1_flag; //接收标志,1表示接受到一个数据帧,0表示没有接受到数据帧或数据
帧为空
bit buf2_flag; //发送标志,1表示需要发送或没发送完毕,0表示没有要发送的数据或
发送完毕
unsigned char state1,state2; //用来标志接收字符的状态,state1用来表示接
收状态,state2用来表示发送状态
unsigned char data *ir;
union{
unsigned char a[2];
unsigned int b;
unsigned char data *p1[2];
unsigned int data *p2[2];
unsigned char xdata *p3; //红外缓冲的指针
unsigned int xdata *p4;
}p;
//union{ //
// unsigned char a[2]; //
// unsigned int b;
// unsigned char data *p1[2];
// unsigned int data *p2[2];
// unsigned char xdata *p3;
// unsigned int xdata *p4; //地址指针
//}q; //

union{
unsigned char a[2];
unsigned int b;
}count;
union{
unsigned char a[2];
unsigned int b;
}temp;
union{
unsigned char a[4];
unsigned int b[2];
unsigned long c;
}ir_code;

union{
unsigned char a[4];
unsigned int b[2];
unsigned long c;
unsigned char data *p1[4];
unsigned int data *p2[4];
unsigned char xdata *p3[2];
unsigned int xdata *p4[2];
}i;
unsigned char ir_key;
bit ir_flag; //红外接收标志,0为缓冲区空,1为接收成功,2为缓冲溢出
void sub(void);
void delay(void);
void ie_0(void);
void tf_0(void);
void ie_1(void);
void tf_1(void);
void tf_2(void);
void read_ir(void);
void ir_jiema(void);
void ir_init(void);
void ir_exit(void);
void store_ir(void);
void read_key(void);
void reset_iic(void);
unsigned char read_byte_ack_iic(void);
unsigned char read_byte_nack_iic(void);
bit write_byte_iic(unsigned char a);
void send_ack_iic(void);
void send_nack_iic(void);
bit receive_ack_iic(void);
void start_iic(void);
void stop_iic(void);
void write_key_data(unsigned char a);
unsigned int read_key_data(unsigned char a);
void ie0(void) interrupt 0{ie_0();}
void tf0(void) interrupt 1{tf_0();}
void ie1(void) interrupt 2{ie_1();}
void tf1(void) interrupt 3{tf_1();tf_2();}
void tf2(void) interrupt 5{ //采用中断方式跟查询方式相结合的办法解

EA=0; //禁止中断
if(TF2){ //判断是否是溢出还是电平变化产生的中断
TF2=0; //如果是溢出产生的中断则清除溢出位,重
新开放中断退出
EA=1;
goto end;
}
EXF2=0; //清除电平变化产生的中断位
*ir=RCAP2H; //把捕捉的数保存起来
ir ;
*ir=RCAP2L;
*ir ;
F0=1;
TR0=1; //开启计数器0
loop:
TL0=0; //将计数器0重新置为零
TH0=0;
while(!EXF2){ //查询等待EXF2变为1
if(TF0)goto exit; //检查有没超时,如果超时则退出
};
EXF2=0; //将EXF2清零
if(!TH0) //判断是否是长低电平脉冲过来了
{ //不是长低电平脉冲而是短低电平
if(F0)count.b ; //短脉冲数加一
temp.a[0]=RCAP2H; //将捕捉数临时存放起来
temp.a[1]=RCAP2L;
goto loop; //返回继续查询
}
else{ //是低电平脉冲,则进行处理

F0=0;
*ir=temp.a[0]; //把连续的短脉冲总时间记录下来
ir ;
*ir=temp.a[1];
ir ;
*ir=RCAP2H; //把长电平脉冲时间记录下来
ir ;
*ir=RCAP2L;
ir ;
if(ir>=0xda) {
goto exit; //判断是否溢出缓冲,如果溢出则失败退出
}
goto loop; //返回继续查询
}
exit:
ir_flag=1; //置ir_flag为1表示接收成功
end:
;
}


void rs232(void) interrupt 4{
static unsigned char sbuf1,sbuf2,rsbuf1,rsbuf2; //sbuf1,sbuf2用来接收
发送临时用,rsbuf1,rsbuf2用来分别用来存放接收发送的半字节
EA=0; //禁止中断
if(RI){
RI=0; //清除接收中断标志位
sbuf1=SBUF; //将接收缓冲的字符复制到sbuf1
if(sbuf1==HEAD){ //判断是否帧开头
state1=10; //是则把state赋值为10
buf1=RECEIVE; //初始化接收地

}
else{
switch(state1){
case 10:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
sbuf2=~sbuf2; //把低半字节取反
if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
{ //接收错误,有可能接收的是数
据帧尾,也有可能是接收错误
if(sbuf1==TAIL) //判断是否接收到数据帧尾
{ //是接收到数据帧尾
buf1=RECEIVE; //初始化接收的地址
if(*buf1==RESET) //判断是否为复位命令
{
ES=0;
sbuf2=SP 1;
for(p.p1[0]=SP-0x10;p.p1[0]<=sbuf2;p.p1
[0] )*p.p1[0]=0;
}
state1=0; //将接收状态标志置为零,接收
下一个数据帧
buf1_flag=1; //置接收标志为1,表示已经接收
到一个数据帧
REN=0; //禁止接收
}
else
{ //不是接受到数据帧尾,表明接
收错误
state1=0; // 将接收状态标志置为零,重新
接收
buf1=RECEIVE; //初始化发送的地址
*buf1=NACK; //把NACK信号存入接收缓冲里
buf1_flag=1; //置标志位为1,使主程序能对接
收错误进行处理
REN=0; //禁止接收
}

}
else
{ //接收正确
rsbuf1=~sbuf1; //按位取反,使高半字节变原码
rsbuf1&=0xf0; //仅保留高半字节,低半字节去

state1=20; //将状态标志置为20,准备接收
低半字节
}
break;
case 20:sbuf2=sbuf1>>4; //把高半字节右移到的半字节
sbuf2=~sbuf2; //将低半字节取反
if((sbuf2&0x0f)!=(sbuf1&0x0f)) //判断接收是否正确
{ //接受错误
state1=0; // 将接收状态标志置为零,重新
接收
buf1=RECEIVE; //初始化接收的地址
*buf1=NACK; //把NACK信号存入发送缓冲里
buf1_flag=1; //置标志位为1,使主程序能对接
收错误进行处理
REN=0; //禁止接收
}
else
{
sbuf1&=0x0f; //仅保留低半字节,去掉高半字

rsbuf1|=sbuf1; //高低半字节合并
*buf1 =rsbuf1; //将接收的数据保存至接收缓冲
里,并且数据指针加一
buf1_length ; //接收数据长度加一
state1=10; //将state1置为10,准备接收下
个字节的高半字节
}
break;

}
}



}
diabllosky 2007-12-29
  • 打赏
  • 举报
回复
人在上海就帮不了你了。广州做这个很多的啊
如果要做万能的,好像还有点麻烦。因为做红外遥控的基本上各个厂家都采用不同的加密的。。。要不你拿长虹的遥控器可以随便开SONY、夏普的电视了?
longgao84 2007-12-09
  • 打赏
  • 举报
回复
有过相关经验,在单片机方面比较熟练。
一般情况下是没有问题的
hnhblyc 2007-12-09
  • 打赏
  • 举报
回复
还不是高手,我还是新手,我编程序还可以
MBWQ 2007-12-08
  • 打赏
  • 举报
回复
广州,太远了,温州可以帮你看看
bigbat 2007-12-07
  • 打赏
  • 举报
回复
哪里人啊!
色郎中 2007-12-07
  • 打赏
  • 举报
回复
帮顶

tljjysj 2007-12-07
  • 打赏
  • 举报
回复
怎么就没有做过的,有经验的人来CSDN呢.
难道CSDN真的都是新手来这里找帮助的吗?
jmulxg 2007-12-07
  • 打赏
  • 举报
回复
用单片机开发红外项目
很有意思
不过人不在广州~
lbing7 2007-12-07
  • 打赏
  • 举报
回复
做万能控制器?

哈哈哈哈

做市场的喜欢玩这个...

tljjysj 2007-12-07
  • 打赏
  • 举报
回复
该项目在广州,请有意的朋友跟我联系.
QQ:20925249 请注明"红外"
skype:syatanc

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧