本篇介绍红外解码的原理和程序的写法。

     下面来看一下,红外线是如何编码的。![这里写图片描述](https://img-blog.csdn.net/20150926130659823)

下面来具体说一下,解码的原理,每按一下遥控器的一个按键,遥控器就会发出32个“0”“1”代码(当然是通过高低电平的占空比来判断是0还是1的),具体是0,1是如何编码的上面图片中有介绍,和一个引导码,引导码的作用是告诉处理器,接下来将要开始发送代码,我们在编写程序时,当检测到引导码时,就应该准备接受数据了。32位代码中的前16位是用户识别码,不同的遥控器不相同,防止互相干扰的,后16是8为数据码,和8位数据反码。

     接下来开始介绍如何解码程序的编写。程序中用到了两个中断,一个是定时器中断,一个是外部中断。定时器中断用来准确计时,判断接受的代码是0还是1,外部中断用来准确确定定电平到来的时刻,然后开始计时。
/*********************************************************
函数功能:红外解码,用八位数码管显示红外线的按键码,便于红外控制
测试环境:hot 51学习板
编译环境:keil4
整理人:张家越  QQ:435835181
整理时间:2011-04-03
************************************************************/#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code seg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
      0x77,0x7c,0x39,0x5E,0x79,0x71  };           //0-f的段选码
unsigned char code seg_we[]={0,1,2,3,4,5,6,7};
uchar irtime,startflag,bitnum,irreceok;
uchar irdata[33];
uchar irprosok;
uchar display[8];
uchar ircode[8] ;
sbit led1=P0^1;
sbit led2=P0^2;
/************************************************************************
函数功能:延时函数,在数码管显示时使用,不需要很精确
*************************************************************************/
void delay_50us(uint t)
{uchar j;for(;t>0;t--)for(j=19;j>0;j--);
}
/**************************************************************************
函数的功能:定时器0的初始化
**************************************************************************/
void timer0init()
{TMOD=0x02;   //设置定时器工作在方式2TH0=0x00;   // TL0=0x00;   //设置定时器的初值 ET0=1;    //开定时器中断 TR0=1;    // 打开定时器 EA=1;    //开总中断
}
/************************************************************************
外部中断1的初始化
***********************************************************************/
void int1init()
{ IT1=1;      //设置触发方式为上升沿 EX1=1;      //开外部中断1 EA=1;       //开总中断
}
/**********************************************************************
定时器0的功能函数,每中断一次irtime++,用于计时
***********************************************************************/ void timer0() interrupt 1
{irtime++;      //定时器中断一次irtime++,用于计时
}
/***********************************************************************
外部中断0的处理函数,每当有低电平数据过来时,中断一次,(使用次中
断的前提是,信号线必需接在外部中断0上面,也就是P3^2口),函数功能
是,把信号从高低电平变成时间的代码放入irdata【】中
************************************************************************/
void int1() interrupt 2
{if(startflag){if(irtime>32)   //一组代码检测完毕{       bitnum=0;}irdata[bitnum]=irtime;   //把检测到的时间送到数组irdata【】中去 irtime=0;       bitnum++;if(bitnum==33)     //如果检测到bitnum=33,说明32位用户码已经检测完毕 {
    bitnum=0;     //将bitnum清零以便重新计数 irreceok=1;     //接收完毕标志位置一 }}else        //(此函数先进入else语句,跳过引导码的检测) {startflag=1;     //将开始标志位置一 irtime=0;      //设置时间初值为零 irreceok=1;      //接收完毕标志位置一 }
}/*************************************************************************
函数功能:把irdata【】中的时间代码转换成二进制代码存放在ircode【】中
**************************************************************************/ void irpros()
{uchar k=1,value,j,i;for(j=0;j<4;j++)
 {for(i=0;i<8;i++){value=value>>1;       //右移7次(第一次是00,相当于没有移位)if(irdata[k]>6)     //循环8次{
    value=value|0x80;
    }
    k++;}  ircode[j]=value;} irprosok=1;
}
/****************************************************************************函数的功能是:将ircode【】中的二进制代码转换成为16进制代码便于在数码管上显示***************************************************************************/
void irwork()
{display[0]=ircode[0]/16;display[1]=ircode[0]%16;display[2]=ircode[1]/16;display[3]=ircode[1]%16;   display[4]=ircode[2]/16;display[5]=ircode[2]%16;display[6]=ircode[3]/16;display[7]=ircode[3]%16;
}
/************************************************************************
函数功能:用数码管显示解码结果
************************************************************************/
void display1()
{uchar i;for(i=0;i<8;i++)
 {P2=seg_we[i];P0=seg_du[display[i]];delay_50us(40);}
}void main()
{timer0init();           //定时器初始化int1init();                   //外部中断初始化while(1){if(irreceok)                 //判断数据接收完毕(数组中存储的是高低电平的时间){irpros();                 //执行处理函数,将高低电平时间转化成16进制的0,1代码,存放在数组中irreceok=0;           //标志清零}if(irprosok)             //处理函数执行完毕,{irwork();                   //将存储的16进制代码分离,便于数码管显示irprosok=0;          //标志清零}display1();}
}

