本帖最后由 zhuomuniao110 于 2016-6-29 20:54 编辑
4.单片机如何检测这些脉冲并计算大小? 用下面两个功能: 基本思路:把红外接收头的OUT引脚与单片机中断引脚相连接,用定时器记下每次电平跳变之间的时间,通过判断时间,来获取这些码值。从而知道遥控器按了哪个键。 通过上面的思路,首先,最好用双边沿中断,双边沿中断,就是上升沿和下降沿都会发生中断,然后,我们想到了单片机的捕获功能(CAP),我们现在常用的STC51、LPC1114、STM32单片机都带有CAP捕获功能,而且都可以设置为双边沿中断。下面我们就以LPC1114为例,来写个程序。 4.1单片机CAP捕获初始化配置程序 我们以LPC1114为例,有4个CAP引脚,我们用其中的一个P1.8引脚,如下图: void IR_Init(void)
{
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16); // 打开引脚功能模块IOCON时钟
LPC_IOCON->PIO1_8 &= ~0x07;
LPC_IOCON->PIO1_8 |= 0x01; /* CT16B1 CAP0 */ 配置P1.8引脚为CT16B1_CAP引脚
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16); // 关闭IOCON模块时钟,配置完引脚功能了,关闭时钟节省耗电
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8); //打开CT16B1定时器时钟
LPC_TMR16B1->TCR = 0x02; //复位定时器
LPC_TMR16B1->PR = 49; //配置预分频器,使得1us TC+1
LPC_TMR16B1->IR = 0x10; //中断复位
LPC_TMR16B1->CCR = 0x07; // 配置CAP引脚双边沿中断
LPC_TMR16B1->TCR = 0x01; // 打开定时器,开始计时
NVIC_EnableIRQ(TIMER_16_1_IRQn); // 开启NVCI中断入口
}
上面的函数,用来配置CAP引脚。因为LPC1114的PIN9默认是GPIO功能,即P1.8,所以我们把引脚切换为CAP引脚功能。 4.2需要定义的变量 uint8_t pulse_start=0; // 脉冲开始标志
uint8_t pulse_bnum=0; // 脉冲计数器
uint8_t pulse_ok=0; // 第一次按键码标志
uint8_t key_repeat=0; // 按键的次数
uint16_t tc_buf=0; // 脉冲宽度存储
uint16_t ir_buf[64]; // 64个16位变量,用来存储9ms+4.5ms之后的4个码的电平值
uint8_t user_code_hi; // 定制码高位
uint8_t user_code_lo; // 定制码低位
uint16_t user_code; // 定制码
uint8_t key_code; // 数据码
uint8_t key_code_lo; // 数据码反码
uint8_t ir_sign; //接收到按键标志
当单片机发现9ms低电平之后,pulse_start置1。当发现9ms后面跟着4.5ms高电平之后,pulse_ok置1,当发现9ms后面跟着2.5ms高电平之后,key_repeat置1。之后出现的4个码值,一共4个字节,每个字节8个位,每个位是由一个低电平和高电平组成,这个电平的值有560us和1680us,所以需要16位的值存储,4个字节共32个位,每个位由一低一高电平,所以需要定义一个能放64个16位数据的数组。成功接收一个按键值后,ir_sign置1。
|