求问一下红外解码中几处不懂得地方,小妹在此感激不尽
时间: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;
}
}
}
#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:检验,数据码是否等于数据码的反码。