传感器模块介绍
中间的电路是一个传感器分压电阻,C2是滤波电容,AO通过引脚4直接输出
最左边的电路是一个比较器,比较来自电位器R2的电压IN-和来自传感器分压电路的电压AO,在DO输出数字的电压。
R3所在电路是电路正常工作的显示电路,工作LED亮,R4显示数字电压的状态,R5是上拉电阻
按键的接法
第一种接法要求引脚必须是上拉输入,即悬空的时候默认高电平。第二种接法上拉输入和浮空输入都可以,上拉输出时模式时,由于有内外两个上拉电阻,引脚输出高电平更稳定
下面两种方法需要配置下拉输入
LED头文件
库函数
#ifndef __LED_H
#define __LED_H
void Init_LED(void);
#endif
C文件
#include "stm32f10x.h" // Device header
void Init_LED(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//LED都是接在GPIOA.Ctrl+ALT+空格是代码提示框
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
LED操作程序
一下程序放在LED.C中并且需要再LED.H中声明,在主函数中调用
void LED1_ON()
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF()
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==1)//这个ReadOutPut一般用于输出模式下读取输出值
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
else
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
}
GPIO_ReadOutputDateBit(GPIOA,GPIO_Pin_1)用于在输出模式下读取输出值
键盘输入头文件
Key.h头文件
#ifndef __KEY_H
#define __KEY_H
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
Key.c文件
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_Instructure;
GPIO_Instructure.GPIO_Mode=GPIO_Mode_IPU;//需要读取按键,配置成IPU上拉输入
GPIO_Instructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;
GPIO_Instructure.GPIO_Speed=GPIO_Speed_50MHz;//读模式下其实没有用
GPIO_Init(GPIOB,&GPIO_Instructure);
}
uint8_t Key_GetNum(void)
{
uint8_t keynum=0;//没有读取值默认为0
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0)//读函数,如果等于0
{
Delay_ms(20);//延时消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);//卡在这里
Delay_ms(20);
keynum=1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)//读函数,如果等于0
{
Delay_ms(20);//延时消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);//卡在这里
Delay_ms(20);
keynum=2;
}
return keynum;
}
蜂鸣器使用
.h头文件
#ifndef __LIGHT_SENSOR_H
#define __LIGHT_SENSOR_H
void Lightsensor_Init(void);
uint8_t LightSensor_Get(void);
#endif
.c文件
#include "stm32f10x.h" // Device header
void Lightsensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_Instructure;
GPIO_Instructure.GPIO_Mode=GPIO_Mode_IPU;//需要读取电平,配置成IPU上拉输入
GPIO_Instructure.GPIO_Pin=GPIO_Pin_13;//13口接光敏电阻
GPIO_Instructure.GPIO_Speed=GPIO_Speed_50MHz;//读模式下其实没有用
GPIO_Init(GPIOB,&GPIO_Instructure);
}
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}
主程序
#include "stm32f10x.h" // Device header
#include "Delay.h"//需要引用延时函数
#include "Buzzer.h"
#include "LightSensor.h"
int main()
{
Init_Buzzer();
Lightsensor_Init();
while(1)
{
if(LightSensor_Get()==1)//光线比较暗的情况
{
Buzzer_OFF();
}
else
{
Buzzer_ON();
}
}
}
总结
(1)初始化时钟
(2)定义结构体
(3)赋值结构体
(4)GPIO_Init函数将指定的外设初始化好
(5)利用八个GPIO读取函数