先理解以下知识点:

1.参看程序前,先参阅博文红外NEC协议,否则程序不好理解

2.NEC协议重点查看,代码调制过程,以及逻辑“0”,逻辑“1”的高低电平时间特性

3.另外需要注意的是发送的二进制数据段与接收的二进制数据段是反向的,什么意思呢,比如发送数据1001 0001,数据与38KHZ载波发送到接收端时,接收过程是1->0->0->0->1->0->0->1,所以程序段会将数据8位不断右移(>=)。

4.中断的产生是在低电平时触发,接收信号过程是,比如逻辑0与逻辑1,在0.56ms的高电平结束时,触发中断,定时器清零计时,在下次低电平时再次触发中断,记录时间,定时器则清零记录时间到下一个中断再记录并清零,也就是两个下降沿之间的时间。

5.在课件的基础上,我已经将几乎所有知识点注释清楚了,另外附录2个重点程序段的详解,稍微用点心看,应该都能理解,

附程序代码如下:

/*-----------------------------------------------名称:遥控器红外解码数码管显示内容:按配套遥控器上1-9会在数码管上对应显示
------------------------------------------------*/
#include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit IR=P3^2;  //红外接口标志#define DataPort P0 //定义数据端口 程序中遇到DataPort 则用P0 替换
sbit wei1 = P2^4;   //定义第一位数码管
sbit wei2 = P2^5;   //定义第二位数码管
sbit wei3 = P2^6;   //定义第三位数码管
sbit wei4 = P2^7;   //定义第四位数码管
/*------------------------------------------------全局变量声明
------------------------------------------------*/unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9,共阴极。
unsigned char  irtime;//红外用全局变量bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];/*------------------------------------------------函数声明
------------------------------------------------*/void Ir_work(void);
void Ircordpro(void);/*------------------------------------------------定时器0中断处理
------------------------------------------------*/void tim0_isr (void) interrupt 1 using 1
{irtime++;  //用于计数2个下降沿之间的时间
}/*------------------------------------------------外部中断0中断处理
------------------------------------------------*/
void EX0_ISR (void) interrupt 0 //外部中断0服务函数,程序段不清楚见详解1
{static unsigned char  i;             //接收红外信号处理static bit startflag;                //是否开始处理标志位if(startflag)                         {if(irtime<63&&irtime>=33) //引导码 TC9012的头码,9ms+4.5ms(计数=定时*11.0592/12)计数=256,八位重装定时器i=0;                 //关于计算见博客定时器的定时时间计算,i=0,是保证接收到的是引导码即>=33,<63irdata[i]=irtime;         //存储每个电平的持续时间,用于以后判断是0还是1irtime=0;               //每次重新计时,等待下一个中断计时,当一个逻辑0,逻辑1的下降沿产生一次中断,记录时间i++;                      //irdata[0]记录的是引导码if(i==33){irok=1;i=0;}}else{irtime=0;startflag=1;}}/*------------------------------------------------定时器0初始化
------------------------------------------------*/
void TIM0init(void)//定时器0初始化
{TMOD=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值ET0=1;    //开中断TR0=1;
}
/*------------------------------------------------外部中断0初始化
------------------------------------------------*/
void EX0init(void)
{IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1;   //使能外部中断EA = 1;    //开总中断
}
/*------------------------------------------------键值处理
------------------------------------------------*/void Ir_work(void)//红外键值散转程序
{switch(IRcord[2])//判断第三个数码值{case 0x0c:DataPort=DuanMa[1];break;//1 显示相应的按键值case 0x18:DataPort=DuanMa[2];break;//2case 0x5e:DataPort=DuanMa[3];break;//3case 0x08:DataPort=DuanMa[4];break;//4case 0x1c:DataPort=DuanMa[5];break;//5case 0x5a:DataPort=DuanMa[6];break;//6case 0x42:DataPort=DuanMa[7];break;//7case 0x52:DataPort=DuanMa[8];break;//8case 0x4a:DataPort=DuanMa[9];break;//9default:break;}irpro_ok=0;//处理完成标志}
/*------------------------------------------------红外码值处理
------------------------------------------------*/
void Ircordpro(void)     //红外码值处理函数,处理32位的数据,这个程序段见详解2
{ unsigned char i, j, k;unsigned char cord,value;k=1;                  //irdata[0]是引导码,不用考虑,故从irdata[1]开始解码for(i=0;i<4;i++)      //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7)    //大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差value|=0x80;if(j<8)      //处理八位数据首先处理的数据在低位,最后一位在高位{value>>=1;}k++;}IRcord[i]=value;value=0;     } irpro_ok=1;//处理完毕标志位置1
}/*------------------------------------------------主函数
------------------------------------------------*/
void main(void)
{EX0init(); //初始化外部中断TIM0init();//初始化定时器wei1 = 1; //第一位数码管选通wei2 = 1; //第二位数码管选通wei3 = 1; //第三位数码管选通wei4 = 1;   //第四位数码管选通while(1)//主循环{if(irok)                        //32位数据接收完以后irok=1,在INT0中断函数内{   Ircordpro();irok=0;}if(irpro_ok)                   //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等{Ir_work();}}
}

详解1:void EX0_ISR (void) interrupt 0

理解这个程序段之前,先理解定时器T0,T0是8位自动重装的定时器,定时周期的计算为:计数=时间*11.0592/12,计数=256,因为是8位,不清楚见博文定时器的计算,得出T0计时器的irtime每0.2777ms进行+1;

数据传输过来起先是引导码,irdata[33],记录33位数据,其中irdata[0],存储的是引导码,解码是从irdata[1]开始的。

重点理解:中断的产生与定时器的计时时间,中断是下降沿后产生,此时计时器清零,并开始记录时间,知道下一次的下降沿,再次触发中断,定时器时间被记录下后,清零,再次计数。

详解2:void Ircordpro(void)

cord=irdata[k],irdata记录1个引导码+32位数据,

value期初值=0;0x80为二进制的1000 0000,cord>7

crod=7*0.2777(计数(256)=定时*11.0592/12)=1.94ms

irdata中记录的t0时间分为两个时间,逻辑1与逻辑0高电平都是0.56ms,低电平一个为0.565ms,另一个1.69ms:

0.56+0.565=1.125ms

0.56+1.69=2.25ms

如果记录的时间>1.94ms则为逻辑“1”,否则为“0”

所以当为逻辑“1”时,与0x80与位,然后右移,如果为0,继续右移,直到移动8次,得出8位的数据结果。

红外接收过程程序详解相关推荐

  1. 从程序详解拒绝服务***

    从程序详解拒绝服务*** 拒绝服务(Denial of Service,  DoS)***是最简单的网络***形式之一,它只阻止对服务或资源的访问,而不是试图窃取信息.DoS***有两种常见的形式:使 ...

  2. mysql 5.5.18下载_MySQL5.7.18下载和安装过程图文详解

    MySql下载 1.打开官网找到下载路口,这里直接给出下载的地址 2.选择64位版本 3.直接下载 MySql5.7.18.1安装过程 1   .运行安装软件,接受协议 2.选择默认安装 3.下一步到 ...

  3. linux系统设置服务开机启动3种方法,Linux开机启动程序详解

    linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图 方法2:利用命令行chkconfig命令进行设置 简要说明一下ch ...

  4. Nero刻录ISO文件的过程步骤详解

    常见的镜像文件格式有ISO.BIN.IMG.TAO.DAO.CIF.FCD. Nero刻录ISO文件的过程步骤详解(附Nero下载地址无需注册) 刻录ISO文件的软件其实很多--以Nero(德国公司出 ...

  5. Windows编程入门程序详解

    Windows编程入门程序详解 1.     程序 /************************************************************************* ...

  6. 数学建模——遗传算法步骤及程序详解

    数学建模--遗传算法步骤及程序详解 文章目录 数学建模--遗传算法步骤及程序详解 前言 一.遗传算法的基础 1.编码和解码 2.适应度函数 3.交叉 4.变异 5.选择 二.遗传算法原理步骤 1.初始 ...

  7. 【Big Data - Hadoop - MapReduce】通过腾讯shuffle部署对shuffle过程进行详解

    摘要: 通过腾讯shuffle部署对shuffle过程进行详解 摘要:腾讯分布式数据仓库基于开源软件Hadoop和Hive进行构建,TDW计算引擎包括两部分:MapReduce和Spark,两者内部都 ...

  8. 车牌识别与计算机编程,基于MATLAB的车牌识别程序详解.ppt

    基于MATLAB的车牌识别程序详解 自定义一个字符函数,用来从车牌区域中提取出7个字符,其中利用切割函数来进行切割. 程序:function [word,result]=getword(d) word ...

  9. goland 方法注释_goland 设置注释模板的过程图文详解

    网上找了一些办法 都没有说到关键点: 梳理一下设置步骤如下,以及避免的坑. 新建文件自动加注释: Preferences | Editor | File and Code Templates 打开go ...

最新文章

  1. jpa批量删除数据_EXCEL批量删除非数值数据,这么多方法你用哪一个?
  2. linux c 域名转ip函数 gethostbyname 返回结构体 hostent 简介
  3. OpenCV在ARM上的移植
  4. 2.1 DNS服务介绍和安装
  5. 转:inux shell脚本的字符串截取
  6. 收藏!40 个 CSS 布局技巧
  7. 1.3. kermit
  8. intellij导入scala工程不识别scala语言
  9. Angular 服务器端渲染的学习笔记(一)
  10. AttributeError: 'dict' object has no attribute 'iteritems' python3报错
  11. linux系统编程综合练习-实现一个小型的shell程序(四)
  12. Producer-Consumer question : OO 生产者-消费者:面向对象
  13. sql server 查询当前月份日期列表数据
  14. 7.4 SiamFC
  15. 不能创建对象qmdispatch_win7系统打开某些软件提示“Activex部件不能创建对象”的解决方法...
  16. docker 在win7电脑上的部署
  17. vue-element-template模板
  18. 我的 sfml 学习笔记
  19. 电子合同可以被打印出来吗
  20. 联想电脑一开机出现Checking Media Presence……

热门文章

  1. 配置支持Fluorine Remoting的Web应用
  2. 邮件正文及其附件的发送的C++实现
  3. Python读取HDF文件报错:ValueError: Illegal slicing argument for scalar dataspace
  4. shell中for循环拼接字符串
  5. 《惢客创业日记》2020.07.20(周一)竞聘演讲中的背后逻辑
  6. react native KeyboardAwareScrollView或者KeyboardAvoidingView失效问题解决
  7. 主营业务成本和生产成本区别
  8. 实战 - 文件上传功能:校验文件类型,文件大小,获取文件真实类型
  9. Uipath DataTable Activities功能中文描述
  10. 崩溃!P6晋升P7,又跪了!!!