一、按键和传感器
1、按键和传感器原理
基本的传感器分压电路,N1是可变电阻,C2接地,应该是滤波电容,N1和R1对VCC进行分压,当N1电阻为0,下拉作用最大,此时输出为低电平0V。当N1无穷大,等效断路,VCC上拉输出。N1对VCC进行分压,实际为VCC/(N1/(R1+N1)),AO点的电平为减去R1分压后的电平,即N1电平。
二值化芯片,对输出电平进行二值化,使用LM393(内部为电压比较器(运算放大器电路)),IN+输入模拟量,运算放大器进行二值化,IN-的滑动变阻器用于对LM393输入二值化阈值。对IN-和IN+比较就能生成输出。
AO为模拟电压输出,DO为二值化数字电压输出,R5的上拉VCC用于保证LED2电路的默认输入为高电平。LED2为低电平输出显示灯,LED1为供电指示灯。
对于四个传感器来说,使用不同的电阻即可为不同的传感器。
2、按键和传感器电路
一般按键使用上面两个电路,一般单片机没有下拉模式。使用默认上拉或者外部上拉电阻电路。这样低电平导通。(猜测为STM32内部上拉驱动弱一些,这样低电平导通的按钮驱动能力相对就较强,使用起来更稳定)
若使用内部上拉,需要配置上拉输入模式。若使用外部上拉电路,可使用浮空输入模式。
3、c基础
枚举变量只能为枚举中的值,若定义时不赋值,默认从0开始。
4、按键控制LED
main.c
#include "stdio.h"
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
int main(){
LED_Init();
while(1){
//LED
GetButton();
}
return 0;
}
LED.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void LED_Init(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_0 | GPIO_Pin_1);
}
void LED_Reversa(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin){
if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == RESET){
GPIO_WriteBit(GPIOx,GPIO_Pin,1);//取反
}else{
GPIO_WriteBit(GPIOx,GPIO_Pin,0);//取反
}
}
void GetButton(void){
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == RESET){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12) == RESET);
Delay_ms(20);
LED_Reversa(GPIOA,GPIO_Pin_0);
}else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == RESET){
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13) == RESET);
Delay_ms(20);
LED_Reversa(GPIOA,GPIO_Pin_1);
}
}
LED.h
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h" // Device header
void LED_Init(void);
void GetButton(void);
void LED_Reversa(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);//取反
#endif