红外线接收控制器的制作

红外线接收控制器的制作
原文作者:赵金明
在生活中,我们常用到红外线控制各类电器,如彩电、空调、电风扇等,为我们带来较多的方便,但有时我们仍感到不方便。如看完电视后,用遥控器只能关掉电视主电源,电视仍处于待机状态,使用者还得走到电视跟前,按下电视电源开关方能放心。若想看电视,还得动身开电视,显得很麻烦,尤其是冬天躺在床上看电视,上上下下,深感不便。本文以利用红外遥控器来遥控风扇的制作方法为例(可任选一只红外线遥控器,能调速,软件稍作改变,可增加定时功能等),来介绍红外线接收控制器的制作方法,如果制作电视交流电源的开、关控制器,可与电视共用一只遥控器,制作也较简单些。
制作思路
红外遥控发射器是利用红外线作载体传送信息的,发射周期不等的经过调制后串行码,该串行码一般由引导码、用户识别码、操作码组成。经红外接收头解码后得到一串周期不等的矩形波,如示意图1。
不同型号的遥控发射器的波形宽度不同,即周期t1、t2……不同,在不知手头遥控发射器的波形周期的情况下,首先要制作一个检测红外线周期的工具。根据测得的周期规律来制作红外线接收控制器。
制作方法
检测红外周期的器件制作,见图2。
当红外接收头没有接收到发射器发送来的红外线,其输出端输出高电平(约+5v)。当接收到红外线,输出端电平变低,送到单片机at89c2051的外部中断1口即int1,使其发生中断而进入中断服务:启动定时器1并开始计数,相当于在图1的a点,1个周期后即c点,单片机第二次中断,关定时器1,记下周期t1(实际上只记下th1的数值,tl1的值可以丢弃),然后清th1、tl1,再启动定时器1重新计数,第二个周期完后,同样会引起单片机发生中断,再记下周期t2……,如此记下40-50个周期(一般红外编码为4字节,即32bit,之前还有引导码,又因接收到的红外数据不一定是从引导码开始,要分析一次完整的串行码,应尽可能多记下红外矩形波周期数),接收完后,通过按轻触开关将各记下的各周期的th1在数码管显示出来以作分析(每按一次轻触开关,显示下一个周期数)。
编程方法
在main()中开中断,启动定时器1,即ea=1; ex1=1; it1=1; tr1=1;
在外部中断1的服务程序中编写如下语名:
#define cnt 50//预测50个红外线周期
data byte value_h[cnt];//记录周期的变量(数组)
data byte count=0;//接收到的周期数
void int1(void) interrupt 2
{
if(th1==tl1&&tl1==0) //判断是否是第一次接收到红外数据
{
tr1=1;
} else{
tr1=0; value_h[count]=th1; th1=tl1=0; tr1=1; count++;
if(count==cnt)
{
ex1=0; count=0;
}
}
}
假设接收到的th的数值为:
30,50, 04,08,08,08, 04,04,04,04, 04,08,08,08, 04,04,04,04, 08,04,04,08, 04,04,04,04,04, 04,08,08,04, 08,08,08,08,3f,50----
稍作分析可知,表示高低电平的有效数为:04,08。若将04定作低电平,08定作高电平,舍弃其他数据,得到4字节数据即:01110000,01110000 ,10010000,01101111。转为十六进制后得:70h,70h,90h,6fh,至此得到遥控发射器刚才按下的键值码,用同样的方法可以测得其他键键值码。假设有:
70h,70h,0x90,0x6f, //0键
70h,70h, 0x00,0xff, //1键
……
70h,70h, 0xd0,0x2f //power 键
根据以上数据分析得,每键码为4字节,前2字节固定不变,为用户识别码,后2字节均不同,是操作码。将遥控器上的各键键值码测出后,根据这些数据可以根据制作需要进行编程了。因键值码为4字节太长,不利于编程,需要将各键键值转为相对应的1字节的数据,如:70h,70h,0x90,0x6f,对应于0 ,70h,70h, 0x00,0xff对应于1……
转换方法:
建立一个数组,将上述测得的各键码按顺序放入数组中(去掉用户识别码)
code byte arr[][2]=
{
0x90,0x6f, //0,尽可能按键0、键1……的先后顺序放,以符合习惯
0x00,0xff, //1
……
0x10,0xef, //9
0xd0,0x2f //power 13
};
在接收红外线的外部中断1函数中编写如下的键码转换语句:
data byte arrtmp[4];
data byte keytmp; //转换后的键值寄存变量
data byte keyval=nokey;
bit keyok;// 键值转换完成与否的标志
bit d_ok;//接收到一个完整的键码标志
void ex_int(void) interrupt 2
{
byte i;
byte (*p)[2];
……
if(d_ok) //若接收到完整的键码
{
d_ok=0; //清除
if(arrtmp[0]==0x70&&arrtmp[1]
==0x70){ //键码转换
for(p=arr,i=0;i<14;i++,p++)
{ if(arrtmp[2]==*(*p+0)&&arrtmp[3]
==*(*p+1))
{ keytmp=i; keyok=1; //键值
转换成功标志
break;
} else {keytmp=nokey; } //未
接收到完整的键值
}
}else { keytmp=nokey; }
}
}
经过转换后的keytmp为0、1、2……的整数,然后再编写主函数、调速函数(参源程序),来进行电风扇调速。
有关电路的一些解释:单片机u1(at89c2051)p37脚输出高低电平通过r13控制光耦可控硅moc3041(参数可在《电子制作》网站查找)通断,通过控制其通断时间比来达到电风扇调速。
有关红外周期检测和电风扇调速实例的源程序可在本刊网站上下载。

变频器频率为何调不上去?如何解决?
U盘兼容格式有哪些?
FCC启动5G 频段竞拍,有望塑造未来 10 年中无线行业的竞争格局
选择爱普生投影机的三大理由
LED巨大商机涌现,中国厂商的机遇在哪儿?
红外线接收控制器的制作
关于高端处理器的工作电压的动态调整的分析和介绍
群载波应急广播系统在高速公路交通管理中的应用
东芝推出XG6-P固态硬盘系列 XG6-P系列最高存储容量[2]可达2,048GB
科学家开发可预测精神病的AI系统
智能变电站和传统变电站的区别
工业家用手持红外线测温枪的原理及优点
手持式设备掉电保护的电源后备方案
在语音处理中,通过使用大数据可以轻松解决很多任务
通过深度学习将X射线数据转换成3D图像
TI GHz DSP应用介绍
信步科技SV4-H1134嵌入式主板介绍
安防产业XVI技术进入5.0时代,高端智能AI能力傲视群雄
微雪电子1.3inch SH1106 OLED驱动模块简介
vivo首款搭载骁龙888新机跑分出炉