微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求问一下红外解码中几处不懂得地方,小妹在此感激不尽

求问一下红外解码中几处不懂得地方,小妹在此感激不尽

时间:10-02 整理:3721RD 点击:
#include<reg51.h>
#include"lcd.h"
sbit IRIN=P3^2;
unsigned char code CDIS1[13]={" Red Control "};
unsigned char code CDIS2[13]={" IR-CODE:--H "};
unsigned char IrValue[6];//1.这六个到底代表哪里的?不就四个(用户吗 用户吗 数据码 反数据吗 么)?
unsigned char Time;
void IrInit();
void DelayMs(unsigned int );
/*******************************************************************************
* 函数名         : main
* 函数功能     : 主函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void main()
{
unsigned char i;
IrInit();
LcdInit();
LcdWriteCom(0x80);  
for(i=0;i<13;i++)  
{
  LcdWriteData(CDIS1[i]);
}
LcdWriteCom(0x80+0x40);  
for(i=0;i<13;i++)  
{
  LcdWriteData(CDIS2[i]);
}
while(1)
{
  IrValue[4]=IrValue[2]>>4;     //高位  2.这些 IrValue[4], IrValue[2], IrValue[5]代表的到底是啥?还有高位地位                                                     请详细讲一下?
  IrValue[5]=IrValue[2]&0x0f;  //低位
  if(IrValue[4]>9)
  {
   LcdWriteCom(0xc0+0x09);   //3.设置显示位置,我们一般用的0x80不是显示第一行么,0x09不是在第一行吗?
   LcdWriteData(IrValue[4]+0x37); //4,将数值转换为该显示的ASCII码,也给讲一下吧
  }
  else
  {
   LcdWriteCom(0xc0+0x09);
   LcdWriteData(IrValue[4]+0x30);  
  }
  if(IrValue[5]>9)
  {
   LcdWriteCom(0xc0+0x0a);
   LcdWriteData(IrValue[5]+0x37);   
  }
  else
  {
   LcdWriteCom(0xc0+0x0a);
   LcdWriteData(IrValue[5]+0x30);  
  }
}
}         
/*******************************************************************************
* 函数名         : DelayMs()
* 函数功能     : 延时
* 输入           : x
* 输出           : 无
*******************************************************************************/
void DelayMs(unsigned int x)   //0.14ms误差 0us
{
unsigned char i;
while(x--)
{
  for (i = 0; i<13; i++)
  {
  }
}
}
/*******************************************************************************
* 函数名         : IrInit()
* 函数功能     : 初始化红外线接收
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void IrInit()
{
IT0=1;//下降沿触发
EX0=1;//打开中断0允许
EA=1; //打开总中断
IRIN=1;//初始化端口
}
/*******************************************************************************
* 函数名         : ReadIr()
* 函数功能     : 读取红外数值的中断函数
* 输入           : 无
* 输出           : 无
*******************************************************************************/
void ReadIr() interrupt 0  
unsigned char j,k;
unsigned int err;
Time=0;      
DelayMs(70);
if(IRIN==0)   
{   
  err=1000;    //5,1000*10us=10ms,超过说明接收到错误的信号,为什吗乘10微秒?
   
  while((IRIN==0)&&(err>0))  
  {   
   DelayMs(1);
   err--;
  }
  if(IRIN==1)   
  {
   err=500;   
   while((IRIN==1)&&(err>0))   //
   {
    DelayMs(1);
    err--;
   }
   for(k=0;k<4;k++)  
   {   
    for(j=0;j<8;j++)  
    {
     err=60; //600us
     while((IRIN==0)&&(err>0))
     {
      DelayMs(1);
      err--;
     }
     err=500 ;
     while((IRIN==1)&&(err>0))   
     {
      DelayMs(1
      Time++;
      err--;
      if(Time>30)//6, DelayMs(1);每循环一次,time加一,这里判断Time有没超过30次,即时间有没超过30*0.14ms,然并卵?这样有什么用?为什吗不弄成1.69?
      {
       EX0=1;
       return;
      }
     }
     IrValue[k]>>=1;   //7,还是不懂IrValue[k]
     if(Time>=8)  
     {
      IrValue[k]|=0x80
     }
     Time=0;      
    }
   }
  }
  if(IrValue[2]!=~IrValue[3])// 8,到底代表什么IrValue[2]
  {
   return;
  }
}   
}

1:多余的数组的为了数据处理。
2:取出高地位也是为了数据的转换。
3:0xC0=0x80+0x40,表示第二行,0x09表示第九小格开始。
4:+0x30和0x37是将数据的ASCII码转换为要显示的字符的ASCII码,即是加上字符`0`的ASCII码,如果大于9需要在此基础上,再加上7,原因是:字符`A`的ASCII码,比字符9大7,可查看ASCII码表。
6:写成这样是个人喜好吧。
7:是对每组数据分别进行操作。
8:检验,数据码是否等于数据码的反码。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top