×
单片机 > 单片机程序设计 > 详情

HT6221发送红外HS0038解码程序

发布时间:2020-06-19 发布时间:
|

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


关键字:HT6221  发送红外  HS0038  解码程序

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式