【51单片机实用设计】红外线遥控器电路图及工作原理
- 格式:doc
- 大小:332.00 KB
- 文档页数:6
红外线光控开关电路图及工作原理特点该装置采用锁相环单音检测电路LM567构成自发射自接收的闭环控制形式。
就是说,把LM567产生的方波电信号调制在红外线光信号上并发射出去,红外线光敏二极管接收该信号,并把其变为电信号,经放大,又被该LM567自身检测.这样,LM567自身的振荡频率与要接收的信号频率永远相同,即使由于某种原因使LM567的振荡频率发生了变化.在一定的频带宽度内,由于LM567只对与自身振荡频率非常接近的信号产生响应,而对其他频率的干扰信号不响应,所以,该装置具有可靠性高、抗干扰性强、安装调试简单的特点。
该装置可应用于自动门、自动水龙头、防盗报警、危险区域误入报警、警戒区域侵入报警等控制。
工作原理电路原理图见图1。
红外线光敏二极管PH检测到由红外线发射二极管LE发出的红外线光信号,并将其转换成电信号。
该信号经由IC1A构成有源高通滤波器,滤除外界低频干扰信号;再经IC1B、IC1C两级固定增益放大器的放大、以及IC1D可调增益限幅放大器的放大,进入锁相环单音检测电路IC2的第③脚。
IC2检测到与自身振荡频率相同的信号后,其第⑧脚输出低电平,使继电器DL吸合,触点S1、S2接通,控制其他设备。
IC2第⑧脚的最大吸入电流为100mA.IC2第⑤脚输出的方波信号,经C8、R16组成的微分电路和N1、N2驱动电路,使红外线发射二极管发出该频率调制的红外线光信号。
微分电路使正方波信号变为低占空比的方波信号。
用低占空比方波调制红外线发射管,可提高红外线发射管的工作效率,即其峰值电流很大,而平均工作电流却很小。
这样,有利于红外线光敏二极管的接收。
电阻R12、R13和电解电容E3是集成电路IC1的中点电位偏置电路,使IC1工作于单电源方式。
该装置有两种工作方式。
一种是:红外线发射二极管和红外线光敏二极管都在同一侧,构成反射检测方式,见图2。
另一种是:红外线发射二极管在一侧,而红外线光敏二极管在另一侧,构成对射式检测方式,见图3.一般情况下,反射式控制距离可达两米,对射式控制距离可达五米.控制距离的远近可由调节电位器W来控制,W的阻值越大,IC1D放大器的增益越大,控制距离越远.反之,控制距离越近.如果给红外线发射二极管或光敏二极管一方加上光学透镜,可增加控制距离;给双方都加上光学透镜,更可增加控制距离。
51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控解码器”。
该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。
发光二极管8个。
价钱不足20元。
电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示解码输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。
晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。
开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms 高电平周期为1.8ms表示“0”,0.9ms低电平2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire学生毕业设计(论文)报告系别:专业:班号:学生姓名:学生学号:设计(论文)题目:基于单片机设计的红外线遥控器指导教师:设计地点:起迄日期:ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire常州信息职业技术学院电子与电气工程学院毕业设计论文毕业设计(论文)任务书专业电子信息工程班级电子085 姓名傅浩一、课题名称:基于单片机设计的红外线遥控器二、主要技术指标:1.遥控距离:0~10m2.额定工作电压:直流3V(普通5号干电池2节);红外光平均辐照度≥40μW/cm2;指向性(辐照度为20μW/cm2)≥30度3.欠压条件下(直流2.4v):红外光平均辐照度≥20μW/cm2,指向性(辐照度为10μW/cm2)≥30度三、工作内容和要求:1.以AT89C2051单片机作为核心,综合应用了单片机中断系统、定时器、计数器等知识,应用红外光的优点2.遥控发射器通过对红外光发射频率的控制来区别不同的操作3.遥控接收器通过对红外光接收频率的识别,判断出控制操作,来完成整个红外遥控发射、接收过程四、主要参考文献:[1] 梅丽凤,王艳秋,张军等. 单片机原理及接口技术,北京:清华大学出版社,2004年.[2] 戴峻峰,付丽辉. 多功能红外线遥控器的设计,传感器世界.2002,8(12):16~18.[3] 李光飞,楼然苗,胡佳文等. 单片机课程设计实例指导,北京:北京航空航天出版社,2004年.[4] 苏长赞. 红外线与超声波遥控,北京:人民邮电出版社.1995年.学生(签名)2010 年 5 月7 日指导教师(签名)2010 年5 月10 日教研室主任(签名)2010 年5 月10 日系主任(签名)2010 年5 月12 日ping primary school fire safety systems to e nha nce fire safety, prote ction of public property and t he life and property safety of teacher s and students, school fire safety into day-to-day ma nagement, is devel opi ng the following fire safety system. 1, strengt hen fire safety educati on of the whole school. Accordi ng to the re quireme nts of the Fire S ervices A ct, so t hat everyone has of keeping fire control safety, pr otecting fire control facilities, fire preve ntion, reports of fire毕业设计(论文)开题报告设计(论文)题目基于单片机设计的红外线遥控器一、选题的背景和意义:随着社会的发展、科技的进步以及人们生活水平的逐步提高,各种方便于生活的遥控系统开始进入了人们的生活。
单片机原理结课项目项目题目基于51单片机的红外线控制系统基于51单片机的红外线控制系统一、概述:红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。
由于红外线遥控不具有像无线电遥控那样穿过障碍物去控制被控对象的能力,所以在设计红外线遥控器时,不必要像无线电遥控器那样,每套( 发射器和接收器) 要有不同的遥控频率或编码( 否则,就会隔墙控制或干扰邻居的家用电器) ,所以同类产品的红外线遥控器,可以有相同的遥控频率或编码,而不会出现遥控信号“串门”的情况。
这对于大批量生产以及在家用电器上普及红外线遥控提供了极大的方面。
由于红外线为不可见光,因此对环境影响很小,再由红外光波动波长远小于无线电波的波长,所以红外线遥控不会影响其他家用电器,也不会影响临近的无线电设备。
基于51单片机的红外线控制系统。
要求通过单片机发送和接红外信号程序,根据接收的信号,执行有关动作的系统,能够实现近距离的无线通。
二、硬件设计1. 系统框图2. 电路原理图电路由五个模块构成(最小系统模块、红外接收模块、数码管显示模块、编程下载模块、电源模块)1) 最小系统STC12C5410AD 单片机红外接收头红外遥控器复位电路时钟振荡电路数码光显示最小系统由stc12c5410ad单片机,按键复位电路,时钟振荡电路构成。
a.电源电源采用5V直流电供电。
b.时钟、复位电路本电路选用12MHz晶振。
2)红外接收模块3)显示模块三、软件设计1.红外编解码原理红外线发射编码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制‘0’;以脉宽为0.565ms、间隔1.658ms、周期为2.25ms的组合表示二进制‘1’;红外接收头接收的信号和发射编码相反;一组编码由一个引导码,四个字节数据组成;引导码由9ms的高电位和4.5ms的地电位组成。
精心整理红外通信原理红外遥控有发送和接收两个组成部分。
发送端采用单片机将待发送的二进制信号编码调制为一系列的脉冲串信号,通过红外发射管发射红外信号。
红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。
为了减少干扰,采用的是价格便宜性能可靠的一体化红外接收头(HS0038,它接收红外信号频率为38kHz,(2)PPM编码这种遥控编码具有以下特征:遥控编码脉冲由前导码、16位地址码(8位地址码、8位地址码的反码)和16位操作码(8位操作码、8位操作码的反码)组成。
前导码:是一个遥控码的起始部分,由一个9ms的高电平(起始码)和一个4.5ms的低电平(结果码)组成,作为接受数据的准备脉冲。
16位地址码:能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
16位操作码:用来执行不同的操作。
采用脉宽调制的串行码,以脉宽为0.56ms、间隔0.56ms、周期为1.12ms的组合表示二进制的“0”;以脉宽为1.68ms、间隔0.56ms、周期为2.24ms的组合表示二进制的“1”。
???{???}?}}一串完整的编码如下图所示前导码地址码地址反码操作码操作反码2.红外接收部分:红外接收完成对红外信号的接收、放大、检波、整形,并解调出遥控编码脉冲。
为形得到HS0038#defineuintunsignedintucharram[4]={0,0,0,0};//存放接受到的4个数据地址码16位+按键码8位+按键码取反的8位voiddelaytime(uinttime)//延迟90uS{uchara,b;for(a=time;a>0;a--){for(b=40;b>0;b--);}}voidrem()interrupt0//中断函数{ucharramc=0;//定义接收了4个字节的变量ucharcount=0;//定义现在接收第几位变量{电平return;//}32位中//第一位数据的0.56MS开始脉冲for(ramc=0;ramc<4;ramc++)//循环4次接收4个字节{for(count=0;count<8;count++)//循环8次接收8位(一个字节){while(prem!=1);//开始判断现在接收到的数据是0或者1,首先在这行本句话时,//保已经进入数据的0.56MS低电平阶段//等待本次接受数据的高电平的到来。
基于51单片机的红外遥控红外遥控是无线遥控的一种方式,本文讲述的红外遥控,采用STC89C52单片机,1838红外接收头和38k红外遥控器。
1838红外接收头:红外遥控器:原理:红外接收的原理我不赘述,百度文库上不少,我推荐个网址,这篇文章写得比较清楚,也比较全面,http://wenku.baidu.com/view/c353e8360b4c2e3f57276349.html 我主要讲下程序的具体意思,在了解原理的基础上,我们知道,当我们在遥控器上每按下一个键,遥控器上的红外发射头都会发出一个32位的编码(32位编码分成4组8位二进制编码,前16位为用户码和用户反码,后16位为数据码和数据反码,用户码表示遥控器类型,数据码表示按键编码),不同的键对应不同的编码,红外接收头接收到这个编码后,发送给单片机,再进行相关操作。
源程序1:(这个程序的功能是将用户码和用户反码,数据码和数据反码显示在1602液晶上,因为遥控器买回来是不会说明按键对应什么码值,所以先自己测试,确定每个按键的码值)#include<reg52.h>#include<stdio.h>#include<intrins.h>#defineuint unsigned int#define uchar unsigned char#define _Nop() _nop_()#defineTURE 1#defineFALSE 0/*端口定义*/sbit lcd_rs_port=P3^5;/*定义LCD控制端口*/sbit lcd_rw_port = P3^6;sbit lcd_en_port= P3^4;#define lcd_data_portP0///////////////////////////////////void delay1(void)//关闭数码管延时程序{ﻩint k;ﻩfor (k=0; k<1000;k++);}////////////////////////////////////uchar codeline0[16]={"user:"};uchar codeline1[16]={"data:"};uchar code lcd_mun_to_char[16]={"0123456789ABCDEF"};unsigned charirtime;//红外用全局变量bitirpro_ok,irok;unsigned charIRcord[4];//用来存放用户码、用户反码、数据码、数据反码unsigned char irdata[33];//用来存放32位码值void ShowString(unsigned charline,char *ptr);//////////////////////////////////////////////void Delay(unsigned char mS);void Ir_work(void);voidIrcordpro(void);void tim0_isr(void)interrupt 1using 1//定时器0中断服务函数{ﻩirtime++;}void ex0_isr (void) interrupt0using0//外部中断0服务函数{ﻩstatic unsigned char i;static bitstartflag;ﻩif(startflag){ﻩif(irtime<63&&irtime>=33)//引导码TC9012的头码i=0;irdata[i]=irtime;irtime=0;i++;if(i==33){ﻩﻩirok=1;ﻩﻩi=0;ﻩﻩ}ﻩ}ﻩelse{ﻩirtime=0;startflag=1;ﻩﻩ}}voidTIM0init(void)//定时器0初始化{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值ﻩTH0=0x00;//reload valueﻩTL0=0x00;//initial valueET0=1;//开中断ﻩTR0=1;}void EX0init(void){ﻩIT0= 1; // Configure interrupt 0for falling edge on/INT0 (P3.2)EX0 =1; // EnableEX0 InterruptﻩEA=1;}void Ircordpro(void)//红外码值处理函数(关键函数){ﻩunsignedchari, j, k=1;unsignedchar cord,value;for(i=0;i<4;i++){//处理4个字节for(j=1;j<=8;j++){//处理1个字节8位ﻩﻩﻩcord=irdata[k];ﻩﻩvalue=value>>1;ﻩif(cord>7)value=value|0x80; //大于某值为1k++;}IRcord[i]=value;ﻩvalue=0;ﻩ}irpro_ok=1;//处理完毕标志位置1}///////////////////////////////////////////void lcd_delay(ucharms)/*LCD1602 延时*/{ucharj;while(ms--){for(j=0;j<250;j++){;}}}//////////////////////////////////////////////void lcd_busy_wait() /*LCD1602 忙等待*/{lcd_rs_port= 0;lcd_rw_port= 1;lcd_en_port= 1;lcd_data_port= 0xff;_Nop();_Nop();ﻩ_Nop();_Nop();while(lcd_data_port&0x80);lcd_en_port= 0;}///////////////////////////////////////////////void lcd_command_write(ucharcommand) /*LCD1602命令字写入*/ {lcd_busy_wait();lcd_rs_port=0;lcd_rw_port =0;lcd_en_port=0;lcd_data_port =command;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 1;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port= 0;}/////////////////////////////////////////void lcd_system_reset()/*LCD1602初始化*/{lcd_delay(20);lcd_command_write(0x38);lcd_delay(100);lcd_command_write(0x38);lcd_delay(50);lcd_command_write(0x38);lcd_delay(10);lcd_command_write(0x08);lcd_command_write(0x01);lcd_command_write(0x06);lcd_command_write(0x0c);}//////////////////////////////////////////////////voidlcd_char_write(ucharx_pos,y_pos,lcd_dat)/*LCD1602 字符写入*/{x_pos &=0x0f;/*X位置范围0~15 */y_pos&=0x01; /* Y位置范围0~ 1 */if(y_pos==1) x_pos += 0x40;x_pos+= 0x80;lcd_command_write(x_pos);lcd_busy_wait();lcd_rs_port =1;lcd_rw_port =0;lcd_en_port=0;lcd_data_port=lcd_dat;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port = 1;_Nop();_Nop();_Nop();_Nop();_Nop();_Nop();lcd_en_port =0;}void main(void){uchar i;ﻩlcd_system_reset();/*初始化LCD1602 */lcd_data_port = 0xff;for(i=0;i<16;i++) lcd_char_write(i,0,line0[i]);for(i=0;i<16;i++) lcd_char_write(i,1,line1[i]);EX0init();//Enable Global Interrupt FlagﻩTIM0init();while(1){//主循环if(irok){ﻩIrcordpro();irok=0;ﻩ}if(irpro_ok){ /*遥控成功接收*/lcd_char_write(8,0,lcd_mun_to_char[IRcord[0]/0x10]);ﻩﻩlcd_char_write(9,0,lcd_mun_to_char[IRcord[0]%0x10]);ﻩlcd_char_write(11,0,lcd_mun_to_char[IRcord[1]/0x10]);ﻩﻩﻩlcd_char_write(12,0,lcd_mun_to_char[IRcord[1]%0x10]);ﻩﻩlcd_char_write(8,1,lcd_mun_to_char[IRcord[2]/0x10]);lcd_char_write(9,1,lcd_mun_to_char[IRcord[2]%0x10]);ﻩﻩlcd_char_write(11,1,lcd_mun_to_char[IRcord[3]/0x10]);ﻩlcd_char_write(12,1,lcd_mun_to_char[IRcord[3]%0x10]);ﻩ}//将码值显示在液晶上}}源程序2:(在知道了按键编码的基础上,我们便可以加入判断,判断哪个键被按下,进而执行相关操作)我只修改main函数,其他与源程序1相同sbit led1=P1^0;sbitled2=P1^1;sbit led3=P1^2;sbit led4=P1^3;sbitled5=P1^4;//发光二极管控制端定义voidmain(void){ﻩuchari;ﻩlcd_system_reset(); /* 初始化LCD1602*/lcd_data_port =0xff;for(i=0;i<16;i++) lcd_char_write(i,0,line0[i]);ﻩfor(i=0;i<16;i++)lcd_char_write(i,1,line1[i]);ﻩEX0init(); // EnableGlobalInterrupt FlagﻩTIM0init();while(1){//主循环if(irok){ﻩIrcordpro();irok=0;ﻩﻩ}ﻩif(irpro_ok){ /*遥控成功接收*/ﻩswitch(IRcord[2])//为什么判断IRcord[2],因为这个里面存放的是数据码ﻩﻩ{ﻩcase0x0c: led1=0;//按0键,灯1亮ﻩﻩﻩﻩbreak;ﻩﻩcase 0x18:led2=0;//按1键,灯2亮ﻩﻩﻩﻩbreak;ﻩﻩcase 0x5e: led3=0;//按2键,灯3亮ﻩﻩﻩbreak;ﻩﻩﻩcase 0x08: led4=0;//按3键,灯4亮ﻩﻩﻩﻩbreak;ﻩﻩcase 0x1c:led5=0;//按4键,灯5亮ﻩﻩﻩﻩﻩbreak;ﻩ}ﻩ}}}附连接图。
单片机红外遥控器原理单片机红外遥控器原理红外遥控技术是一种通过红外线信号传输控制信息的技术。
它已经广泛应用于家电、汽车、医疗设备、通讯设备等各个领域。
单片机红外遥控器是一种使用单片机作为控制核心的红外遥控器,它利用红外线作为载体,通过调制、解调技术实现遥控信号的传输和接收。
下面我们来详细了解单片机红外遥控器的工作原理。
1. 红外传感器红外遥控器的核心组件是红外传感器,它是将红外线转换成电信号的装置。
当我们按下遥控器上的按钮时,红外传感器会接收到遥控器发出的红外信号,然后将其转换成电信号并传输给单片机进行处理。
2. 调制和解调技术在红外遥控器中,通常会采用调制技术和解调技术来保证数据的传输和接收的可靠性。
调制技术是将数字信号转换成模拟信号,然后通过载波信号进行传输。
而解调技术则是将接收到的模拟信号转换成数字信号。
这样做的好处是可以减小干扰,提高传输的可靠性。
3. 编码器和解码器在单片机红外遥控器中,通常会使用编码器和解码器来处理遥控信号。
编码器是将按键的信号转换成对应的数字编码,然后传输给红外传感器进行发送。
解码器则是接收红外传感器传来的信号,解析成对应的按键信号,然后传输给单片机进行处理。
这样做可以有效地避免信号的混淆和干扰。
4. 单片机处理单片机是整个红外遥控器系统的控制核心,它可以通过编程来实现对遥控信号的处理和解析。
当单片机接收到红外传感器传来的信号后,它会根据预先设定的编码和解码规则来进行信号的解析和处理,然后执行对应的操作。
例如,控制家电设备的开关、调节音量等。
5. 发射器和接收器单片机红外遥控器中包含了两个主要部分:发射器和接收器。
发射器用于发送红外信号,它通过编码器将按键信号转换成对应的红外编码,然后发送出去。
接收器则用于接收外部红外信号,通过解码器将其解析成对应的按键信号,然后传输给单片机。
这样设计可以提高遥控器的使用距离和灵敏度。
综上所述,单片机红外遥控器是一种利用红外线进行信号传输的遥控器。
基于51单片机的红外遥控器设计近年来,随着智能家居的兴起,红外遥控器在我们的生活中扮演着越来越重要的角色。
本文将基于51单片机,设计一个简单的红外遥控器。
首先,我们需要了解红外遥控器的工作原理。
红外遥控器使用红外线来传输指令。
当用户按下遥控器上的按键时,红外发射器发射一个特定的红外信号。
接收器接收到这个信号后,将其转换成电信号,并将其发送到电子设备中,实现对设备的控制。
接下来,我们需要选择合适的红外发射器和接收器。
常见的红外发射器有红外LED,常见的红外接收器有红外接收头。
在选择红外发射器和接收器时,要根据其工作频率、传输距离、灵敏度等因素进行选择。
在本设计中,我们选择了工作频率为38kHz的红外发射器和接收器。
接下来,我们需要设计电路,并进行程序开发。
首先,我们需要连接红外发射器和接收器到51单片机上。
红外发射器的一个引脚连接到51单片机的I/O口,另一个引脚连接到正极电源,第三个引脚连接到电源的接地端。
红外接收器的输出引脚连接到51单片机的I/O口,电源和接地端分别连接到正负电源。
接下来,我们需要编写程序。
首先,我们需要设置51单片机的I/O 口为输入或输出。
然后,我们需要编写程序来发送红外信号。
我们可以使用PWM技术来模拟红外信号的脉冲。
当用户按下遥控器上的按键时,我们可以发送一个特定的脉冲序列,来控制电子设备。
同时,我们还需要编写程序来接收红外信号。
当红外接收器接收到红外信号时,会输出一个特定的电平信号。
我们可以使用外部中断来检测这个信号,并进行相应的处理。
在程序开发过程中,我们需要注意红外信号的协议。
常见的红外信号协议有NEC、SONY等。
我们需要根据所使用的红外接收器的协议来编写相应的程序。
最后,我们需要测试代码的功能和稳定性。
可以通过连接电子设备,按下遥控器上的按键,来测试红外信号的发送和接收功能。
如果一切正常,我们的红外遥控器设计就完成了。
总结起来,基于51单片机的红外遥控器设计是一个简单而有趣的项目。
51单片机解码红外遥控器原理电视遥控器使用的是专用集成发射芯片来实现遥控码的发射,如东芝TC9012,飞利浦SAA3010T等,通常彩电遥控信号的发射,就是将某个按键所对应的控制指令和系统码(由0和1组成的序列),调制在38KHz的载波上,然后经放大、驱动红外发射管将信号发射出去。
不同公司的遥控芯片,采用的遥控码格式也不一样。
较普遍的有两种,一种是NEC标准,一种是PHILIPS 标准。
NEC标准:遥控载波的频率为38KHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,如果键按下超过108ms仍未松开,接下来发射的代码(连发代码)将仅由起始码(9ms)和结束码(2.5ms)组成。
一个完整的全码=引导码+用户码+用户码+数据码+数据反码。
其中,引导码高电平4.5ms,低电平4.5ms;系统码8位,数据码8位,共32位;其中前16 位为用户识别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。
后16 位为8 位的操作码和8位的操作反码,用于核对数据是否接收准确。
收端根据数据码做出应该执行什么动作的判断。
连发代码是在持续按键时发送的码。
它告知接收端,某键是在被连续地按着。
NEC标准下的发射码表示发射数据时0用“0.56ms高电平+0.565ms低电平=1.125ms”表示,数据1用“高电平0.56ms +低电平1.69ms=2.25ms”表示即发射码“0”表示发射38khz的红外线0.56ms,停止发射0.565ms,发射码“1”表示发射38khz 的红外线0.56ms,停止发射1.69ms需要注意的是:当一体化接收头收到38kHz 红外信号时,输出端输出低电平,否则为高电平。
所以一体化接收头输了的波形是与发射波形是反向的,如图PHILIPS标准:载波频率为38KHz;没有简码,点按键时,控制码在1和0之间切换,若持续按键,则控制码不变。
一个全码=起始码‘11’+控制码+用户码+用户码,如图所示。
基于51单片机的红外遥控本讲内容:介绍红外遥控的知识,通过例程展示红外遥控程序的编写方法。
红外线简介:在光谱中波长自760nm至400um的电磁波称为红外线,它是一种不可见光。
目前几乎所有的视频和音频设备都可以通过红外遥控的方式进行遥控,比如电视机、空调、影碟机等,都可以见到红外遥控的影子。
这种技术应用广泛,相应的应用器件都十分廉价,因此红外遥控是我们日常设备控制的理想方式。
接收头输出的波形正好和遥控芯片输出的相反。
在这里红外通信采用NEC协议,它的特征如下:信号调制红外遥控信号接收管接口电路:红外信号发射电路 红外信号接收电路例程:红外遥控信号发射:/*****************红外通信——发射*******************单片机型号:STC89C52RC*开发环境:KEIL*名称:红外通信发射*功能:按下按键S4,S5,S6,S8,S9,S10,S11,S13,S14发射对应键值,可以与红外通信——接收程序配套使用***************************************************/#include <REG51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define SBM 0x80 //识别码#define m9 (65536-8294) //约9mS#define m4_5 (65536-4147) //约4.5mS#define m1_6 (65536-1521) //约1.65mS#define m_65 (65536-599) //约0.65mS#define m_56 (65536-516) //约0.56mS#define m40 (65536-36864) //约40mS#define m56 (65536-51610) //56mS#define m2_25 (65536-2074) //约2.25mSconst uchar TabHL1[9]={0x0c,0x18,0x5e,0x08,0x1c,0x5a,0x42,0x52,0x4a};sbit IR=P1^5; //定义发射引脚sbit BEEP=P2^3;void keyscan();void ZZ(uchar x);void Z0(uchar temp);void TT0(bit BT,uint x);void delay(int In,int Out);/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:主函数┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void main(void){TMOD=0x01; //T0 16位工作方式IR=1; //发射端口常态为高电平while(1){keyscan();}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:发送主程序┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void ZZ(uchar x){TT0(1,m9); //高电平9mSTT0(0,m4_5); //低电平4.5mS/*┈发送4帧数据┈*/Z0(SBM);Z0(~SBM);Z0(x);Z0(~x);/*┈┈结束码┈┈*/TT0(1,m_65);TT0(0,m40);}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:单帧发送程序入口参数:1帧数据┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/ void Z0(uchar temp){uchar v;for (v=0;v<8;v++) //循环8次移位{TT0(1,m_65); //高电平0.65mSif(temp&0x01) TT0(0,m1_6); //发送最低位else TT0(0,m_56);temp >>= 1; //右移一位}}/*┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈函数功能:38KHz脉冲发射 + 延时程序入口参数:(是否发射脉冲,延时约 x (uS))┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈/void TT0(bit BT,uint x){TH0=x>>8; //输入T0初始值TL0=x;TF0=0; //清0TR0=1; //启动定时器0if(BT==0)while(!TF0);//BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时;else while(1) //38KHz脉冲,占空比5:26{IR = 0;if(TF0)break;if(TF0)break;IR=1;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;if(TF0)break;}TR0=0; //关闭定时器0TF0=0; //标志位溢出则清0IR =1; //脉冲停止后,发射端口常态为高电平}void keyscan() //按键扫描函数{uchar buffer;/***************************************************/P3=0xfe; //扫描S3,S4,S5,S6;buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xee:{;}break;case 0xde:{ZZ(TabHL1[0]);}break;case 0xbe:{ZZ(TabHL1[1]);}break;case 0x7e:{ZZ(TabHL1[2]);}break;}while(buffer != 0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfd; //扫描S8,S9,S10,S11buffer=P3;buffer=buffer & 0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xed:{ZZ(TabHL1[3]);}break;case 0xdd:{ZZ(TabHL1[4]);}break;case 0xbd:{ZZ(TabHL1[5]);}break;case 0x7d:{ZZ(TabHL1[6]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}/****************************************************/ P3=0xfb; //扫描S13,S14,S15,S16buffer=P3;buffer=buffer&0xf0;if(buffer!=0xf0){delay(5,10);if(buffer!=0xf0){buffer=P3;switch(buffer){case 0xeb:{ZZ(TabHL1[7]);}break;case 0xdb:{ZZ(TabHL1[8]);}break;}while(buffer!=0xf0){buffer=P3;buffer=buffer&0xf0;BEEP=0;}BEEP=1;}}}void delay(int In,int Out) //定义延时函数{int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}红外遥控信号接收:/*****************红外通信--接收*******************单片机型号:STC89C52RC*开发环境:KEIL*功能:在液晶LCD1602上显示接收到的数值*************************************************/#include<reg52.h>#define LCD_Data P0#define Busy 0x80sbit IR=P3^2;sbit LCD_RS=P1^0;sbit LCD_RW=P1^1;sbit LCD_E=P2^5;void TIM0init(void);void EX0init(void);void SYSinit(void);void delay(int In,int Out);void Delay5Ms(void);void Ir_work(void);void Ircordpro(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData);void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData); void Info_display(void);bit IRpro_ok;bit IR_ok;unsigned char IRcord[4];unsigned char IRdata[33];unsigned char codedofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};unsigned char irtime;unsigned char speed_num=0;unsigned char codemb_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};unsigned char code welcome[]={"YOU ARE WELCOME"};unsigned char code ir_reve[]={"IR_RECEIVE: "};/*******************5ms延时函数*********************/void Delay5Ms(void){unsigned int TempCyc=3552;while(TempCyc--);}void delay(int In,int Out){int i,j;for(i=0;i<In;i++){for(j=0;j<Out;j++){;}}}/***********************写数据函数***********************/ void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD();LCD_Data=WDLCD;LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/**********************写指令函数************************/ void WriteCommandLCD(unsigned char WCLCD,BuysC){if(BuysC)ReadStatusLCD();LCD_Data=WCLCD;LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=0;LCD_E=1;}/***********************读状态函数************************/ unsigned char ReadStatusLCD(void){LCD_Data=0xFF;LCD_RS=0;LCD_RW=1;LCD_E=0;LCD_E=0;LCD_E=1;while(LCD_Data & Busy);return(LCD_Data);}/************************LCD初始化************************/ void LCDInit(void){LCD_Data=0;WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1);WriteCommandLCD(0x08,1);WriteCommandLCD(0x01,1);WriteCommandLCD(0x06,1);WriteCommandLCD(0x0C,1);}/*******************按指定位置显示一个字符******************/void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData){Y&=0x1;X&=0xF;if(Y)X|=0x40;X|=0x80;WriteCommandLCD(X,0);WriteDataLCD(DData);}/*******************按指定位置显示一串字符******************/void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData) {unsigned char ListLength;ListLength=0;Y&=0x1;X&=0xF;while(DData[ListLength]>=0x20){if(X<=0xF){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}}/***********************定时器0初始化***********************/void TIM0init(void){TMOD=0x02;TH0=0x00;TL0=0x00;ET0=1;TR0=1;}/**********************外部中断0初始化**********************/void EX0init(void){IT0=1;EX0=1;EA=1;}/*************************系统初始化*************************/void SYSinit(void){TIM0init();EX0init();LCDInit();}/********************红外信号接收相关函数********************/void Ir_work(void){switch(IRcord[2]){case 0x0C:{DisplayOneChar(12,1,0x31);}break;case 0x18:{DisplayOneChar(12,1,0x32);}break;case 0x5e:{DisplayOneChar(12,1,0x33);}break;case 0x08:{DisplayOneChar(12,1,0x34);}break;case 0x1c:{DisplayOneChar(12,1,0x35);}break;case 0x5a:{DisplayOneChar(12,1,0x36);}break;case 0x42:{DisplayOneChar(12,1,0x37);}break;case 0x52:{DisplayOneChar(12,1,0x38);}break;case 0x4a:{DisplayOneChar(12,1,0x39);}break;default:break;}}void Ircordpro(void){unsigned char i,j,k;unsigned char cord,value;k=1;for(i=0;i<4;i++){for(j=1;j<=8;j++){cord=IRdata[k];if(cord>7)value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}IRpro_ok=1;}/********************红外信号接收相关函数********************/ void main(void){SYSinit();delay(5,100);DisplayListChar(0,0,welcome);DisplayListChar(0,1,ir_reve);while(1){if(IR_ok){Ircordpro();IR_ok=0;}if(IRpro_ok){Ir_work();}}}/********************定时器0中断处理函数********************/ void tim0_isr (void) interrupt 1 using 1{irtime++;}/*******************外部中断0中断处理函数*******************/ void EX0_ISR (void) interrupt 0{static unsigned char i;static bit startflag;if(startflag){if(irtime<63&&irtime>=33)i=0;IRdata[i]=irtime;irtime=0;i++;if(i==33){IR_ok=1;i=0;}}else{irtime=0;startflag=1;}}。
单片机的红外遥控器解码原理与实现红外遥控器是我们日常生活中常见的电子设备,它通过使用红外线信号与接收器进行通信。
而在这个过程中,单片机起到了解码的重要作用。
本文将介绍单片机解码红外遥控器的原理以及实现方法。
一、红外遥控器的工作原理红外遥控器是一种使用红外线进行通信的设备,它主要由发送器和接收器两部分组成。
发送器将指令数据转换为红外脉冲信号并发送出去,接收器通过接收红外线信号并将其转换为电信号,进而解码为可识别的指令。
而单片机则负责接收并解码红外信号,将其转化为具体的操作。
二、单片机解码红外信号的原理单片机解码红外信号主要分为两个步骤:红外信号的接收和信号的解码处理。
1. 红外信号的接收单片机通过外部的红外接收器接收红外信号。
红外接收器可以通过外部电路将接收到的红外信号转换为电压信号,然后通过单片机的IO 口输入。
2. 信号的解码处理接收到的红外信号经过IO口输入后,单片机需要对信号进行解码处理。
解码的过程涉及到红外信号的标准化和解析。
对于常见的红外遥控器协议,单片机需要能够识别其编码方式,确定其协议格式。
这些协议通常包含了引导码、地址码和指令码等信息。
在解析红外信号时,单片机首先需要识别引导码。
引导码是红外信号的起始标志,通常由高、低电平组成,表示编码的开始。
单片机通过判断引导码的时间长度来确定信号的开始。
接下来,单片机需要识别地址码和指令码。
地址码是用来区分不同的红外遥控器设备,指令码则表示具体的操作指令。
单片机通过判断地址码和指令码的高、低电平时间长度来确定具体的操作。
三、单片机解码红外信号的实现方法单片机解码红外信号有多种实现方法,以下是一种简单的实现示例。
首先,需要连接红外接收器到单片机的IO口,将接收到的信号输入到单片机。
接收到的信号可以通过外部中断的方式触发单片机的中断服务程序。
然后,在中断服务程序中,单片机需要根据红外协议的规则,判断引导码、地址码和指令码的时间长度。
利用计时器或延时函数可以实现对信号时间的测量。
【实用设计】51单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控*器”。
该小制作所需要的元件很少:单片机TA89C2051一只,RS232接口电平与TTL电平转换心片MAX232CPE 一只,红外接收管一只,晶振11.0592MHz,电解电容10uF4只,10uF 一只,电阻1K1个,300欧姆左右1个,瓷片电容30P2个。
发光二极管8个。
价钱不足20元。
电路图及原理:主控制单元是单片机AT89C2051,中断口INT0跟红外接受管U1相连,接收红外信号的脉冲,8个发光二极管作为显示*输出(也可以用来扩展接其他控制电路),U3是跟电脑串行口RS232相连时的电平转换心片,9、10脚分别与单片机的1、2脚相连,(1脚为串行接收,2脚为串行发送),MAX232CPE的7、8脚分别接电脑串行口的2(接收)脚、3(发送脚)。
晶振采用11.0592MHz,这样才能使得通讯的波特率达到9600b/s,电脑一般默认值是9600b/s、8位数据位、1位停止位、无校验位。
电路就这么简单了,现在分析具体的编程过程吧。
如图所示,panasonic遥控器的波形是这样的(经过反复测试的结果)。
/sch/rc/0080743.html开始位是以3.6ms低电平然后是3.6ms高电平,然后数据表示形式是0.9ms低电平0.9ms高电平周期为1.8ms表示“0”,0.9ms低电平 2.4ms高电平周期为3.3ms表示“1”,编写程序时,以大于3.4ms小于3.8ms高电平为起始位,以大于2.2ms小于2.7ms高电平表示“1”,大于0.84ms小于1.11ms高电平表示“0”。
因此,我们主要用单片机测量高电平的长短来确定是“1”还是“0”即可。
定时器0的工作方式设置为方式1:mov tmod,#09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。
比如:jnb p3.2,$jb p3.2,$clr tr0这3条指令就可以测量一个高电平,接下来读取计数值TH0,TL0就可以分辨是起始位还是“1”或“0”。
在确定码表之前,您可以使用P0口的8个发光二极管来显示编码,16位编码分两次显示:mov p0,keydataacall delay_1s ;//1ms延时子程序mov p0,keydata+1ljmp main根据P0相继的两次显示的编码,记录每个按键的编码,形成编码表,即遥控器编码的*完毕。
码表确定之后,以后接收到遥控器的编码之后,就与码表比较,找到匹配的码项,并把该码项对应的顺序号输出到P0口,同时也把顺序号向串行口输出到电脑,电脑接收该数据后由串口软件决定如何处理。
程序不长,下面是完整的程序和注释:(先看流程图)、keydata equ 30h ;//该地址和31H地址用来存放遥控器按键编码。
org 00hmain:mov keydata,#0 ;// 清零mov tmod ,#09h ;//设置定时0方式1,GATE=1mov r7,#0 ;//计数器,用来计数是否满8位mov r6,#0 ;//计数器,用来计数是否满2字节(解16位编码)jb p3.2,$ ;//是否为低电平again: ;//如果为低,继续往下面执行mov tl0,#0 ;//清零TL0mov th0,#0 ;//清零TH0setb tr0 ;//开启定时器0jnb p3.2,$ ;//等待高电平到来jb p3.2,$ ;//高电平到来,此时开始计数clr tr0 ;//高电平结束,停止计数mov a,th0 ;//读取th0 值,TL0忽略不计subb a,#12 ;//jc again ;//th0<12则转,即小于3.4ms,你可以算一下这个时间mov a,#14 ;//clr c ;//subb a,th0 ;//和14比较,如果TH0>14则大于3.8msjc again ;//大于3.8ms,从新再检测nextbit: ;//起始位找到了,然后下一位mov tl0,#0 ;//mov th0,#0 ;//setb tr0 ;//启动定时器jnb p3.2,$ ;//等待高电平jb p3.2,$ ;//高电平到来,此时开始计数clr tr0 ;//高电平结束,停止计数mov a,th0 ;//读取计数值,TL0忽略不计clr c ;//subb a,#8 ;//th0和8比较jc next ;;;;//若<2.2ms则转,再判断是否大于0.84msmov a,#10 ;//再跟10比较clr c ;//subb a,th0 ;//jc again ;;;;;;;//若>2.7ms,则放弃,从新检测mov a,keydata ;// 符合大于2.2ms 小于2.7ms,即为“1”setb c ;//C = 1rrc a ;//把1移位进Amov keydata,a ;//保存inc r7 ;//计数器加1cjne r7,#8,nextbit ;//是否满8位inc r6 ;//计数加1cjne r6,#2,last8 ;//是否满两字节sjmp seach ;//不满两字节,再新采集last8: ;//满1字节,再接下来第二字节mov keydata+1,a ;//把第一字节编码数据保存到31h里mov r7,#0 ;//计数器R7清零sjmp nextbit ;//继续采集数据next: ;//小于2.2ms时转到这里mov a,th0 ;//读取计数值TH0swap a ;//高4位与低4位对换mov r1,a ;//保存到R1anl tl0,#0f0h ;//取TL0高4位,低4位忽略不计mov a,tl0 ;//clr c ;//rrc a ;//rrc a ;//rrc a ;//add a,r1 ;//mov r1,a ;//subb a,#30 ;//以上几行是把TH0的低4位和TL0的高4位合并为1字节作为计数值jc nextbit ; //判断是否<0.84ms,是则放弃,继续采集mov a,r1 ;//否clr c ;//cjne a,#64,continue ;//跟64比较continue: ;//jnc nextbit ; //a>64表示采样值>1.11ms 放弃mov a,keydata ;//否则,符合位“0”clr c ;//C = 0rrc a ;//把零右移进Amov keydata,a ;//保存inc r7 ;//计数器加1cjne r7,#8,nextbit ;//是否满8位inc r6 ;//计数器加1cjne r6,#2,last_8 ;//是第一字节已经满sjmp seach ;//last_8: ;//如果为第二字节mov keydata+1,a ;//则保存第一字节到31hmov r7,#0 ;//清零R7sjmp nextbit ;//seach: ;//匹配按键编码mov r0,#-2 ;//按键编码字节个数计数器mov r1,#-1 ;//按键顺序计数器seach1: ;//inc r0 ;//seach2: ;//inc r0 ;//inc r1 ;//cjne r1,#29,compare ;//是否R1=29sjmp exit0 ;//compare: ;//开始匹配mov a,r0 ;//mov dptr,#keycode ;//地址指针指向码表首址movc a,@a+dptr ;//取码cjne a,keydata,seach1 ;//比较inc r0 ;//R0+1,再比较下一字节(每个按键编码为2字节)mov a,r0 ;//;mov dptr,#keycode ;//movc a,@a+dptr ;//比较cjne a,keydata+1,seach2 ;//是否匹配,不匹配则继续跟下一字节比较mov p1,r1 ;//如果匹配,把按键顺序号输出到p1send: ;//mov tmod,#20h ; //设置timer 1,mode 2mov tl1,#0fdh ;//设置定时器初值mov th1,#0fdh ;//mov scon,#01010000b;//以上设置,即设置串口波特率系数为:9600,8,1,0setb tr1 ;//启动定时器1loop_s: ;//mov sbuf,r1 ;//把R1(按键顺序号)输出到串口jnb ti,$ ;//等待是否发送完毕clr ti ;//发送完毕,清零TIexit0: ;//ljmp main ;//循环keycode: ;//每两字节代表一个按键的编码db 11111000b,00000000b, 11111100b,00000000b, 11111001b,11000000bdb 11111100b,11000000b, 11111010b,00000000b, 11111010b,00100000bdb 11111010b,01000000b, 11111010b,01100000b, 11111010b,10000000bdb 11111010b,10100000b, 11111010b,11000000b, 11111010b,11100000bdb 11111011b,00000000b, 11111011b,00100000b, 11111011b,01000000bdb 11111011b,01100000b, 11111111b,01100000b, 11111111b,10100000bdb 10001100b,10001110b, 10001101b,11101110b, 10001100b,10101110bdb 10001101b,11001110b, 11111000b,11100000b, 11111100b,10000000bdb 11111100b,01000000b, 11111001b,10100000b, 11111100b,10100000bdb 11111100b,01100000bend---------------------------------------------------------------------------------各种遥控器编码不同,如果你采用的是其他遥控器,修改几个参数即可(当然按键的编码表肯定不同了),即计数器的值不同,不过有的遥控器有机器码(机器码每个按键都是一样的),此时可以跳过机器码的采集。