• HT6221发送红外HS0038解码程序


     1 可以用,要弄懂的话就要去看看HT6221的时序图。
     2 
     3 C51的红外解码程序,可以根据需要自己修改:
     4 /////////////////////////////////////////////
     5 //12Mhz
     6 //根据自己的接线来改
     7 sbit IRIN = P3^2;         //红外接收器数据线
     8 /////////////////////////////////////////////
     9 
    10 ////////////////////////////////////////////
    11 //定义数组IRCOM,分别装解码后得到的数据
    12 //IRCOM[0]   低8位地址码
    13 //IRCOM[1]   高8位地址码
    14 //IRCOM[2]   8位数据码
    15 //IRCOM[3]   8位数据码的反码         
    16 /////////////////////////////////////////////
    17 uchar IRCOM[4]=0;
    18   
    19 #define uchar unsigned char
    20 #define uint unsigned int
    21 /********************************************/
    22 void delay014ms(unsigned char x);    //x*0.14MS 
    23 void IR_init(void);
    24 void IR_CODE(void);
    25          
    26 void delay014ms(unsigned char x)    //x*0.14MS
    27 {
    28  unsigned char i;
    29   while(x--)
    30  {
    31   for (i = 0; i<13; i++) {}
    32  }
    33 }
    34 
    35 ///////////////////////////////////////
    36 //初始化
    37 //////////////////////////////////////
    38 void IR_init(void) 
    39 {
    40    EX0=1;                 //允许总中断中断,使能 INT0 外部中断  
    41    TCON = 0x01;               //触发方式为脉冲负边沿触发      
    42    IRIN=1;                    //I/O口初始化  
    43 }
    44 
    45 /////////////////////////////////////
    46 //解码过程
    47 /////////////////////////////////////
    48 void IR_CODE(void)
    49 {
    50  unsigned char j,k,N=0;
    51      EX0 = 0;   
    52   delay014ms(15);
    53   if (IRIN==1) 
    54      { EX0 =1;
    55     return;
    56    }                           //确认IR信号出现     
    57   while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。  
    58     {delay014ms(1);}
    59 
    60  for (j=0;j<4;j++)         //收集四组数据 
    61  { 
    62   for (k=0;k<8;k++)        //每组数据有8位
    63   {
    64    while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。  
    65      {delay014ms(1);}
    66     while (!IRIN)          //等 IR 变为高电平 
    67      {delay014ms(1);}
    68      while (IRIN)           //计算IR高电平时长 
    69       {
    70     delay014ms(1);
    71     N++;           
    72     if (N>=30)
    73   { EX0=1;
    74   return;}              //0.14ms计数过长自动离开。
    75       }                        //高电平计数完毕                
    76      IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0” 
    77      if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}  //数据最高位补“1” 
    78      N=0;
    79   }
    80  }  
    81    if (IRCOM[2]!=~IRCOM[3])  //不等的话表示解码失败
    82    { 
    83  IRCOM[4]=0;
    84  EX0=1;
    85       return; 
    86     }
    87   
    88  pro();//解码成功后运行的程序
    89  EX0=1;
    90  return; 
    91 }

       所谓解码就是能用单片机把以不同宽度的脉冲区别开来,一种比较好思路就是计算两次下降沿间隔时间,当单片机外部中断1口有下降沿时中断一次,并启动定时器,定时器定50us,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。实际上,我们红外接收头收到的信号的是有毛刺的,在下降沿中断触发后,要做延时去抖处理。

  • 相关阅读:
    Storm入门(二)集群环境安装
    JAVA字符集
    JAVA中int、String的类型转换
    JAVA中int、String的类型转换
    使用字节流读写中文字符
    10个实用的但偏执的Java编程技术
    10个实用的但偏执的Java编程技术
    解析java实体类
    解析java实体类
    SSh三大框架的作用
  • 原文地址:https://www.cnblogs.com/wangh0802PositiveANDupward/p/2605468.html
Copyright © 2020-2023  润新知