打印

红外线遥控解码的问题,急!!!!!!!!!!!!!

[复制链接]
3838|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hellozgm|  楼主 | 2011-3-13 17:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg51.h>       //包含单片机寄存器的头文件
sbit IR=P3^2;           //将 IR位定义为 P3.2 引脚
unsigned char a[4];    //储存用户码、用户反码与键数据码、键数据反码
unsigned int LowTime,HighTime; //储存高、低电平的宽度  
sbit Relay=P1^3;      //将Relay 位定义为P1.3 引脚
/************************************************************
函数功能:对 4 个字节的用户码和键数据码进行解码
说明:解码正确,返回 1,否则返回0
出口参数:dat
*************************************************************/
bit DeCode(void)         
{
     
   unsigned char  i,j;
unsigned char temp;    //储存解码出的数据
for(i=0;i<4;i++)      //连续读取4 个用户码和键数据码
   {
   for(j=0;j<8;j++)  //每个码有8 位数字
    {
          temp=temp>>1;  //temp 中的各数据位右移一位, 因为先读出的
是高位数据      
0=0;         //定时器清 0
      TL0=0;         //定时器清 0
      TR0=1;         //开启定时器 T0
        while(IR==0)   //如果是低电平就等待
                ;       //低电平计时
        TR0=0;         //关闭定时器 T0
      LowTime=TH0*256+TL0;    //保存低电平宽度
      TH0=0;         //定时器清 0
      TL0=0;         //定时器清 0
      TR0=1;         //开启定时器T0
      while(IR==1)   //如果是高电平就等待
          ;      
      TR0=0;        //关闭定时器 T0
      HighTime=TH0*256+TL0;   //保存高电平宽度
      if((LowTime<370)||(LowTime>640))
           return 0;        //如果低电平长度不在合理范围,则
认为出错,停止解码   
      if((HighTime>420)&&(HighTime<620))   //如果高电平时间在
560 微秒左右,即计数 560/1.085=516次
              temp=temp&0x7f;       //(520-100=420,
520+100=620),则该位是 0
      if((HighTime>1300)&&(HighTime<1800)) //如果高电平时间在
1680 微秒左右,即计数1680/1.085=1548 次
              temp=temp|0x80;      
//(1550-250=1300,1550+250=1800),则该位是1
       }                  
    a[i]=temp; //将解码出的字节值储存在 a[i]      
               
    }           
  if(a[2]=~a[3])  //验证键数据码和其反码是否相等,一般情况下不必验证用户

  return 1;     //解码正确,返回 1
}
/************************************************************
函数功能:执行遥控功能
*************************************************************/
void Function(void)
{
   Relay=!Relay;   //对 P1.3 引脚取反,控制继电器的吸合、释放
   
}
/************************************************************
函数功能:主函数
*************************************************************/   176 / 192

void main()
{   
EA=1;        //开启总中断
   EX0=1;       //开外中断0
   ET0=1;       //定时器 T0 中断允许
   IT0=1;       //外中断的下降沿触发   
TMOD=0x01;   //使用定时器 T0 的模式 1
TR0=0;       //定时器T0 关闭
while(1)    //等待红外信号产生的中断
  ;   
}
/************************************************************
函数功能:红外线触发的外中断处理函数
*************************************************************/
void Int0(void) interrupt 0 using 0
  {
     EX0=0;      //关闭外中断0,不再接收二次红外信号的中断,只解码当
前红外信号
   TH0=0;      //定时器 T0 的高8 位清 0
   TL0=0;      //定时器 T0 的低 8 位清 0
   TR0=1;     //开启定时器T0   
   while(IR==0)          //如果是低电平就等待,给引导码低电平计时
        ;      
   TR0=0;                //关闭定时器T0      
   LowTime=TH0*256+TL0;  //保存低电平时间
   TH0=0;      //定时器 T0 的高 8 位清 0
   TL0=0;      //定时器T0 的低 8 位清 0
   TR0=1;     //开启定时器 T0
   while(IR==1)  //如果是高电平就等待,给引导码高电平计时
     ;
   TR0=0;        //关闭定时器 T0
   HighTime=TH0*256+TL0; //保存引导码的高电平长度
     
if((LowTime>7800)&&(LowTime<8800)&&(HighTime>3600)&&(HighTime<470
0))
   {
      //如果是引导码,就开始解码,否则放弃,引导码的低电平计时
        //次数=9000us/1.085=8294, 判断区间:8300-500=7800,8300
+500=8800.
        if(DeCode()==1)  
       Function();     //如果满足条件,执行遥控功能
   }
   EX0=1;   //开启外中断 EX0



各位大侠,到这里问题就来了,为什么这个这个倒数第四行的 if(DeCode()==1)中的DeCode()不论取0或1都可以执行Function();     不起任何作用呢?
O(∩_∩)O谢谢各位了!!
}