//在最后我再分析一下程序的编写思路,便于大家理解,一旦有按键按下,接受管接收到引导码,进入外部中断,并将高低电平的时间放入irdata【】数组中,接受完毕标志位置一,判断接受标志位,为1,进行处理函数,将高低电平转换成16进制数,处理标志位置一,判断处理标志位,为1,执行分离函数,将16进制数分离,便于数码管显示,分离完毕后显示。

编程技巧:善用标志位,是程序的层次感很强,便于阅读,修改和调试。

改程序已通过调试!

(由于本人水平有限,文中难免有错误或不妥之处,敬请读者批评指正!转载请注明出处!)

                                              联系方式:435835181@qq.com

红外遥控解码原理及代码实现相关推荐

  1. MS8006单片机开发IR红外遥控解码原理与程序实现(NEC)

    目录 一.红外遥控概述 二.红外编码规则 三.硬件实现 四.软件部分 1.软件实现原理 2.红外解码程序说明 3.高低位逆转算法说明 4.key_switch遥控按键指令识别函数说明 五.总结 一.红 ...

  2. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  3. 万能遥控程序c语言,51单片机万能红外遥控解码程序

    51hei单片机论坛里流传的遥控解码程序现在都弱爆了根本解不了现在的遥控自己写个万能红外遥控解码 本程序中需要用的头文件下载:http://www.51hei.com/mcu/2564.html // ...

  4. 基于51单片机+红外遥控解码+LCD1602显示

    红外遥控解码(NEC) 基本介绍 什么是红外线? 红外线系统的组成 发射管和接收管 红外遥控发射(载波频率) 重要介绍 NEC协议 数据格式(必看) 位定义(必看) 编写程序思路(2种) 方式一 方式 ...

  5. HT6221红外遥控解码设计

    项目名称 HT6221红外遥控解码设计 具体要求 接收红外按键的数据在ISSP上观察 设计说明 下图为红外遥控器及按键图.红外接收头有三个引脚,电源.地和信号输出. HT6221芯片的红外遥控发送数据 ...

  6. WAV系列之二:ADPCM编解码原理及代码实现

    参考自:<adpcm编解码原理及其代码实现> <ADPCM编码与解码学习笔记> <音频编码:ADPCM> 文章目录 1.PCM 1.1.采样 1.2.量化编码 2. ...

  7. 红外控制解码原理与实现

    背景介绍: 作为一种近距离通讯的方法,红外通讯在我们的日常生活中就有很多应用,电视遥控器,空调遥控以及风扇遥控这些都是典型应用,但是红外控制具体是怎么样实现的,这里将为大家做简单讲解. 内容概述: 1 ...

  8. 学习型红外遥控器设计(3) 红外遥控解码学习

    学习型红外遥控器设计(0) 摘要   (1) 绪论  (2) 方案设计   (3) 遥控解码   (4) 编码还原  (5) 硬件实现   (6) 总结展望 如方案设计所述,制作红外接收解码装置,该装 ...

  9. arduino 的红外遥控解码

    测试发现   遥控器的角度不一样  或者有反射  导致解析的码也不一样 程序 /** IRrecvDemo-LED* =====================功能说明================ ...

最新文章

  1. websockets_如何将WebSockets与AWS API Gateway和Lambda一起使用来构建实时应用程序
  2. 从Google Scholar看各大科技公司的科研水平
  3. 「每周CV论文推荐」 初学深度学习单图三维人脸重建需要读的文章
  4. 2017 年脑机接口研发热点回眸
  5. 单例模式中的懒汉式以及线程安全性问题
  6. iOS AppStore 申请加急审核
  7. kafka副本数据同步策略
  8. 华硕无双新品首爆:H45标压处理器+全球首款2.8K 120Hz OLED屏
  9. UVA10165 Stone Game【Nim游戏】
  10. 复合页( Compound Page )
  11. 无法访问。您可能没有权限使用网络资源。请与这台服务器的管理员联系查明你是否有访问权限。
  12. 升级Monterey的血泪史~~哭唧唧~~
  13. Starting sshd: Missing privilege separation directory: /var/empty/sshd
  14. angular.js:13920 Error: [$injector:unpr] Unknown provider: $scopeProvider - $scope - testServe
  15. 二、java项目常用工具类之beancopy,bean和map转换工具类
  16. 队测 逆序对 permut
  17. 深度学习(VGG模型)
  18. php数组数据量过大时报错的问题
  19. 一文看尽深度学习中的生成对抗(GAN)网络
  20. scrapy打包exe 成功详细教程

热门文章

  1. plot(matplotlib.pyplot)绘图(柱状图)(箱线图)
  2. DSP音频算法软件开发开发架构
  3. 【每日启蒙】轻松学摄影之启蒙篇
  4. JoyOI1025 单数?双数?
  5. Jenkins教程(5)使用Blue Ocean生成Pipeline
  6. Java实现发送QQ邮箱+附件
  7. 拓嘉辰丰:拼多多网店的关注人数提升有什么作用?
  8. 将Unity模型导出成.obj文件
  9. wow无法向该服务器发送信息,魔兽世界:玩家无法解决的广告刷屏,却给服务器维护解决了...
  10. 【开发工具】【git】通过关键字搜索对应的git提交日志