单片机实现红外接收解码

合集下载

51单片机红外解码资料+源代码

51单片机红外解码资料+源代码

位地 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H 址
源代码如下: #include<reg52.h> #define uchar unsigned char #define uint unsigned int sbit dula=P2^6; sbit wela=P2^7;
uchar irtime; //红外时间 uchar startflag; //启动接收 uchar irdata[33]; uchar bitnum; uchar irreceiveok; //红外接收完毕 uchar ircode[4]; uchar irprosok; uchar disp[8]; uchar code smg_du[]={
发射器发射的的信号为
接收器接收到的信号为
即 9ms 低电平后 4.5ms 高电平作为起始码,之后接受到两次 8 位客户码,一次八位数据码,和一次八位数据反码。
遥控器在按键按下之后周期性的发出同一种 32 位二进制编 码周期约为 108ms,一组码持续时间随本身的“0”“1”个数不同
而不同。大约在 45~63ms 之间,当一个键按下 36ms,振荡器使芯 片激活,将发射一组 108ms 的编码脉冲这 108ms 编码脉冲由一个 起始码(9ms),一个结束码(4.5ms),低八位地址码(9~18ms), 高八位地址码(9~18ms),八位数据码(9~18ms),和这八位数据 码反码(9~18ms),如果按下超过 108ms 仍未松开,接下来发射 的代码(连发代码)将仅有起始码(9ms)和结束码(2.5ms)组 成。
解码的关键是如何识别零和一: “0”和“1”都是以 0.56ms 低电平开始的,不同的是高电平 宽度不同,“0”为 0.56ms“1”为 1.168ms,所以必须根据高电平 宽度来区别“0”和“1”。 如果从 0.56ms 低电平过后,开始延时,0.56ms 后,若读到的 电平为低,说明该位为零,反之则为一,可靠其间,延时必须比 0.56ms'长一些,又不能超过 1.12ms,否则如果该位为零,读到的 已是下一位高电平,因此取(1.12+0.56)/2=0.84ms 最为可靠,一 般取 0.84ms 左右均可。根据码的格式,应该等待 9ms 起始码和 4.5ms 结束码完成后才能读码。 备注:定时器/计数器控制寄存器 TCON 位序 D7 D6 D5 D4 D3 D2 D1 D0 号 位符 TF1 TR1 TF0 IR0 IE1 IT1 IE0 IT0 号

c51、c52单片机红外线遥控接收解码c程序(可直接使用)

c51、c52单片机红外线遥控接收解码c程序(可直接使用)

/ 亲,此程序以经过测试,可直接使用!!!/#include <reg51.h>#define uchar unsigned char#define uint unsigned intvoid delay(uchar x);sbit IRIN = P3^2;uchar IRCOM[4];void main(){ IE = 0x81;TCON = 0x01;IRIN=1;/* 此处可以根据按键码自由编写程序/以下为3*7遥控按键码//(也可以应用与其他类型遥控,本程序只以3*7遥控为例)/ / 0x45 0x46 0x47 // 0x44 0x40 0x43 // 0x07 0x15 0x09 // 0x16 0x19 0x0d // 0x0c 0x18 0x5e // 0x08 0x1c 0x5a // 0x42 0x52 0x4a /例如:while(1){switch(IRCOM[2]){case 0x45: P2=0x7f; break;case 0x44: P2=0xbf; break;case 0x07: P2=0xdf; break;case 0x16: P2=0xef; break;case 0x0c: P2=0xf7; break;case 0x08: P2=0xfb; break;case 0x42: P2=0xfd; break;case 0x52: P2=0xfe; break;case 0x4a: P2=0xff; break;case 0x5a: P2=0x00; break;}} */while(1);} //end main/**********************************************************/ void IR_IN(void) interrupt 0 //外部中断服务程序{unsigned char j,k,N=0;EX0 = 0;delay(15);if (IRIN==1){ EX0 =1;return;}//确认IR信号出现while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。

单片机如何通过捕获来实现对红外遥控器解码

单片机如何通过捕获来实现对红外遥控器解码

单片机如何通过捕获来实现对红外遥控器解码一、内容提要上讲介绍并应用了单片机动态扫描驱动数码管,并给出了实例。

这一讲将重点介绍单片机如何通过捕获来实现对红外遥控器解码。

通过该讲,读者可以掌握红外遥控器的编码原理以及如何通过单片机对遥控器进行解码。

二、原理简介随着家用电器、视听产品的普及,红外线遥控器已被广泛使用在各种类型的家电产品上(如遥控开关、智能开关等)。

其具有体积小、抗干扰能力强、功耗低、功能强、成本低等特点,在工业设备中也得到广泛应用。

一般而言,一个通用的红外遥控系统由发射和接收两大部分组成,如图1 所示:图1 红外遥控系统框图其中发射部分主要包括键盘矩阵、编码调制、红外发射管;接收部分包括光、电信号的转换以及放大、解调、解码电路。

