红外遥控器
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