红外线遥控器解码C语言程序代码 SM0038接受头

红外线遥控器解码C语言程序代码 SM0038接受头,第1张

//////////////////////////////////////

//晶振频率为6MHz 一个机器周期2us //

//实现按键地址码、指令码的数码管显示//

//2010-06-01 //

//////////////////////////////////////

#include<reg52h>

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

bit overflag,dataover;//开始接收数据,数据处理完毕

uchar timedata;//定时器0溢出次数

uchar chubus[33];//33Byte数据 timedata组成的数组

uchar jieguos[4];//地址码,地址反码,数据码,数据反码;

void initial()//初始化

{

IT0=1;EX0=1;//负边沿触发

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器

TH0=0xff;TL0=0x06;//05ms溢出

EA=1; //开总中断

}

void time0() interrupt 1//定时器0中断

{TH0=0xff;TL0=0x06;

timedata++;

}

void ex0() interrupt 0//外部中断0,接收数据

{

static bit startflag;//开始接收

static uchar i;

if(startflag)

{

if(timedata<32&&timedata>=16) i=0;

chubus[i]=timedata;

timedata=0;

i++;

if(i==33){overflag=1;i=0;}

}

else

{

startflag=1;

timedata=0;

}

}

void chulidata()

{

uchar chubu;//初步数据

uchar jieguo;//结果数据

uchar x,y,z=1;

for(x=0;x<4;x++)//处理四组数据

{

for(y=1;y<=8;y++)//处理一组数据8Byte

{

chubu=chubus[z];

jieguo=jieguo>>1;

if(chubu>3) jieguo=jieguo|0x80;//大于15mS为1

z++;

}

jieguos[x]=jieguo;

jieguo=0;

}

dataover=1;

}

void delay(uint z)