举例来说,通常我们家电遥控器信号的发射,就是将相应按键所对应的控制指令和系统码(由0 和1 组成的序列),调制在32~56kHz 范围内的载波上,然后经放大、驱动红外发射管将信号发射出去。

此外,现在流行的控制方法是应用编/ 解码专用集成电路芯片来实现(如下文提到的SAA3010 红外编码芯片和HS0038 红外接收头)。

不同公司的遥控芯片,采用的遥控码格式也不一样。

在此介绍目前广泛使用较普遍的两种,一种是NEC Protocol 的PWM(脉冲宽度调制)标准,一种是Philips RC-5 Protocol 的PPM(脉冲位置调制)标准。

NEC 标准:遥控载波的频率为38kHz(占空比为1:3);当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。

简码重复为延时108ms,即两个引导脉冲上升沿之间的间隔都是108ms。

一个完整的全码如图2所示。

单片机STM32F103C8T6的红外遥控器解码系统设计

单片机STM32F103C8T6的红外遥控器解码系统设计

单片机STM32F103C8T6的红外遥控器解码系统设计一、本文概述本文旨在详细阐述基于STM32F103C8T6单片机的红外遥控器解码系统的设计和实现过程。

随着科技的不断进步和智能化设备的普及,红外遥控器作为一种常见的遥控设备,已经广泛应用于家电、安防、玩具等多个领域。

然而,红外遥控器发出的红外信号往往需要通过解码器才能被设备正确识别和执行,因此,设计一款高效、稳定、可靠的红外遥控器解码系统具有重要意义。

本文将首先介绍红外遥控器的基本原理和信号特点,然后详细阐述STM32F103C8T6单片机的性能特点和在红外遥控器解码系统中的应用优势。

接着,将详细介绍红外遥控器解码系统的硬件设计,包括红外接收头的选择、电路设计和PCB制作等。

在软件设计部分,将详细阐述如何通过STM32F103C8T6单片机的编程实现红外信号的接收、解码和处理,以及如何将解码后的数据通过串口或其他通信方式发送给主控制器。

本文还将对红外遥控器解码系统的性能进行测试和分析,包括信号接收距离、解码速度和稳定性等方面的测试。

将总结本文的主要工作和创新点,并对未来的研究方向进行展望。

通过本文的研究和实现,旨在为红外遥控器解码系统的设计提供一种新的思路和方法,同时也为相关领域的研究人员提供有益的参考和借鉴。

二、红外遥控器基础知识红外遥控器是一种常见的无线遥控设备,它利用红外光作为信息载体,通过发射和接收红外光信号实现对设备的远程控制。

这种遥控方式因其简单、低成本和无需视线连接等优点,在各类消费电子产品中得到了广泛应用,如电视机、空调、音响等。

红外遥控器的工作原理主要基于红外辐射和光电器件的检测。

遥控器内部通常包含一个或多个红外发射管,当按下按键时,发射管会发射出特定频率和编码的红外光信号。

接收端则配备有红外接收头,该接收头内部有一个光敏元件(如硅光敏三极管或光敏二极管),用于检测红外光信号并将其转换为电信号。

为了区分不同的按键操作,红外遥控器通常采用特定的编码方式对按键信号进行编码。

单片机做红外遥控解码器

单片机做红外遥控解码器

单片机做红外遥控解码器你家里是否有一个电视机遥控器或者空调机遥控器呢?你是否也想让它遥控其他的电器甚至让它遥控您的电脑呢?那好,跟我一起做这个“遥控”。

该小制作所需要的元件很少: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位停止位、无校验位。

电路就这么容易了,现在分析详细的编程过程吧。

开头位是以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:movtmod,09h,这样设置定时器0即是把GATE置1,16位计数器,最大计数值为2的16次方个机器周期,此方式由外中断INT0控制,即INT0为高时才允许计数器计数。

比如:jnbp3.2,$jbp3.2,$clrtr0这3条命令就可以测量一个高电平,接下来读取计数值TH0,TL0就可以辨别是起始位还是“1”或“0”。

单片机的红外线解码程序

