【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单片机设计的红外线遥控器电路图及工作原理你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“红外遥控*器”。
该小制作所需要的元件很少:单片机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---------------------------------------------------------------------------------各种遥控器编码不同,如果你采用的是其他遥控器,修改几个参数即可(当然按键的编码表肯定不同了),即计数器的值不同,不过有的遥控器有机器码(机器码每个按键都是一样的),此时可以跳过机器码的采集。