{

uint x ,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display()

{

uchar gao,gao1;

uchar di,di1;

uchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

gao1=table[jieguos[0]/16];

di1=table[jieguos[0]%16];

gao=table[jieguos[2]/16];

di=table[jieguos[2]%16];

dula=1;

P0=gao1;

dula=0;

P0=0xff;

wela=1;

P0=0x7e;

wela=0;

delay(2);

dula=1;

P0=di1;

dula=0;

P0=0xff;

wela=1;

P0=0xfd;

wela=0;

delay(2);//地址码

dula=1;

P0=gao;

dula=0;

P0=0xff;

wela=1;

P0=0x77;

wela=0;

delay(2);

dula=1;

P0=di;

dula=0;

P0=0xff;

wela=1;

P0=0x6f;

wela=0;

delay(2);//指令码

}

void main()

{

initial();//初始化

while(1)

{

if(overflag)//数据接收完毕

{

chulidata();//处理数据,完成标志dataover

overflag=0;

}

if(dataover)

{

display();//数码管显示

}

}

}

单片机采用外部中断P33管脚和红外接收头的信号线相连,中断方式为边沿触发方式。并用定时器0计算中断的间隔时间,来区分前导码、二进制的“1”、“0”码。并将8位 *** 作码提取出来在数码管上显示。

// 解码值在Im[2]中,当IrOK=1时解码有效。 

/ 51单片机红外遥控解码程序 /

//用遥控器对准红外接收头,按下遥控器按键,在数码管前两位上就会显示对应按键的编码

#include <reg52h>

#define uchar unsigned char 

sbit dula=P2^6;

sbit wela=P2^7;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar f;

#define Imax 14000    //此处为晶振为110592时的取值, 

#define Imin 8000    //如用其它频率的晶振时,

#define Inum1 1450    //要改变相应的取值。

#define Inum2 700 

#define Inum3 3000

unsigned char Im[4]={0x00,0x00,0x00,0x00};

uchar show[2]={0,0};

unsigned long m,Tc;

unsigned char IrOK;

void delay(uchar i)

{

  uchar j,k; 

  for(j=i;j>0;j--)

    for(k=125;k>0;k--);

}

void display()

{

   dula=0;

   P0=table[show[0]];

   dula=1;

   dula=0;

   wela=0;

   P0=0xfe;

   wela=1;

   wela=0;

   delay(5);

   P0=table[show[1]];

   dula=1;

   dula=0;

   P0=0xfd;

   wela=1;

   wela=0;

   delay(5);

} //外部中断解码程序

void intersvr1(void) interrupt 2 using 1

{

 Tc=TH0256+TL0;                                               //提取中断时间间隔时长

 TH0=0; 

    TL0=0;              //定时中断重新置零

 if((Tc>Imin)&&(Tc<Imax))

      { 

  m=0;

        f=1;

  return;

      }       //找到启始码

   if(f==1)

      {

        if(Tc>Inum1&&Tc<Inum3) 

    {

   Im[m/8]=Im[m/8]>>1|0x80; m++; 

       }

      if(Tc>Inum2&&Tc<Inum1) 

        {

         Im[m/8]=Im[m/8]>>1; m++; //取码

  }

  if(m==32) 

   {

         m=0;  

         f=0;

         if(Im[2]==~Im[3]) 

      {

           IrOK=1; 

   }

        else IrOK=0;   //取码完成后判断读码是否正确

     }

               //准备读下一码

   }

}

/演示主程序/

void main(void)

{

    unsigned int  a;

 m=0;

    f=0;

 EA=1;

 IT1=1;EX1=1;

 TMOD=0x11;  

 TH0=0;TL0=0;

 TR0=1;//ET0=1;

 while(1)

 {

       if(IrOK==1) 

  {

      show[1]=Im[2] & 0x0F;     //取键码的低四位

           show[0]=Im[2] >> 4;  

           IrOK=0;

  }

           for(a=100;a>0;a--)

          {

    display();

   }

 }

}

解码程序这个就能实现

嗯,有这个想法很不错,我提几个我的思路,你参考下:

一般红外发送与红外接收,它们都是配套的,就是发送的频率必须接收的频率相同,否则接收不成功,我们大都使用的是HT6221,它发送的是38KHz的红外信号频率,接收头也只能接收38KHz频率的信号,那么根据这一点,你首先要看看遥控器的参数,它输出的频率是多少,然后选择红外接收头时就只选择这种频率下的,其他频率的接收头都无效。

有了接收头,接下来你要查看该遥控器发送红外信号的波形图,把波形图中的各种信号弄清楚,它是什么信号。

对红外解码有了基本思路之后,你要用单片机设计程序来解码,使用定时器计算接收信号的时间,外部中断捕捉红外信号的数据段,然后把各种信号在一定的时间范围之内译成数字数据,将这个数据用LCD1602显示出来。

大概思路就这样,不懂的地方可以随时回复我。

希望我的回答能帮助到你。

遥控器是一种用来远控机械的装置。现代的遥控器,主要是由集成电路电板和用来产生不同讯息的按钮所组成。下面一起来看看红外遥控器原理以及遥控器原理图吧。

红外遥控器原理

红外线遥控系统一般由发射器和接收器两部分组成。发射器由指令键、指令信号产生电路、调制电路、驱动电路及红外线发射器组成。当指令键被按下时,指令信号产生电路便产生所需要的控制信号,控制指令信号经调制电路调制后,最终由驱动电路驱动红外线发射器,发出红外线遥控指令信号。

接收器由红外线接收器件、前置放大电路、解调电路、指令信号检出电路、记忆及驱动电路、执行电路组成。当红外接收器件收到发射器的红外指令信号时,它将红外光信号变成电信号并送到前置放大电路进行放大,再经过解调器后,由信号检出电路将指令信号检出,最后由记忆电路和驱动电路驱动执行电路,实现各种 *** 作。

控制信号一般以某些不同的特征来区分,常用的区分指令信号的特征是频率和码组特征,即用不同的频率或者编码的电信号代表不同的指令信号来实现遥控。所以红外遥控系统通常按照产生和区分控制指令信号的方式和特征分类,常分为频分制红外线遥控和码分制红外线遥控。

1 红外遥控系统发射部分

红外遥控发射器由键盘矩阵、遥控专用集成电路、驱动电路和红外发光二极管三部分组成,结构如图1所示。

当有键按下时,系统延时一段时间防止干扰,然后启动振荡器,键编码器取得键码后从ROM中取得相应的指令代码(由0和1组成的代码),遥控器一般采用电池供电,为了节省电量和提高抗干扰能力,指令代码都是经32~56kHz范围内的载波调制后输出到放大电路,驱动红外发射管发射出940nm的红外光。当发送结束时振荡器也关闭,系统处于低功耗休眠状态。载波的频率、调制频率在不同的场合会有不同,不过家用电器多采用的是38kHz的,也就是用455kHz的振荡器经过12分频得到的。

遥控发射器的信号是由一串0和1的二进制代码组成的,不同的芯片对0和1的编码有所不同,现有的红外遥控包括两种方式:脉冲宽度调制(PWW)和脉冲位置调制(PPM或曼彻斯特编码)。两种形式编码的代表分别是NEC和PHILIPS的RC-5。

2 红外遥控系统接收部分

接收部分是由放大器、限幅器、带通滤波器、解调器、积分器、比较器等组成的,比如采用较早的红外接收二极管加专用的红外处理电路的方法,如CXA20106,此种方法电路复杂,现在一般不采用。但是在实际应用中,以上所有的电路都集成在一个电路中,也就是我们常说的一体化红外接收头。一体化红外接收头按载波频率的不同,型号也不一样。由于与CPU的接口的问题,大部分接收电路都是反码输出,也就是说当没有红外信号时输出为1,有信号输出时为0,它只有三个引脚,分别是+5V电源、地、信号输出。

系统的设计

1 单片机编码发射部分

① 键盘部分

红外遥控器的发射器电路比较简单,由一个4×4矩形键盘、一个PNP驱动三极管、一个红外线发光二极管和两个限流电阻组成。要遥控哪台接收器由键盘输入,即由键盘输入要红外遥控的地址,地址经过编码、调制后通过红外发光二极管发射出去。

矩阵键盘部分由16个轻触按键按照4行4列排列,将行线所接的单片机的I/O口作为输出端,而列线所接的作为输入。当没有键被按下时,所有输出端都是高电平,代表没有键按下。有键按下时,则输入线就会被拉抵,这样,通过读入输入线的状态就可以知道是否有键被按下。

键盘的列线接到P1口的低4位,行线接到P1口的高4位,列线P10~P13设置为输入线,行线P14~P17设置为输出线。

检测当前是否有键被按下。检测的方法是使P14~P17输出为0,读取P10~P13的状态,若P10~P13为全1,则无键闭合,否则有键闭合。

去除键抖动。当检测到有键按下后,延时一段时间再做下一步检测判断。

若有键按下,应该识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P14~P17按下面4种组合依次输出1110,1101,1011,0111,在每组行输出时读取P10~P13,若全为1,则表示0这行没有键输入,否则有键闭合。由此得到闭合键的行值和列值,然后采用计算的方法或者查表的方法将闭合键的行值和列值转换成所定义的值。

为了保证每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。产生的键值放在发送数据库区,30H存放的是产生的键值,即要遥控的8位地址共1字节,31H放的是和30H中的相同的8位地址,地址码重发了一次,主要是加强遥控器的可靠性,如果两次地址码不相同,则说明本帧数据有错,应该丢弃。32H放的是00H(为了编程简单),33H放的是0FFH,一共32位数据。要发送数据时,只要到那里读取数据即可,然后调用发射子程序发送。

②载波部分

根据前面介绍的红外遥控的基本原理,红外遥控器编码调制的方法其实很简单,只要生成一定时间长的电平就可以。再通过一个38kHz载波调制便可以发射编码。载波的产生方法有多种,可以由CMOS门电路RC振荡器构成,或者由555时基电路构成等。

在此次设计中采用的是CPU延时,即用定时器中断完成,用单片机的T0定时产生38kHz载波。设定定时器为方式2,即自动恢复初值的8位计数器。TL0作为8位计数器,TH0作为计数初值寄存器,当TL0计数溢出时,一方面置1溢出标志位TF0,向CPU请求中断,同时将TH0内容送入TL0,使TL0从初值开始重新加1计数。因此,T0工作于方式2,定时精度比较高。根据计算,设定38KHz的定时初值,采用12kHz晶振的定时初值为0F3H,用110592kHz晶振时的初值为0F4H,设定好定时器中断,在中断程序中只写入取反P20(CPL P20),当要发送数据1时,前面560μs高电平发送时,先打开定时器中断,再启动定时器,允许定时器工作,延时560μs再关定时器,后面1690μs的低电平因为不发送信号,所以可以直接置P20高电平后,延时1690μs即可;数据0前面的560μs高电平和数据1的一样,后面560μs的低电平因为不发送信号,所以可以直接置P20高电平后,延时560μs即可。

2 红外接收解码电路

红外遥控接收采用一体化红外接收头,它将红外接收二极管、放大器、解调、整形等电路安装在一起,只有三个引脚。红外接收头的信号输出端接单片机的INT0端,单片机中断INT0在红外脉冲下降沿时产生中断。电路如图33所示,图中增加一只PNP三极管对输出信号放大,R和C组成去耦电路抑制电源干扰。

3 遥控信号的解码算法

平时,遥控器无键按下时,红外发射二极管不发出信号,遥控接收头输出信号1,有键按下时,0和1的编码的高电平经遥控接收头反相后会输出信号0,由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。

遥控码发射时由9ms的高电平和 45ms的低电平表示引导码,用560μs的高电平和560μs的低电平表示数据“0”,用560μs的高电平和1690μs的低电平表示数据“1”,引导码后面是4字节的数据。接收码是发射码的反向,所以判断数据中的高电平的长度是读出数据的要点,在这里用882μs(560~ 1690μs之间)作为标尺,如果882μs之后还是高电平则表示是数据1,将1写入寄存器即可(数据为1时还需要再延时一段时间使电平变低,用来检测下一个低电平的开始)。882μs后电平为低电平则表示是数据0,则将0写入寄存器中,之后再等待下一个低电平的到来。

继续接收下面的数据,当接收到32位数据时,说明一帧数据接收完毕,然后判断本次接收是否有效,如果两次地址码相同并且等于本系统的地址码,数据码和数据反码之和等于0FFH,则接收的本帧数据有效,点亮一只发光二极管,否则丢弃本次接收到的数据。

接收完毕后,初始化本次接收到的数据,准备下次遥控接收。

以上就是小编为大家介绍的遥控器原理,希望能够帮助到您。更多关于遥控器原理的相关资讯,请继续关注土巴兔学装修。

土巴兔在线免费为大家提供“各家装修报价、1-4家本地装修公司、3套装修设计方案”,还有装修避坑攻略!点击此链接:

有两种方法 1 使用拷贝机 具体 *** 作方法 装上电池 把拷贝机面板上的磁性钥匙(细钢丝绳上绿色的)放入凹槽里插入遥控器六针插孔里面 按下123任意一个按键是读取程序 要将程序复制到新遥控里 要把线头拔掉插入到新遥控器 再把拷贝机面板磁性钥匙从凹槽里拿开 按下刚才的相同的按键 等指示灯不闪了就好了 注意拷贝机要上电池 遥控器或者发射器不能带吊不能带电池 切记   拷贝机只能复制程序  要修改功能设定得用我们公司的数据线 具体可以再咨询我手机或者微信 线面给你看看实物图

                                   还有一种方法就是用数据线 但是要配合电脑使用 数据线可以对禹鼎遥控进行配对和功能设定  下面是实物图

                               

以上就是关于红外线遥控器解码C语言程序代码 SM0038接受头全部的内容,包括:红外线遥控器解码C语言程序代码 SM0038接受头、51单片机红外解码C程序、关于红外遥控器解码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9455708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存