单片机的红外线解码程序
{
switch(inf_shuju)
{
case inf_code_0: inf_array[1]=30;
break;
case inf_code_1: inf_array[1]=1;
break;
case inf_code_2: infe inf_code_3: inf_array[1]=3;
TR1 = 1; //定时器1开始计数,由于晶振是24M
inf_shunxu++;
}
//#############################################################################
//函数名称:void inf_gongcuowu()
//功能:红外线错误子程序
break;
case inf_code_12: inf_array[1]=12;
break;
case inf_code_13: inf_array[1]=13;
break;
case inf_code_14: inf_array[1]=14;
break;
case inf_code_15: inf_array[1]=15;
//入口参数:无
//出口参数:无
//#############################################################################
void inf_gongcuowu(void)
{
inf_mode_cuowu = 1; //红外线接收出现错误
void T_1(void) interrupt 3 //参与红外线接收
{
TR1 = 0;

用单片机解码红外遥控器

用单片机解码红外遥控器

用单片机解码红外遥控器遥控器使用方便,功能多.目前已广泛应用在电视机、VCD、DVD、空调等各种家用电器中,且价格便宜,市场上非常容易买到。

如果能将遥控器上许多的按键解码出来.用作单片机系统的输入.则解决了常规矩阵键盘线路板过大、布线复杂、占用I/O口过多的弊病。

而且通过使用遥控器,操作时可实现人与设备的分离,从而更加方便使用。

下面以TC9012编码芯片的遥控器为例。

谈谈如何用常用的51系统单片机进行遥控的解码。

一、编码格式1、0和1的编码遥控器发射的信号由一串O和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

TC9012的O和1采用PWM方法编码,即脉冲宽度调制,其O码和1码如图1所示(以遥控接收输出的波形为例)。

O码由O.56ms低电平和0.56ms高电平组合而成.脉冲宽度为1.12ms.1码由0.56ms低电平和1.69ms高电平组合而成.脉冲宽度为2.25ms。

在编写解码程序时.通过判断脉冲的宽度,即可得到0或1。

2、按键的编码当我们按下遥控器的按键时,遥控器将发出如图2的一串二进制代码,我们称它为一帧数据。

根据各部分的功能。

可将它们分为5部分,分别为引导码、地址码、地址码、数据码、数据反码。

遥控器发射代码时.均是低位在前。

高位在后。

由图2分析可以得到.引导码高电平为4.5ms,低电平为4.5ms。

当接收到此码时.表示一帧数据的开始。

单片机可以准备接收下面的数据。

地址码由8位二进制组成,共256种.图中地址码重发了一次。

主要是加强遥控器的可靠性.如果两次地址码不相同.则说明本帧数据有错.应丢弃。

不同的设备可以拥有不同的地址码.因此。

同种编码的遥控器只要设置地址码不同,也不会相互干扰。

图中的地址码为十六进制的0EH(注意低位在前)。

在同一个遥控器中.所有按键发出的地址码都是相同的。

数据码为8位,可编码256种状态,代表实际所按下的键。

数据反码是数据码的各位求反,通过比较数据码与数据反码.可判断接收到的数据是否正确。

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版

单片机红外接受解码程序成功版1、效果图2、发射码格式3、38KH载波发射(完整的发射图)4、 0 与 1的区别5、载波6、小结7、代码发射码格式38KH载波发射(完整的发射)0与1的区别载波小结1、发射端发射出来的是高电平。

但是接收到的是低电平。

(接收到的数据与发射的相反)2、我这里用的外部下降沿触发的中断3、使用12M的晶振完4、整源码下载地址:代码#include <reg51.h>sbit IR=P3^2; //红外接口标志sbit dm = P2^2; //段码sbit wm = P2^3; //位码unsigned char hc[8]; //数码管显示缓存unsigned char DM[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0 x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~Funsigned char WM[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //位码。

显示的位置unsigned char sj[33]; //接收脉冲时间数组char w=0; //数码管显示缓存指针(0~7)unsigned char i; //脉冲个数记录unsigned char mcsj; //脉冲时间(大于0.56ms小于1.125ms为0,大于1.125ms小于2.25ms)bit MC=0; //接收红外脉冲开始标志(0:脉冲已经结束,1:脉冲刚开始)bit JS=0; //脉冲接收结束标志位(1标志接收结束)bit JM=0; //解码完成标志位(1:解码完成)void Delay(unsigned char f);void dsq_0() interrupt 1 using 1 //定时器T0中断服务函数{mcsj++; //256}void wbzd_0() interrupt 0 //外部中断服务函数{if(MC){if(mcsj>32) //判断是不是引导码。

51单片机 红外接收数码管显示解码实验

51单片机  红外接收数码管显示解码实验

#include <reg51.h>#define c(x) (x*120000/120000)sbit Ir_Pin=P3^3;//接红外sbit beep=P3^6;unsigned char code Led_Tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //共阳极数码显示码0-F.unsigned char code Led_Sel[]={0x00,0x01,0x02,0x03};unsigned char Led_Buf[4]; //显示缓冲区char Led_Index;//位选unsigned char Ir_Buf[4]; //用于保存解码结果void delay_50ms(unsigned int t){unsigned int j;for(;t>0;t--)for(j=6245;j>0;j--){;}}//==============================================================//数码管扫描timer0() interrupt 1 using 1{TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描P0=0xff;P2=Led_Sel[Led_Index]; //位选P0=Led_Tab[Led_Buf[Led_Index]]; //段选if(++Led_Index>3) Led_Index=0; //四个扫描完了,到第一个数码管}//============================================================== unsigned int Ir_Get_Low(){TL1=0;TH1=0;TR1=1;while(!Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================= unsigned int Ir_Get_High(){TL1=0;TH1=0;TR1=1;while(Ir_Pin && (TH1&0x80)==0);TR1=0;return TH1*256+TL1;}//============================================================== main(){unsigned int temp;char i,j;Led_Index=1;TMOD=0x11;TL0=65536-1000;TH0=(65536-1000)/256; //定时器0设定约1000us中断一次,用于数码管扫描EA=1;ET0=1;TR0=1;Led_Buf[0]=0;Led_Buf[1]=0;Led_Buf[2]=0;Led_Buf[3]=0; //显示区设成0do{ restart:while(Ir_Pin);temp=Ir_Get_Low();if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000temp=Ir_Get_High();if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500for(i=0;i<4;i++) //4个字节for(j=0;j<8;j++) //每个字节8位{temp=Ir_Get_Low();if(temp<c(200) || temp>c(800)) goto restart;temp=Ir_Get_High();if(temp<c(200) || temp>c(2000)) goto restart;Ir_Buf[i]>>=1;if(temp>c(1120)) Ir_Buf[i]|=0x80;}Led_Buf[0]=Ir_Buf[2]&0xf;Led_Buf[1]=(Ir_Buf[2]/16)&0xf;Led_Buf[2]=Ir_Buf[3]&0xf;Led_Buf[3]=(Ir_Buf[3]/16)&0xf; //显示结果P1=Ir_Buf[2];beep=0;delay_50ms(2);beep=1;}while(1);}。

51单片机红外接收解码程序C51

51单片机红外接收解码程序C51

51单片机红外接收解码程序(C51)接收以S52单片机作为接收系统。

以S52的P3.3口作为接收端口,该端口是外部中断1。

这个接受程序是以XC866作为红外发送控制系统,接收程序如下:#include; //头文件#include;#define uchar unsigned char //宏定义#define uint unsigned intsbit HWRx=P3^3; //位声明code uchar Table[]= //共阴数码管 0-9 a-f - 表{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于显示的数组uchar Table_Rx[67];//用于存储判断接收是1或0的参数void Delay();//延时子函数void Display(uchar *lp,uchar lc)//显示{uchar i; //定义变量P2=0; //端口2为输出,关闭P1=P1&0xF8; //将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管for(i=0;i;0x7f)P2+=0x80;Delay(); //延时P2=0; //清0端口,准备显示下位if(i==7) //检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据break;P1++; //点亮下一位数码管}}void main() //主函数{EA=1; //首先开启总中断EX1=1; //开启外部中断 1IT1=1; //设置成下降沿触发方式while(1) //一直显示,其它由中断处理{Display(Table_Data,8);}}void Delay() //延时时间大约为31us,晶振12M {uchar i=13;while(i)i--;}void Delay_ms(uint z) //延时时间约为 1ms*X 晶振为12M{uint x=0,y=0;for(x=z;x>;0;x--)for(y=54;y>;0;y--);}void hongwai() interrupt 2 //外部中断 1 ,INT1(P3^3)连接红外线接收IC数据脚{uchar i,j,tmp;EX1=0; //关闭中断j=33; //传送一组数包括引导码1位,4个八位数据,总共33位i=0; //从第一维数组开始Delay_ms(10);if(HWRx){ //然后再检测红线接收脚是有数据招收,有继续,没有则退出EX1=1;return;}while(j--){ //循环接收33位数据,为何我们用到66位数组,我们可以不接收高电平时间常数,只接低电平常数就//可以判断1或0了,在这里我们都接收,还有一点要知道,接收波形是反向,在没有接收时端口为高电平tmp=0;Table_Rx[i]=1; //时间量从1开始while(!HWRx) //检测高低电平的变化,这里检测的是高电平{Table_Rx[i]++; //没变继续加1Delay(); //家一个延时防止,计数值一下子就加满了tmp++; //加1if(tmp==250)break;}i++;tmp=0;Table_Rx[i]=1; //时间量从1开始while(HWRx) //检测高低电平的变化,这里检测的是低电平{Table_Rx[i]++; //没变继续加1Delay(); //同上tmp++; //加1,用于判断是1还是0的,低电平来了if(tmp==250)break;}i++;}P1=0xf8;i=200; //加入循环延时,抗干扰while(i) //在有接收数据的时候显示一个H{tmp=255;while(tmp){tmp--;P2=0x76;}i--;}tmp=0;for(i=3;i;>;=1; //右移一位,接收低位在前if(Table_Rx[i]>;30) //检测低电平时间超过30就确认为1tmp+=0x80;}Table_Data[0]=tmp/16; //分开2位以16进制显示,用显示发送的数据Table_Data[1]=tmp%16;tmp=0;for(i=19;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[2]=tmp/16;Table_Data[3]=tmp%16;tmp=0;for(i=35;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[4]=tmp/16;Table_Data[5]=tmp%16;tmp=0;for(i=51;i;>;=1;if(Table_Rx[i]>;30)tmp+=0x80;}Table_Data[6]=tmp/16;Table_Data[7]=tmp%16;EX1=1; //刚进中断时关闭了分控,现在要打开}。

51单片机解码红外遥控器原理

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’+控制码+用户码+用户码,如图所示。

单片机实现红外接收解码

单片机实现红外接收解码

单片机实现红外接收解码摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。

本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。

关键字:单片机,红外遥控,解码1.引言遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD 机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。

红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。

您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。

遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。

2.红外接收原理红外遥控信号接收:红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。

3.脉冲波形分析:每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:前导码:第1个脉冲波形用户码1:第2到第9个脉冲波形用户码2:第10到第17个脉冲波形键码:第18到第25个脉冲波形键码反码:第26到第33个脉冲波形连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。

注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。

脉冲流中有四种不同的脉冲波形宽度:其中前导码脉宽为:40(4ms) < 脉冲宽度< 50(5ms)连续按键脉宽为: 21(2.1ms) < 脉冲宽度 < 25(2.5ms)bit "0" 脉宽为: 3(0.3ms) < 脉冲宽度 < 7(0.7ms)bit "1" 脉宽为: 14(1.4ms) < 脉冲宽度 < 19(1.9ms)在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit );用户码2为1字节; 键值为1字节;键值反码为1字节,键值反码为键值取反值。

51单片机红外解码程序

51单片机红外解码程序

51单片机红外解码程序1、红外遥控系统通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,如图1所示。

发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。

下面,我们将使用下面两种设备:另外,使用51单片机进行解码。

2、原理图从原理图看出,IR的data脚与51的PD2(P3.2)相连。

2、红外发射原理要对红外遥控器所发的信号进行解码,必须先理解这些信号。

a) 波形首先来看看,当我们按下遥控器时,红外发射器是发送了一个什么样的信号波形,如下图:由上图所示,当一个键按下超过22ms,振荡器使芯片激活,将发射一组108ms的编码脉冲(由位置1所示)。

如果键按下超过108ms仍未松开,接下来发射的代码(连发代码由位置3所示)将仅由起始码(9ms)和结束码(4.5ms)组成。

下面把位置1的波形放大:由位置1的波形得知,这108ms发射代码由一个起始码(9ms),一个结果码(4.5ms),低8位地址码(用户编码)(9ms~18ms),高8位地址码(用户编码)(9ms~18ms),8位数据码(键值数据码)(9ms~18ms)和这8位数据的反码(键值数据码反码)(9ms~18ms)组成。

b) 编码格式遥控器发射的信号由一串0和1的二进制代码组成.不同的芯片对0和1的编码有所不同。

