#采用stm32f103c8t6芯片
嗨嗨嗨,我又来了,这回是难度更大的红外传感器啦。我将一步步的实现红外传感器的功能,然后把实现过程写在博客里哈。
红外传感器,以前还没怎么接触过呢,先看一下它的样子。一个黑色的头头,一个白色的头头,看起来挺吓人的,不会输出模拟信号吧(没那么多模数转化接口啊啊啊啊)。查询资料后,我发现,它是输出数字信号的,当接收到发射光时就输出低电平,反之,就输出高电平。
好了,二话不说,开干。
将工程模板复制,然后再HARDEWARE下再建立一个名为infrared(红外线)的文件夹,建立.c与.h的文件,在头文件中写好INFRARED_Init()的声明。
在这个函数中,我是这么构想的。接收GPIOx与Pin两个参数,用于表示红外传感器所用的引脚,这样子写有一个好处,就是引脚可以灵活调整,就不用在更改需要使用的引脚的时候大费周章。然后再infrared.h中宏定义传感器初始化参数以及将GPIO_ReadInputDataBit宏定义成INFRARED_input。这样就在调用时,就会方便许多。但是,这样子会出现一个问题,时钟怎么初始化?我的方法是采用if…else if的方法,对与输入的不同io,采取不同的选择。
以下是代码了哦:
#infrared.h
#ifndef __INFRARED_H
#define __INFRARED_H
#include "stm32f10x.h"
void INFRARED_Init(GPIO_TypeDef* input_GPIOx, uint16_t Pin);
#define INFRARED1_init GPIOA, GPIO_Pin_1
#define INFRARED1_input GPIO_ReadInputDataBit(INFRARED1_init)
#endif
#infrared.c
#include "infrared.h"
#include "stm32f10x.h"
void INFRARED_Init(GPIO_TypeDef* input_GPIOx, uint16_t Pin)
{
GPIO_InitTypeDef GPIO_init_set;
if (input_GPIOx == GPIOA)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
else if (input_GPIOx == GPIOB)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
else if (input_GPIOx == GPIOC)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
else if (input_GPIOx == GPIOD)RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
GPIO_init_set.GPIO_Mode = GPIO_Mode_IPU;
GPIO_init_set.GPIO_Pin = Pin;
GPIO_init_set.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(input_GPIOx, &GPIO_init_set);
}
#main.c 测试代码
#include "stm32f10x.h"
#include "led.h"
#include "infrared.h"
int main(void)
{
LED_Init();
LED1_PC13_Off;
INFRARED_Init(INFRARED1_init);
while (1)
{
if (INFRARED1_input == 0)
{
LED1_PC13_On;
}
else LED1_PC13_Off;
}
}
就到这里了,红外巡线传感器基本上弄懂了,加油,继续努力。