相关帖子

沙发
hellozgm|  楼主 | 2011-3-13 20:06 | 只看该作者
:(
怎么没人回复啊!自己顶一下!各路高手赶紧过来看看问题啊,拜托了!

使用特权

评论回复
板凳
hellozgm|  楼主 | 2011-3-13 20:06 | 只看该作者
:dizzy:

使用特权

评论回复
地板
hellozgm|  楼主 | 2011-3-13 20:07 | 只看该作者
自己顶起

使用特权

评论回复
5
gaoxe| | 2011-3-13 22:12 | 只看该作者
附和通过输出相位兼容?

使用特权

评论回复
6
joyme| | 2011-3-14 16:36 | 只看该作者
这个程序写得让人无语。

你IR信号通过INT0中断,你的DeCode()怎么执行,不是全乱套了吗?在执行DeCode()过程,来个下降沿不又触发中断了吗?

再说在中断里做那么多乱七八糟的事情是写单片机程序的大忌呀

使用特权

评论回复
7
q331513266| | 2011-3-14 16:59 | 只看该作者
你这样写就是都会执行……

使用特权

评论回复
8
hellozgm|  楼主 | 2011-3-14 20:55 | 只看该作者
为什么?大侠能给出修改建议吗?或者直接附上一份红外线编码程序参考一下吧!感激涕零……

使用特权

评论回复
9
haiping0823| | 2011-3-15 08:42 | 只看该作者
#include<REG51.H>
sbit Rec=P3^3;
unsigned char i,ch;
unsigned int t;
main()
{TMOD=0x01;
TR0=1;
while(1)
{while(Rec); //等待接收信号
t=(TH0<<8)+TL0; //取得脉冲宽度
if(t>200&&t<800); //是'0'码
else if(t>1100&&t<1750) //'1'码
{if(i>24)//取出最后一字节
ch|=1<<(i-25);
}
else //非0、1码,重新解码
{ch=0;i=0;}
if(i++==32) P1=ch;
while(!Rec);
TL0=0; //重新计时
TH0=0;
}
}

使用特权

评论回复
10
haiping0823| | 2011-3-15 08:48 | 只看该作者
汇编程序跟C程序你参考下。

红外解码汇编.PDF

58.55 KB

使用特权

评论回复
11
q331513266| | 2011-3-15 16:57 | 只看该作者
红外解码就是计时而已  符合要求就留下 不符合要求就是干扰   具体程式还看个人的写法……

使用特权

评论回复
12
hxlwjn| | 2011-3-15 22:20 | 只看该作者
这红外解码程序也太差了。

使用特权

评论回复
13
xfcjava2| | 2011-3-15 22:44 | 只看该作者
LZ:请注意一点就是:在中断中数据类型bit是不重入的!
       请将你的解码函数改为如下的方式就可以了:
        unsigned char DeCode(void)
         {
              ......

         }

使用特权

评论回复
14
xin289379297| | 2011-3-18 20:26 | 只看该作者
学习了

使用特权

评论回复
15
六月风0721| | 2011-3-19 19:11 | 只看该作者
这东西本人还得深究啊

使用特权

评论回复
16
zhq1986| | 2011-3-27 17:39 | 只看该作者
应该不会吧?if语句只有为真时才执行函数功能语句的,查看一下硬件

使用特权

评论回复
17
gongmaomao| | 2011-3-27 18:28 | 只看该作者
10# haiping0823
那个红外解码有C语言的么?帮忙给个

使用特权

评论回复
18
Liang118038| | 2011-10-9 21:05 | 只看该作者
if(a[2]=~a[3]) //<-这里错了应该为:if((a[2]-(~a[3]))==0)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

32

帖子

1

粉丝