通常有曼彻斯特编码和脉冲宽度编码。

XS-091遥控板的0和1采用PWM方法编码,即脉冲宽度调制。

下图为一个发射波形对应的编码方法:放大0和1的波形如下图:这种编码具有以下特征:以脉宽为0.565ms、间隔0.56ms、周期为1.125ms 的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms 的组合表示二进制的“1”。

3、红外接收原理a) 波形红外接收头将38K载波信号过虑,接收到的波形刚好与发射波形相反:放大,位定义0和位定义1波形如下:4、解码原理及算法注:代码宽度算法:16位地址码的最短宽度:1.12×16=18ms 16位地址码的最长宽度:2.24ms×16=36ms可以得知8位数据代码及其8位反代码的宽度和不变:(1.12ms+2.24ms)×8=27ms所有32位代码的宽度为(18ms+27ms)~(36ms+27ms)对于红外线遥控对于很多电子爱好者来讲,都感觉到非常神奇,看不到,摸不着,但能实现无线遥控,其实控制的关键就是我们要用单片机芯片来识别红外线遥控器发出红外光信号,即我们通常所说的解码。

单片机的红外遥控器解码原理与实现

单片机的红外遥控器解码原理与实现

单片机的红外遥控器解码原理与实现红外遥控器是我们日常生活中常见的电子设备,它通过使用红外线信号与接收器进行通信。

