GPIO输出-STM32F103C8T6

一、按键和传感器

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


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值