单片机红外解码程序有几个不懂得问题
为什么后面的数据为什么要进行要进行右移和最高位补1呢voidIR_IN()interrupt2using0//定义INT2外部中断函数{unsignedcharj,k,N...
为什么后面的数据为什么要进行要进行右移和最高位补1呢
void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数
{
unsigned char j,k,N=0; //定义临时接收变量
EX1 = 0; //关闭外部中断,防止再有信号到达
delayms(15); //延时时间,进行红外消抖
if (IRIN==1) //判断红外信号是否消失
{
EX1 =1; //外部中断开
return; //返回
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delayms(1); //延时等待
}
for (j=0;j<4;j++) //采集红外遥控器数据
{
for (k=0;k<8;k++) //分次采集8位数据
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
delayms(1); //延时等待
}
while (!IRIN) //等 IR 变为高电平
{
delayms(1); //延时等待
}
while (IRIN) //计算IR高电平时长
{
delayms(1); //延时等待
N++; //计数器加加
if (N>=30) //判断计数器累加值
{
EX1=1; //打开外部中断功能
return; //返回
}
}
IRCOM[j]=IRCOM[j] >> 1; //进行数据位移操作并自动补零
if (N>=8) //判断数据长度
{
IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补1
}
N=0; //清零位数计录器
}
}
if (IRCOM[2]!=~IRCOM[3]) //判断地址码是否相同
{
EX1=1; //打开外部中断
return; //返回
}
for(j=0;j<10;j++) //循环进行键码解析
{
if(IRCOM[2]==RecvData[j]) //进行键位对应
{
ControlCar(j); //数码管显示相应数码
}
}
EX1 = 1; //外部中断开
} 展开
void IR_IN() interrupt 2 using 0 //定义INT2外部中断函数
{
unsigned char j,k,N=0; //定义临时接收变量
EX1 = 0; //关闭外部中断,防止再有信号到达
delayms(15); //延时时间,进行红外消抖
if (IRIN==1) //判断红外信号是否消失
{
EX1 =1; //外部中断开
return; //返回
}
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delayms(1); //延时等待
}
for (j=0;j<4;j++) //采集红外遥控器数据
{
for (k=0;k<8;k++) //分次采集8位数据
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
delayms(1); //延时等待
}
while (!IRIN) //等 IR 变为高电平
{
delayms(1); //延时等待
}
while (IRIN) //计算IR高电平时长
{
delayms(1); //延时等待
N++; //计数器加加
if (N>=30) //判断计数器累加值
{
EX1=1; //打开外部中断功能
return; //返回
}
}
IRCOM[j]=IRCOM[j] >> 1; //进行数据位移操作并自动补零
if (N>=8) //判断数据长度
{
IRCOM[j] = IRCOM[j] | 0x80; //数据最高位补1
}
N=0; //清零位数计录器
}
}
if (IRCOM[2]!=~IRCOM[3]) //判断地址码是否相同
{
EX1=1; //打开外部中断
return; //返回
}
for(j=0;j<10;j++) //循环进行键码解析
{
if(IRCOM[2]==RecvData[j]) //进行键位对应
{
ControlCar(j); //数码管显示相应数码
}
}
EX1 = 1; //外部中断开
} 展开
3个回答
展开全部
当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
宿兴电子
2024-11-28 广告
2024-11-28 广告
联系我们一、有无震荡源 无源这里的“源”不是指电源,而是指震荡源。也就是说,有源蜂鸣器内部带震荡源,所以只要一通电就会叫。而无源内部不带震荡源,所以如果用直流信号无法令其鸣叫。 二、价格不同 有源蜂鸣器往比无源蜂鸣器贵,就是因为里面多个震荡...
点击进入详情页
本回答由宿兴电子提供
展开全部
当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时当高电平出现时开始延时,0.56ms以后,若读到的电平为低,说明该位为"0",反之则为"1",为了可靠起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为"0",读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可靠,一般取0.84ms左右均可。为了共用引导部分延时程序,一般用0.9ms延时。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有沙发没?我先过来歇歇脚???
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询