而在这个过程中,单片机起到了解码的重要作用。

本文将介绍单片机解码红外遥控器的原理以及实现方法。

一、红外遥控器的工作原理红外遥控器是一种使用红外线进行通信的设备,它主要由发送器和接收器两部分组成。

发送器将指令数据转换为红外脉冲信号并发送出去,接收器通过接收红外线信号并将其转换为电信号,进而解码为可识别的指令。

而单片机则负责接收并解码红外信号,将其转化为具体的操作。

二、单片机解码红外信号的原理单片机解码红外信号主要分为两个步骤:红外信号的接收和信号的解码处理。

1. 红外信号的接收单片机通过外部的红外接收器接收红外信号。

红外接收器可以通过外部电路将接收到的红外信号转换为电压信号,然后通过单片机的IO 口输入。

2. 信号的解码处理接收到的红外信号经过IO口输入后,单片机需要对信号进行解码处理。

解码的过程涉及到红外信号的标准化和解析。

对于常见的红外遥控器协议,单片机需要能够识别其编码方式,确定其协议格式。

这些协议通常包含了引导码、地址码和指令码等信息。

在解析红外信号时,单片机首先需要识别引导码。

引导码是红外信号的起始标志,通常由高、低电平组成,表示编码的开始。

单片机通过判断引导码的时间长度来确定信号的开始。

接下来,单片机需要识别地址码和指令码。

地址码是用来区分不同的红外遥控器设备,指令码则表示具体的操作指令。

单片机通过判断地址码和指令码的高、低电平时间长度来确定具体的操作。

