hi3861 OpenHarmony HX1838 红外遥控器

红外遥控器

hx1838接收头

遥控器参数::

红外遥控距离:大于8米(实际2-3米)

发射管红外波长:940Nm

晶振频率:455KHZ 的晶振

载波频率:38KHZ

编码:编码格式为 NEC

尺寸:86 * 40 * 6mm

电源:CR2025/1600mAH

接收模块设置:

S 连接 GPIP,VCC 接 +5V,GND 接 GND。

工作过程

编码格式:NEC

引导码:9ms高 - 4.5ms低 
重复码:9ms高 - 2.25ms低

数据码0:0.56ms高 - 0.56ms低
数据码1:0.56ms高 - 1.96ms低

结束码:0.63ms高 - 低

完整过程:

引导码 - 地址码8位 - 地址码反码8位 - 数据码8位 - 数据码反码8位 - 结束码

地址码默认0x00。

软件实现

遥控器按键按下,发送一组脉冲给遥控器上的红外灯,跟单片机点亮小灯的逻辑一样,高电平小灯灭,低电平小灯亮。红外光照射到接收模块上,模块就会产生电压,然后通过检索端口电压状态值,转化为接收的信息。

简单总结:遥控器发送高电平,单片机接收低电平,遥控器发送低电平,单片机接收高电平。

首先设置端口中断,在系统正常运行中,通过中断进入红外遥控的信息接收流程。

    // 设置中断
    hi_gpio_register_isr_function(
        HX_GPIO_ID, 
        HI_INT_TYPE_EDGE,   
        HI_GPIO_EDGE_FALL_LEVEL_LOW,
        Hx_Isr_Callback,
        HI_NULL);

下降沿触发中断。

当检索到端口低电平9ms接着高电平4ms 进入数据接收循环。

    time_sta = hi_get_us();

    hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);

    while(hx_vol == HX_VOL_LOW)
    {
        hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
    }

    time_end = hi_get_us();

    if( (time_end - time_sta) / 1000 == 9 )
    {
        time_sta = hi_get_us();

        while(hx_vol == HX_VOL_HIGH)
        {
            hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
        }

        time_end = hi_get_us();

        if( (time_end - time_sta) / 1000 == 4 )
        {
            // 接收数据

            memset(datas, 0, 4);

            for(hi_u8 i=0; i<4; i++)
            {
                for(hi_u8 j=0; j<8; j++)
                {
                    while(hx_vol == HX_VOL_LOW)
                    {
                        hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
                    }

                    time_sta = hi_get_us();

                    while(hx_vol == HX_VOL_HIGH)
                    {
                        hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
                    }

                    time_end = hi_get_us();

                    datas[i] = datas[i] << 1;

                    if( (time_end - time_sta) / 1000 == 1)
                    {
                        datas[i] = datas[i] + 1;                        
                    }
                }
            }

            // 检验数据

            if(datas[0] == 0x00 && datas[1] == 0xff)
            {
                datas[3] = ~datas[3];
                
                if(datas[2] == datas[3])
                {                    
                    ret_val = datas[2];
                }
            }
            
        }
    }

接收数据分为4组,每组1个字节,前2位为地址码,后2位为数据码,数据需要进行反码效验。然后循环检测退出,当高电平持续5ms以上时可以认为是发送结束。

    // 退出

    static hi_u8 exit = 0;

    while(1)
    {
        exit = 0;

        while(hx_vol == HX_VOL_LOW)
        {
            hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
        }

        while(hx_vol == HX_VOL_HIGH)
        {
            if(exit > 10)
            {
                return ret_val;
            }

            exit++;
            
            hi_udelay(500);
            
            hi_gpio_get_input_val(HX_GPIO_ID, &hx_vol);
        }

    }

测试单片机时无法跟单片机通信,可以通过遥控器对单片机进行简单控制。遥控信息的接收过程,尽量简洁短小,不影响到主业务流程。现在能简单嵌入到一般实验中,效率还是有待提高,暂时这个状况。

代码下载:

链接:https://pan.baidu.com/s/10qeBwlD2jovB2XgTJFrSTw?pwd=06at 
提取码:06at 

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值