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,当下次下降沿到来时我们计算定时器中断的次数,这样我们就能很好的区分不同宽度的脉冲了。实际上,我们红外接收头收到的信号的是有毛刺的,在下降沿中断触发后,要做延时去抖处理。

posted @ 2012-07-23 19:04  奔流聚海  阅读(2718)  评论(0编辑  收藏  举报