三、单片机解码红外信号的实现方法单片机解码红外信号有多种实现方法,以下是一种简单的实现示例。

首先,需要连接红外接收器到单片机的IO口,将接收到的信号输入到单片机。

接收到的信号可以通过外部中断的方式触发单片机的中断服务程序。

然后,在中断服务程序中,单片机需要根据红外协议的规则,判断引导码、地址码和指令码的时间长度。

利用计时器或延时函数可以实现对信号时间的测量。

51单片机红外的遥控解码程序的编写

51单片机红外的遥控解码程序的编写

51单片机红外的遥控解码程序的编写下面把这次红外编程的解码的经历简要的写一下,以便以后回顾总结:红外遥控过程是这样的:红外遥控器的矩阵键盘按键,接着专用芯片编码调制然后红外发射;红外接受头经过光电放大,解调,最后解码编程。

我的遥控专用芯片是UPD6122G-001.解码晶振是455kHz,调制载波频率是455kHz/12=38kHz。

此外调制信号是PWM进行调制的,0是脉冲波形位0.5625ms的高电平跟0.5625ms的低电平组成,1则是0.5625ms的高电平跟1.6785ms的低电平组成。

跟其他通用的波形一样,有键按下时,先是9ms的高电平的起始码,接着是一个4.5ms结果码,接下来就是数据了。

用户码的高8位,用户码的低8位,8位数据码,8位数据反码,最后还有一个停止位。

如果按键一直没松,则接下来就只是发送起始码(9ms高电平),接着是一个2.2ms的低电平,再接着是一个停止位。

我的红外接在单片机p3.7引脚上面,从网上收集了一些程序,基本上如同一则,汇编编写,跟外部中断还有关系。

于是便萌生了自己写一下的想法。

我的思路是用定时器进行计数,然后编程。

刚开始编写程序是,由于忘了对定时器的标志位进行置为,结果定时中断根本就没有执行,手头上又没有用仿真芯片,搞得我下载调试了十来次才发现了这个问题。

还有一个问题刚开始遥控能够解码的时候,可是一直按某个键,你按一次,她就变化一次,搞得我很是郁闷,差点儿没晕过去。

怎么找都不知道问题的所在,心里不断地打算放弃,不过最后还是坚持了下来,原来电路的实际解码电平跟资料上是相反的。

遥控器的实际电平由高变低,而电路板上却是由低变高。

这点确好相反。

总结:一要自信,二要坚持,才有可能完成你想做的事件。

#include"reg51.h"#include"2-16.h"#include"address.h"//需要显示的信息uchar code hello[] = "Hello,PengSen!";//变量uchar data psCount; //定时器计数器uchar data i;uchar data j;uchar data temp;uchar data dp[4]; //用来保存红外遥控的码值uchar data dp2[12];//用来显示红外遥控的码值sbit HW = P3^7;void delay(unsigned int y);void main(){//初始化initlcd();dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;TMOD = 0x11; // 定时器0, 1工作模式1, 16位定时方式TH1 = 0xfe; //定时500uSTL1 = 0x33;TCON = 0x01;IE = 0x80;TR1 = 1;printf(hello,13);while(1){//报文头ET1 = 0;psCount = 0;while(HW == 1); //初始状态下,红外输出脚一直是高电平,等待遥控按键ET1 = 1;while(HW == 0);if( psCount > 17)//0.5* 17 = 8.5ms约为9.0ms{ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 5)//超过0.5*5 = 2.5毫米,检查一下遥控命令是不是连发,不是则执行下面的程序{ET1 = 0;psCount = 0;dp[0] = 0x0;dp[1] = 0x0;dp[2] = 0x0;dp[3] = 0x0;//数据for(i = 0 ; i < 4; i++){for(j = 0; j < 8; j++){while(HW == 0);ET1 = 0;psCount = 0;ET1 = 1;while(HW == 1);if(psCount > 2)//根据波形长度判定码值为0或1temp = 0;elsetemp = 1;dp[i] |= (temp<<="">}}}}//停止位while(HW == 1);//数据显示delay(20);dp2[0] = dp[0]/100 + 0x30;dp2[1] = dp[0]%100/10 + 0x30;dp2[2] = dp[0]%10 + 0x30;dp2[3] = dp[1]/100 + 0x30;dp2[4] = dp[1]%100/10 + 0x30;dp2[5] = dp[1]%10 + 0x30;dp2[6] = dp[2]/100 + 0x30;dp2[7] = dp[2]%100/10 + 0x30; dp2[8] = dp[2]%10 + 0x30; dp2[9] = dp[3]/100 + 0x30;dp2[10] = dp[3]%100/10 + 0x30; dp2[11] = dp[3]%10 + 0x30; printf(dp2,12);delay(20);}}//延时子程序void delay(unsigned int y){uchar x;for(;y!=0;y--)for(x=200;x!=0;x--); }//定时器1中断void timer1() interrupt 3 {psCount++;TH1 = 0xfe; //定时500uS TL1 = 0x33;}。

单片机红外接收与解码原理

单片机红外接收与解码原理

