cqwangsf 发表于 2008-6-16 13:58

学习型遥控器的设计及实现

<B></B><br /><br /><br />本文介绍了一种基于EU_IR_IC专用红外线学习芯片的型遥控器,并对其工作原理及软、硬件的设计和实现方法进行了详细的阐述。<br />关键词:&nbsp;学习型遥控器;&nbsp;红外遥控&nbsp;;宽频载波;自动识别。<br /><B>引&nbsp;言</B><br />远程控制技术日渐流行,远程控制家用电器成为一种需求。特别是一些特定场所的电器的远程控制如移动/电信/联通的基站的空调实现远程管理,可以节约大量的人力成本。还有象学校教室的电视的集中管理都需要远程来控制。而现有的家用电器通常都是红外接口。要把远程信号转成红外信号才可能控制现有的家用电器。本文介绍了一种基于专用红外芯片的学习型遥控器,以EU_IR_IC专用红外芯片为核心,通过测量并记录红外遥控信号,再生遥控信号来实现学习型遥控器。与现在流行的一些方案区别,可适应27K-75K的不同载波频率。各种制式可学习现有市面99.9%的遥控信号。<br /><B>EU_IR_IC专用红外学习型遥控芯片介绍</B><br />EU_IR_IC专用红外学习型遥控芯片,是重庆易用科技公司开发的一款专用红外学习型遥控芯片详细资料可参考www.cqeukj.com。主要特点如下:<br />适应性强:可学习27K-75K的不同载波频率红外信号。能学习市场99.9%的遥控器信号<br />使用方便:&nbsp;全双工UART用户接口,波特率可设。<br />指令简单:只需二条指令即可控制。<br />宽电压:3V-5.5V。<br />电路简单:外接元件少。<br />引脚及封装图如下:<br /><img src="https://bbs.21ic.com/upfiles/img/20078/2007829315858.jpg"><br /><br /><B>学习型遥控器的硬件设计及实现</B><B></B><br /><B></B><img src="https://bbs.21ic.com/upfiles/img/20078/2007829022515.jpg"><br />设计原理图如上图所示<br />EU_IR_IC的16脚接一只三极管推动红外发送.接收信号接EU_IR_IC的14脚红外学习接收电路。EU_IR_IC的27/28脚接24Cxx的EEPROM。根据按键的多少决定每个按键用32B的空间。用户的MCU通过UART串口连接。<br /><B>学习型遥控器的软件设计及实现</B><B></B><br />用户单片机通过UART与EU_IR_IC通信。默波特率是9600bps,8位数据位,一个停止位。<br />一共二条指令<br />Sxxx,学习指令:学习一个按键并记录到xxx位置,xxx为000-999的数字.<br />Fxxx发送指令,将xxx的红外指令发送出去,&nbsp;xxx为000-999的数字.<br /><br />串口相关部分程序<br /><br /><font color=#000000></font>#include&nbsp;&ltreg52.h&gt<br />#define&nbsp;&nbsp;Uchar&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char<br />#define&nbsp;&nbsp;Tdc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff<br />#define&nbsp;&nbsp;Tcdh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff<br />#define&nbsp;&nbsp;BUFFER_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;64<br />#define&nbsp;&nbsp;TX_BUFFER_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;16<br />#define&nbsp;&nbsp;COMMD_SIZE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4<br />//+++++++++++++Uart&nbsp;init&nbsp;9600bps&nbsp;++++++++++++++++++++<br />void&nbsp;Init_uart(void)<br />{<br />&nbsp;EA&nbsp;=&nbsp;0;<br />&nbsp;TMOD=0x22;<br />&nbsp;PCON=PCON&0x7f;<br />&nbsp;TH1=0xfd;<br />&nbsp;TL1=0xfd;<br />&nbsp;SCON=0x50;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//11.0592Mhz&nbsp;9600bps<br />&nbsp;ES=1;<br />&nbsp;EX0=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;PX0=0;<br />&nbsp;RI=0;<br />&nbsp;TI=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;IT0=1;<br />&nbsp;TR1=1;<br />&nbsp;EA=1;&nbsp;<br />}<br />//+++++++++End&nbsp;Uart&nbsp;init&nbsp;9600bps&nbsp;++++++++++++++++++++<br />//+++++++++++++++&nbsp;Uart&nbsp;interrupt&nbsp;++++++++++++++++++++<br />Void&nbsp;rcv_com(void)&nbsp;interrupt&nbsp;4&nbsp;using&nbsp;2<br />{<br />&nbsp;if(RI)<br />&nbsp;{<br />&nbsp;&nbsp;RI&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;Serial_Buff&nbsp;=&nbsp;SBUF;<br />&nbsp;&nbsp;&nbsp;Buff_Count++;<br />&nbsp;&nbsp;Buff_Count=Buff_Count%BUFFER_SIZE;<br />&nbsp;}<br />&nbsp;else&nbsp;if(TI)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;TI&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;if&nbsp;(TDX_Buffer_Count-Sended_count==0)<br />&nbsp;&nbsp;&nbsp;TDX_flag=0;<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;SBUF=TDX_Buffer;<br />&nbsp;&nbsp;&nbsp;Sended_count=(Sended_count+1)%TX_BUFFER_SIZE;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />}<br />//+++++++++++End&nbsp;Uart&nbsp;interrupt&nbsp;+++++++++++++++++++++<br />//++++++++++++++send&nbsp;data&nbsp;+++++++++++++++++++++++++++<br />Uchar&nbsp;send_char&nbsp;(Uchar&nbsp;*send_data,Uchar&nbsp;data_long)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Uchar&nbsp;*send_D,D_long,i;<br />&nbsp;&nbsp;Uchar&nbsp;unused_buffer_size,unsend_data_long;<br />&nbsp;&nbsp;send_D=send_data;<br />&nbsp;&nbsp;D_long=data_long;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsend_data_long=TDX_Buffer_Count-Sended_count;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(unsend_data_long&gt=0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;unused_buffer_size=TX_BUFFER_SIZE-unsend_data_long;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;unused_buffer_size=Sended_count-TDX_Buffer_Count;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if&nbsp;(unused_buffer_size&lt=D_long)<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0xff;<br />&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;if&nbsp;(TDX_flag==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;SBUF=*send_D;<br />&nbsp;&nbsp;&nbsp;&nbsp;send_D++;<br />&nbsp;&nbsp;&nbsp;&nbsp;D_long--;<br />&nbsp;&nbsp;&nbsp;&nbsp;TDX_flag=0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;EA=0;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;for(i=0;i&ltD_long;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDX_Buffer=*send_D;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;send_D++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TDX_Buffer_Count=(TDX_Buffer_Count+1)%TX_BUFFER_SIZE;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;EA=1;&nbsp;<br />&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;}<br />//+++++++++++++&nbsp;end&nbsp;send&nbsp;data&nbsp;+++++++++++++++++++++++++++++++++++++++++++++<br /><br />void&nbsp;main&nbsp;(void)<br />&nbsp;{&nbsp;int&nbsp;long_count;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;x;<br />&nbsp;&nbsp;Buff_Count=0;<br />&nbsp;&nbsp;USED_count=0;<br />&nbsp;&nbsp;TDX_Buffer_Count=0;<br />&nbsp;&nbsp;Sended_count=0;<br />&nbsp;&nbsp;TDX_flag=0;<br />&nbsp;&nbsp;Init_uart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;<br />&nbsp;&nbsp;{<br />&nbsp;}<br />}<br /><br />&nbsp;<br /> 相关链接:<a href='https://bbs.21ic.com/upfiles/img/20078/200781141328400.pdf'>https://bbs.21ic.com/upfiles/img/20078/200781141328400.pdf</a>

cqwangsf 发表于 2008-6-17 08:56

给出中断收发的串口程序

程序只给出中断收发的串口程序

xxdcq 发表于 2008-7-7 09:07

不适用

现在一般用em78p156实现,一片也就1元多点,批量不到1元<br />用你的芯片成本太高了!

果冻树 发表于 2008-7-7 14:37

芯片贵吗?

以前有想做个万能遥控器.知道有专用的IC

zjh006 发表于 2008-7-7 17:21

成本有点高

cqwangsf 发表于 2008-7-10 13:55

都是相对的!

如果你只用10片你这个个方案只要一天就开发好了!但你用单片机自己做可能要做5天!那么多出来4天的工资算100块一天吧就是400了算下来还是用这个划算!不能只算硬件成本!人工成本也是成本呀!

zjh006 发表于 2008-7-10 14:30

你的相对论很难理解

1.如果你的客户每次需要的只是10片或是100片,这样的项目有意义吗?<br />2.现在有很多方案公司都有成熟的学习遥控器方案,直接生产就可以了。

xuanzhuan360 发表于 2014-3-11 20:29

有联系方式么 ?

cqwangsf 发表于 2014-7-11 16:20

QQ:91O887181
页: [1]
查看完整版本: 学习型遥控器的设计及实现