stm32f103ct86红外遥控器遥控代码
时间: 2023-08-23 18:06:36 浏览: 90
stm32红外遥控参考代码
4星 · 用户满意度95%
你好,以下是一个简单的红外遥控器遥控代码示例:
```c
#include "stm32f10x.h"
#define IR_GPIO GPIOA
#define IR_GPIO_PIN GPIO_Pin_1
#define IR_TIM TIM2
uint16_t irCode; // 接收到的红外码
void IR_Init(void);
void IR_Decode(void);
int main(void)
{
IR_Init();
while(1)
{
IR_Decode();
if(irCode == 0x00FF) // 按下了遥控器的开关键
{
// 执行开关操作
}
}
}
void IR_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
// 使能GPIOA和TIM2的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// 配置GPIOA.1为输入模式
GPIO_InitStructure.GPIO_Pin = IR_GPIO_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(IR_GPIO, &GPIO_InitStructure);
// 配置TIM2为输入捕获模式
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 71;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(IR_TIM, &TIM_TimeBaseStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_ICInit(IR_TIM, &TIM_ICInitStructure);
TIM_Cmd(IR_TIM, ENABLE);
}
void IR_Decode(void)
{
static uint16_t irLastCode = 0;
static uint32_t irLastTime = 0;
uint16_t irHighTime, irLowTime, irTime;
uint32_t irCurrentTime = TIM_GetCounter(IR_TIM);
if(GPIO_ReadInputDataBit(IR_GPIO, IR_GPIO_PIN) == Bit_RESET) // 如果红外接收头没有接收到红外信号
{
irTime = irCurrentTime - irLastTime;
if(irTime > 3000 && irTime < 5000) // 如果接收到了一个红外信号的头部
{
irCode = 0;
}
else if(irTime > 1000 && irTime < 2000) // 如果接收到了一个红外信号的逻辑0
{
irCode = (irCode << 1) | 0;
}
else if(irTime > 2000 && irTime < 3000) // 如果接收到了一个红外信号的逻辑1
{
irCode = (irCode << 1) | 1;
}
irLastTime = irCurrentTime;
}
else // 如果红外接收头接收到了红外信号
{
irHighTime = irCurrentTime - irLastTime;
irLastTime = irCurrentTime;
irLowTime = irLastTime - irCurrentTime;
if(irHighTime > 100 && irHighTime < 1000 && irLowTime > 100 && irLowTime < 1000) // 如果接收到了一个符合要求的红外信号
{
irLastCode = irCode;
}
}
}
```
这是一个简单的红外遥控器接收代码,使用了定时器的输入捕获功能来计算红外信号的高电平和低电平持续时间,然后解码出红外码。需要根据具体的红外遥控器的编码格式进行修改。
阅读全文