1单片机红外接收与解码原理1.1PT2262-I R编码原理PT2262-IR的编码格式如图1-1所示,其中,OSC为系统的时钟频率。

0,1,f和Sync 对应的分别是低电平,高电平,悬空和同步码的波形,图1-1 PT2262-IR编码格式由于使用的一体化红外接收头的接收频率为38KHz,所以系统的时钟频率应该设置为76KHz。

根据编码格式,通过计算可以得到各类编码中高低电平的宽度,也可以利用示波器测量各类编码中高低电平的宽度。

1.2 解码原理要进行软件解码最重要的是得到各个电平的宽度,因此我们在进行软件解码时要利用计时器去获得电平的宽度,然后对得到的数据进行处理,就可以得到每个相应的脉冲是宽脉冲还是窄脉冲。

通过对PT2262-IR的编码格式分析发现,根据每个周期中间时刻的电平状态就是判断相应周期中高电平是宽脉冲还是窄脉冲,为了减少数据的运算量,我们也可以在每个周期的中间时刻对输入端进行电平检测,得到相应时刻的电平状态,然后根据每个周期中间时刻的电平状态去判断该周期的脉冲是宽脉冲还是窄脉冲进而解码出发送的实际数据,每个周期中间时刻的电平状态和实际数据的对应关系如表1所示。

表1 编码与数据对应表第一个周期第二个周期编码格式实际数据0 0 00 10 1 01 误码1 0 10 f1 1 11 0利用判断周期中间时刻的电平状态进行软件解码时,我们可以通过计算得到周期的大概值,进而计算出半个周期的大概值,就可以在输入端有高电平跳变到低电平时给定时器一个初始值,然后启动定时器,使定时器可以在该周期的中间时刻产生中断,在中断处理程序中根据标记位判断是否需要读取信号输入端的电平状态,如果需要读取输入端的电平状态就开始读取输入端的电平状态,然后将其保存,同时计数值增加1,并清除标记位,对定时器设定初始值后重新启动定时器,以便判断该周期是否过长。

