摘要利用红外线传输信息的方式可用于近距离遥控、飞机内广播和航天飞机内宇航员间的通信等。
同时红外通信技术适合于低成本、跨平台、点对点高速数据连接,尤其是嵌入式系统。
其主要应用:设备互联、信息网关。
设备互联后可完成不同设备内文件与信息的交换。
信息网关负责连接信息终端和互联网。
红外通信技术是在世界范围内被广泛使用的一种无线连接技术,被众多的硬件和软件平台所支持。
红外线通信是目前使用较广泛的一种通信手段。
由于红外线通信具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线通信技术。
工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线通信技术不仅完全可靠而且能有效地隔离电气干扰。
而单片机是目前设计应用中用得比较广泛的器件,它可以通过软件编程来达到不同的效果,实现各种各样不同的功能,具有灵活性强、可靠性高,可扩展性好等优点。
本文所要介绍的内容就是如何利用单片机,结合红外线器件设计构造出一套简易的红外线通信系统,以实现在中短距离内的红外无线通信的功能。
与一般通用的红外遥控器不同的是它不是利用专用的编解码芯片来实现发收端的编解码,而是应用C51 单片机,通过单片机的编、解码程序来实现红外信号的发收,从而实现红外遥控通信功能。
此通信系统经过一些必要的扩展,完全可以实现通用和各种专用红外遥控器的功能。
关键字:单片机;红外通信;发射;接收;遥控;串行接口目录1 绪论.......................................................... - 3 -2 红外通信各硬件电路............................................ -3 -2.1 红外发射模块电路的实现.................................. - 3 -2.1.1 载波信号电路的设计................................. - 4 -2.1.2按键输入电路....................................... - 5 -2.1.3串口通信的硬件电路................................. - 5 -2.1.4时钟电路和复位电路................................. - 6 -2.1.5 红外发射电路模块的系统综合电路图................... - 6 -2.2 红外接收模块电路的实现.................................. - 7 -2.2.1 解码后控制电路..................................... - 7 -2.2.2 接收模块的系统综合电路图........................... - 8 -3 红外通信系统的软件设计........................................ - 9 -3.1 红外遥控发射的软件程序实现.............................. - 9 -3.2 红外遥控接收的软件程序................................. - 16 -4 结论........................................................ - 20 -5 参考文献..................................................... - 20 -1 绪论随着社会生产力的发展和技术的进步,单片机的应用越来越广泛。
在遥控应用领域,单片机尤其得到了很好的应用。
很多单片机应用系统中,常常利用非电信号传送控制信息和数据信息,以实现遥控或遥测的功能。
在各种非电信号中,红外线光信号是最经常用的。
它在各领域都得到广泛的应用,红外线为不可见光,具有很强的隐蔽性和保密性,因此其在防盗、警戒等安全保卫装置也得到了广泛的应用。
因为红外线通信具有成本低廉、控制简单、实施方便、简单易用、结构紧凑和抗干扰能力强、传输可靠性高的特点,因此在小型的通信移动设备中获得了广泛的应用。
试想一下,如果没有红外通信,连接这其中的两个设备就必须要有一条特制的连线,如果要使它们能够任意地两两互联传输数据,该需要多少条连线呢?而有了红外线通信口,这些问题就都迎刃而解了。
本课题要设计完成的就是一个简单的基于单片机的红外通信系统,通过单片机的编、解码程序来实现红外信号的发收,从而实现红外遥控通信功能.此通信系统经过一些必要的扩展,完全可以实现通用和各种专用红外遥控器的功能。
实现单片机系统红外通信的关键在于红外接口电路的设计以及接口驱动程序设计。
2 红外通信各硬件电路我们这里把整个遥控器系统分为发射模块及接收模块两部分,和一般通用的遥控器结构相同,本课题设计的通信系统发射部分也包括键盘矩阵电路、编码调制电路、LED 红外发射电路;接收部分包括光、电转换放大器、解调解码电路和解码显示电路。
各部分电路的设计思路和具体实现如下。
2.1 红外发射模块电路的实现当按下某一按键后,遥控器上的遥控芯片便进行编码产生一组句柄,结合载波电路的载波(38KHz)而成为合成信号,经过放大器提升功率而推动红外发射二极管,将红外线信号发射出去,所要发射的句柄必须加上载波才能使信号传送的距离加长,一般遥控器的有效距离为7m。
图2.1. 基于I/O口的红外发射电路2.1.1 载波信号电路的设计图2.1.1 载波电路图为使红外信号能够正确的传送出去和传送更远,我们也需要在编码信号输出端加上一个高频载波信号。
通过载波信号的调制,把编码信号的有用信息“携带”出去,这样信号的传送距离就能更长,而且能有效的避免干扰。
通过555 时基电路和选择合适的外围元件组成频率为38KHz 的载波脉冲振荡器,如图2.1.1 所示。
图中,通过调节200 欧精密可调变阻器RP2 的阻值,可以调整使555 的输出端输出为38KHz 的载波信号。
2.1.2按键输入电路。
图2.1.2 按键输入电路2.1.3串口通信的硬件电路如下图2.1.3所示。
图2.1.3 串口通信电路2.1.4时钟电路和复位电路图2.1.4(1)时钟电路图2.1.4(2)复位电路2.1.5 红外发射电路模块的系统综合电路图通过上面对发射模块各部分电路的具体设计,我们可以得出发射模块的系统综合电路设计图如下图3.11 所示。
图2.1.5 发射模块系统综合电路图2.2 红外接收模块电路的实现图2.2 为红外接收的工作方块图,其主要控制组件为红外线接收模块,其内部含有高频的载波电路,专门用来滤除红外线合成信号的载波信号(38KHz)而送出发射器的控制信号。
当红外线合成信号进入红外线接收模块,在其输出端便可以得到原先的数字控制编码,只要经过单片机译码程序进行译码,便可以得知按下了哪一按键,而作出相对应的控制处理,完成红外遥控的动作图2.2 红外接收工作方块图2.2.1 解码后控制电路无线通信的最终目的就是为了实现无线接收后的控制功能。
本课题的无线接收后控制电路设计为一个数码显示电路和一个响铃报警电路,这样既可以实现了红外无线接收后的控制功能,也可以通过这个电路很直观的识别解码的成功与否。
具体电路设计见下图2.2.1图2.2.1 解码后数码显示电路电路中根据发射端发射按键的数目,设计一位的数码管来显示,数码管采用的是一个共阴极接法的一位数码显示管,其中0—9 数码显示数字表示的是发射按键的0—9 的编号数,关闭按键的数码显示符号则用“E”来表示。
报警电路部分则只采用了一个5伏电磁型蜂鸣器来报响,通过蜂鸣器的报响从而表示译码的成功。
2.2.2 接收模块的系统综合电路图通过上面对接收模块各部分电路的具体设计,我们不难得出接收模块的系统综合电路设计图见图2.2.2图2.2.2 接收模块的系统综合电路图3 红外通信系统的软件设计软件的设计,要求准确无误的实现红外遥控器的控制功能,并要求系统具有高的可靠性、快的反应速度、以及低的系统功耗。
本系统的控制功能主要包括发射端的键盘按键输入,按键信息的编码输出,接收端的译码显示以及报响控制等功能。
下面是对红外发射与红外接收软件程序设计的具体阐述。
3.1 红外遥控发射的软件程序实现#include <reg52.h>#include <intrins.h> //_nop_ ();void scan_k0(void); //0void scan_k1(void); //1void scan_k2(void); //2void scan_k3(void); //3void scan_k4(void); //4void scan_k5(void); //5void scan_k6(void); //6void scan_k7(void); //7void scan_k8(void); //8void scan_k9(void); //9void scan_k10(void);//10void send_9000(void);void send_4500(void);void send_560(void);void send_565(void);void send_1685(void);void send_2000(void);void send(unsigned char Data);void timer0_int(void);// interrupt 1 ; //T0 中断子程序 //2ms 计数器******************************************************************* sbit OUT=P1^0;//发射脚sbit K0 =P2^0;sbit K1 =P2^1;sbit K2 =P2^2;sbit K3 =P2^3;sbit K4 =P2^4;sbit K5 =P2^5;sbit K6 =P2^6;sbit K7 =P2^7;sbit K8 =P1^5;sbit K9 =P1^6;sbit K10=P1^7;sbit TEST1=P3^0;//TEST1sbit TEST2=P3^1;//TEST2sbit TEST3=P3^2;//TEST3sbit TEST4=P3^3;//TEST4******************************************************************* unsigned char ss ; //system statusunsigned char n0,n1,n2,n3,n4,n5,n6,n7,n8,n9,n10; //键龄unsigned char wait; //等待释放################################################################### void main(){OUT=0; //关闭发射TMOD=0x11; //定时器0 和1 都设置为方式1 即16 位计数器TL0=0x30;TH0=0x0F8; //T0 定时2msEA=1; //开放总中断ET0=1; //允许T0 中断ET1=0; //禁止T1 中断TR0=1; //启动T0while(1);}******************************************************************* void scan_k0(void) //{if (K0==0) //按键按下时I/O 口为0.{if (++n0>=9) //键盘防抖延时2ms*9=18ms{wait=250,n0=0;send(0);}}}******************************************************************* void scan_k1(void) //{if (K1==0) //按键按下时I/O 口为0.{if (++n1>=9) //键盘防抖延时2ms*9=18ms{wait=250,n1=0;send(1);}}}******************************************************************* void scan_k2(void) //{if (K2==0) //按键按下时I/O 口为0.{if (++n2>=9){wait=250,n2=0;send(2);}}}******************************************************************* void scan_k3(void) //{if (K3==0) //按键按下时I/O 口为0.{if (++n3>=9){wait=250,n3=0;send(3);}}}******************************************************************* void scan_k4(void) //{if (K4==0) //按键按下时I/O 口为0.{if (++n4>=9){wait=250,n4=0;send(4);}}}******************************************************************* void scan_k5(void) //{if (K5==0) //按键按下时I/O 口为0.{if (++n5>=9){wait=250,n5=0;send(5);}}}******************************************************************* void scan_k6(void) //{if (K6==0) //按键按下时I/O 口为0.{if (++n6>=9){wait=250,n6=0;send(6);}}}******************************************************************* void scan_k7(void) //{if (K7==0) //按键按下时I/O 口为0.{if (++n7>=9){wait=250,n7=0;send(7);}}}******************************************************************* void scan_k8(void) //{if (K8==0) //按键按下时I/O 口为0.{if (++n8>=9){wait=250,n8=0;send(8);}}}******************************************************************* void scan_k9(void) //{if (K9==0) //按键按下时I/O 口为0.{if (++n9>=9){wait=250,n9=0;send(9);}}}******************************************************************* void scan_k10(void) //{if (K10==0) //按键按下时I/O 口为0.{if (++n10>=9){wait=250,n10=0;send(10);}}}******************************************************************* void send(unsigned char Data){EA=0; //关中断//--下面开始发码头--send_9000();send_4500();//..下面开始发识别码..send_565();//0send_560();send_565();//1send_1685();send_565();//0send_560();send_565();//0send_560();send_565();//1send_1685();send_565();//0send_560();send_565();//1send_1685();send_565();//1send_1685();//...下面开始发数据码和数据反码.send_565();//D0if((Data & 0x01)==1)send_1685();else send_560();send_565();//D1if((Data & 0x02)==2)send_1685();else send_560();send_565();//D2if((Data & 0x04)==4)send_1685();else send_560();send_565();//D3if((Data & 0x08)==8)send_1685();else send_560();//send_565();//D0 反if((Data & 0x01)==1)send_560();else send_1685();send_565();//D1 反if((Data & 0x02)==2)send_560();else send_1685();send_565();//D2 反if((Data & 0x04)==4)send_560();else send_1685();send_565();//D3 反if((Data & 0x08)==8)send_560();else send_1685();send_2000();//结束信号!//++++++++++++++++++++++OUT=0; //停止发送!------------------------------------------------------------------- EA=1; //开中断}******************************************************************* void send_9000(void){TH1=0x0DC;TL1=0x0D8; //9000us,开始发码头TF1=0; //清除溢出标志////++++++++++++++TR1=1; //启动T1OUT=1;while(!TF1);}------------------------------------------------------------------- void send_4500(void){TH1=0x0EE;TL1=0x06C; //4500usTF1=0; //清除溢出标志OUT=0;while(!TF1);}------------------------------------------------------------------- void send_560(void){TH1=0x0FD;TL1=0x0D0; //560usTF1=0; //清除溢出标志OUT=0;while(!TF1);}------------------------------------------------------------------ void send_565(void){TH1=0x0FD;TL1=0x0CB; //565usTF1=0; //清除溢出标志OUT=1;while(!TF1);}------------------------------------------------------------------- void send_1685(void){TH1=0x0F9;TL1=0x06B; //1685usTF1=0; //清除溢出标志OUT=0;while(!TF1);}------------------------------------------------------------------- void send_2000(void){TH1=0x0F8;TL1=0x030; //2000usTF1=0; //清除溢出标志OUT=1;while(!TF1);}################################################################### void timer0_int(void) interrupt 1 //T0 中断子程序 //2ms 计数器;{TL0=0x30;TH0=0x0F8; //重装定时器0 常数;//定时2msif (wait==0) //如果之前没有键按下或者有键按下延时结束.{scan_k0();scan_k1(); //scan_k2(); //scan_k3(); //scan_k4(); //scan_k5(); //scan_k6(); //scan_k7(); //scan_k8(); //scan_k9(); //scan_k10(); //}elsewait--;}END3.2 红外遥控接收的软件程序ORG 0000HAJMP MAIN; 转入主程序ORG 0003H; 外部中断P3.2 脚INT0 入口地址AJMP INT ; 转入外部中断服务子程序(解码程序)MAIN: LCALL YS100ms ;延时100msMOV DPTR,#TABSETB EA ; 打开CPU 总中断请求SETB IT0 ; 设定INT0 的触发方式为脉冲负边沿触发SETB EX0 ; 打开INT0 中断请求MOV TMOD,#01H; T0 方式1,16 位计数器SETB TR0; 启动T0CLR ET0; 禁止T0 中断MOV P0,#0; LED 不显示CLR P2.7;LCALL SPEAK;AJMP $;==================================================================== ;以下为进入P3.2 脚外部中断子程序,也就是解码程序INT: CLR EA ; 暂时关闭CPU 的所有中断请求CLR A;MOV R6,#10; #10H9: ACALL YS861 ; 调用861 微秒延时子程序JB P3.2,EXIT1;延时861 微秒后判断P3.2 脚是否出现高电平如果有就退出解码程序DJNZ R6,H9 ;重复10 次,完成对遥控信号的9000 微秒的初始低电平信号识别。