HX1838

2019-07-16 04:01发布

想学一下红外的控制,但是不知道怎样编程控制HX1838,有没有这个资料及程序,帮助一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
lstcspring
2019-07-16 05:07
基于HX1838(HS0038)与STC10F04单片机的红外遥控器的读码程序) //此程序在硬件上测试通过,要弄懂的话就要去看看HT6221的时序图。

//此程序可以将读到的键值,地址码通过串口发送到计算机,上位机可用串口调试助手查看。
///C51的红外解码程序,可以根据需要自己修改:

//2009年9月18日 徐学军作
////////////////////////////
//11.0592Mhz
#include<reg51.h>
//根据自己的接线来改
sbit IRIN = P3^2;         //红外接收器数据线
sbit led = P3^7;          //指示灯
////////////////////////////////////////////
//定义数组IRCOM,分别装解码后得到的数据
//IRCOM[0]   低8位地址码
//IRCOM[1]   高8位地址码
//IRCOM[2]   8位数据码
//IRCOM[3]   8位数据码的反码      
/////////////////////////////////////////////


#define uchar unsigned char
#define uint unsigned int

uchar IRCOM[4]=0;
bit flag=0;
bit flagcom=0; //串口发送标志
/********************/
void delay014ms(unsigned char x);    //x*0.14MS
void IR_init(void);
      
void delay014ms(unsigned char x)    //x*0.14MS STC10F04延时约0.15MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<125; i++) //13
     {;}
}
}
///////////////
//初始化
////////////
void IR_init(void)
{
   EA=1;
   EX0=1;                 //允许总中断中断,使能 INT0 外部中断
   IT0=1;               //触发方式为脉冲负边沿触发   
   IRIN=1;                    //I/O口初始化
}
//////////
//解码过程
//////////////
void IR_CODE(void) interrupt 0   //在外部中断子程序中解码
{
unsigned char j,k,N=0;
     EX0 = 0;
delay014ms(15);
if (IRIN==1)
     { EX0 =1;
    return;
   }                           //确认IR信号出现   
while (!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
    {delay014ms(1);}
for (j=0;j<4;j++)         //收集四组数据
{
for (k=0;k<8;k++)        //每组数据有8位
{
   while (IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
     {delay014ms(1);}
    while (!IRIN)          //等 IR 变为高电平
     {delay014ms(1);}
     while (IRIN)           //计算IR高电平时长
      {
    delay014ms(1);
    N++;         
    if (N>=30)
{ EX0=1;
return;}              //0.14ms计数过长自动离开。
      }                        //高电平计数完毕              
     IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补"0"
     if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //数据最高位补"1"
     N=0;
}
}
   if (IRCOM[2]!=~IRCOM[3]) //不等的话表示解码失败
   {
IRCOM[4]=0;
EX0=1;
      return;
    }
   flagcom = 1;    //正确解码后,置串口发送标志
   flag = !flag;//pro();//解码成功后运行的程序
EX0=1;
return;
}


//主程序

void main(void)
          {
       unsigned char k;
       IR_init( ); //初始化外部中断0
                  
                  SCON=0x50;    //串口 方式 1
                 TMOD=0x20;    //T1 方式 1
                TL1=0xfd;    //波特率 9600 的常数
                 TH1=0xfd;
                 TR1=1;     //开定时器1
     flag = 0;
     while(1)
           {
         led=flag;         
                   if(flagcom)
         {
          flagcom = 0;
         for(k=0;k<4;k++)
          {
               SBUF=IRCOM[k];   //串口输出键盘输入的值                    
                     while(TI==0); //是否发送完毕
                     TI=0;
          }
        }
       }
    }

一周热门 更多>