如果不需要读取电平状态说明此次定时是为了判断周期长度的,一旦进入该中断说明该周期过长,可能是同步位或者是误码,因此就需要将计数值清零,重新获取数据,一直到获取25个数据为止。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前导码:第1个脉冲波形
用户码1:第2到第9个脉冲波形
用户码2:第10到第17个脉冲波形
键码:第18到第25个脉冲波形
键码反码:第26到第33个脉冲波形
连续按键脉冲:第34和第35个脉冲为结束脉冲(也即连续按键脉冲),在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键。
uchar value;
k=1;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1;
if(irdata[k]>6) //接收的数据为0或1,0为1.125ms<5,1为2.25约8~9,曲中间
value=value|0x80;
k++;
}
ircode[j]=value;//编码值给ircode,
4.3
判断所收到的用户码是否正确、键码及键码反码是否正确,如果都正确则认为此次收码为正确收码,否则丢弃。
收码完后,还会有结束脉冲波形,如果用户一直按住某个键不放,遥控器会一直发送连续按键脉冲波形,如果多次收到连续按键,可以认为再次收到键码,这个可以根据实际需要定。
5.
#include <reg51.h>
uchar irreceok=0; //判断是否接收到一帧数据,33位
uchar ircode[4]; //存放4个码值
uchar irprosok;
uchar disp[8];
sbit LS138A=P2^2; //138译码器的A端由P2.2口控制
sbit LS138B=P2^3; //138译码器的B端由P2.3口控制
LS138C=1;LS138B=1;LS138A=1; P0=table[disp[7]]; delay(10);
}
void main()
{
init();
while(1)
{
if(irreceok) //若接收到数据
{
irpros();//解码
irreceok=0;
}
if(irprosok) //数据解码完毕,拆开显示
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39, 0x5e, 0x79, 0x71};
红外遥控器作为设备的输入控制具有操作简便、价格便宜等诸多好处。您可以根据您公司产品需要和遥控器提供商协商定制遥控器,包括遥控器键盘布局、每个按键的键码等。
遥控器键盘上每个按键的键码是一个小于256的一个数值,按键后通过遥控器红外管产生脉冲发送出去,红外接收器接收到脉冲后,对脉冲流进行分析,提取键码值,并按照键码值实现其遥控目的。
LS138C=1;LS138B=0;LS138A=0; P0=table[disp[4]]; delay(10);
LS138C=1;LS138B=0;LS138A=1; P0=table[disp[5]]; delay(10);
LS138C=1;LS138B=1;LS138A=0; P0=table[disp[6]]; delay(10);
单片机实现红外接收解码
摘要:接收到红外遥控器的脉冲波形,并通过解析其波形得到红外遥控器的相应解码,实习对相应设备的控制。本文详细接受红外遥控技术原理并如何通过C51单片机实现红外遥控。
关键字:单片机,红外遥控,解码
1.
遥控器相信大家不会陌生,日常生活中会使用到各种各样的遥控器,比如电视机、DVD机、空调、机顶盒甚至音响、热水器等都用到遥控器,其实红外技术已经走进与人们的生活并且与人们的生活息息相关了。
value=0;
}
irprosok=1; //红外数据提取完毕
}
//显示,要将接收到的码拆开8位显示
void irwork(void)//将接收到的码拆开显示
{
disp[0]=ircode[0]/16; //按16进制显示
disp[1]=ircode[0]%16;
disp[2]=ircode[1]/16;
disp[3]=ircode[1]%16;
disp[4]=ircode[2]/16; //按16进制显示
disp[5]=ircode[2]%16;
disp[6]=ircode[3]/16;
disp[7]=ircode[3]%16;
}
void display(void)//送到数码管显示
{
LS138C=0;LS138B=0;LS138A=0; P0=table[disp[0]]; delay(10);//第一个数码管显示1
uchar code weitable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar irnum; //定时器0定时时间计数
uchar bitnum; //存放接收到的位数
uchar startflag; //开始标志
uchar irdata[33];
注意:不同的遥控器产生的用户码值可能不一样,笔者碰到两种不同的用户码:0x00,0xFF及0x04,0x7F。
脉冲流中有四种不同的脉冲波形宽度:
其中前导码脉宽为:40(4ms) <脉冲宽度< 50(5ms)
连续按键脉宽为:21(2.1ms) <脉冲宽度< 25(2.5ms)
bit "0"脉宽为:3(0.3ms) <脉冲宽度< 7(0.7ms)
IE0=1;//外部中断0允许
EX0=1;//开中断
//定时计数器0中断
TMOD=0x02; //工作方式1,16位
TH0=0x00;//定时0.256ms
TL0=0x00;
ET0=1; //开中断
EA=1;
TR0=1; //定时计数器启动中断
}
void irpros(void) //解码
{
uchar i,j,k;
LS138C=0;LS138B=0;LS138A=1; P0=table[disp[1]]; delay(10);//第一个数码管显示2
LS138C=0;LS138B=1;LS138A=0; P0=table[disp[2]]; delay(10);
LS138C=0;LS138B=1;LS138A=1; P0=table[disp[3]]; delay(10);
2.
红外遥控信号接收:
红外接收电路可以使用集成接收器,接收器包括红外接收管及信号处理IC,接收器对外只有三个引脚,一个接电源的Vcc脚、一个接地的GND脚、一个脉冲信号输出脚,当然脉冲信号输出脚直接接单片机的某个可以使用的IO脚就可以了。
3.脉冲波形分析:
每次按键,红外接收器这边会收到一串脉冲宽度不等的脉冲波形流,其脉冲流由35个脉冲波形构成:
irnum=0;
bitnum++;
if(bitnum==33)
{
irreceok=1;//接收到一帧数据
startflag=0;
}
}
}
void timer0() interrupt 1
{
irnum++;//定时时间irnum*0.256ms
}
键值为1字节;
键值反码为1字节,键值反码为键值取反值。
先判断所收到用户码是否正确,如果不正确则丢弃此次所收键码,如果正确则利用键值反码取反与键值比较,判断收码是否正确,如果不正确则丢弃所收键码。
如下图所示:
从上图可以看出其用户码为:0b00100000-0b11111110,由于其低位在前,故转换后得到用户码为:0b00000100-0b01111111,即0x04,0x7F;
其键码及键码反码为:0b00010010-0b11101101,同样也是低位在前,转换后得到键码及键码反码为:0b01001000-0b10110111,即0x48,0xB7。
4.实现:
4.1
初始化时当然要先初始化单片机红外接收管脚为高阻输入状态,其次要初始化定时器,因为检测分析脉冲波形时需要用到定时器,根据上面对脉冲流波形分析可以知道最窄的脉宽为bit“0”,为0.3ms左右,所以定时器最好定时为每0.1ms中断一次比较好,但是定时器的值怎么设置呢,这样根据单片机的振荡器决定。
4.2
首先当然是检测前导码,单片机红外接收管脚在初始化时已经设置为高阻输入状态(即高电平状态),当有红外输入时,状态变为低电平状态,一旦检测到有低电平过来,则开始准备检测前导码。得到每个脉冲波形序号,并根据定时器统计出每个脉冲波形在高电平状态维持的时间,通过其时间值检测第一个脉冲是否是前导码,如果不是则重新检测前导码,如果是前导码则分析其后每个脉冲波形是bit“0”,还是bit“1”,并按顺序每八个波形为一个字节方式保存到用户码1字节变量、用户码2字节变量、键码字节变量、键码反码字节变量,直到收满32个bits。
bit "1"脉宽为:14(1.4ms) <脉冲宽度< 19(1.9ms)
在收到一串脉冲流后,就要对其进行分析,先要检测第一个脉冲波形是不是前导码,如果不是,则继续检测前导码,如果是则检测如下32个脉冲波形:
用户码1为1字节,由8个脉冲波形组成(其中一个脉冲波形表示字节中1 bit);
用户码2为1字节;
{
irwork();
irprosok=0;
}
display();
}
}
相关文档
最新文档