32单片机基础:GPIO输入

这篇具有很好参考价值的文章主要介绍了32单片机基础:GPIO输入。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.1按键控制LED

按键介绍:

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

两种方式,我们一般用下接的方式。

第一个图:注意点。当按键按下,PA0接地,被置为低电平, 但是一旦按键松手,PA0悬空,引脚电压不确定。所以无论怎么读引脚也不知道知否被按下,所以为了解决这个问题,所以必须要求PA0是上拉输入的模式,这样引脚悬空的话,就会被置为高电平,这样我们我们就可以读取PA0的电压就知道按键是否被按下。

但是第二个图就不会出现问题,按下时,被置为低电平,松手,由于上拉电阻的作用,被置为高电平。这样引脚就不会出现浮空状态。所以此时PA0可以配置浮空输入和上拉输入。上拉输入,两个电阻共同作用,这样高电平就会更加稳定一些,

第三个图同样注意要使用下拉输入模式。

下面是面包板接线图:

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

用哪个端口看自己的,我这里也没按上面连接,我是接A0,A1两个端口 

采用模块化编程:

把LED的代码和按键的代码封装开来,不要一起放在主函数里。分别放在自己的.c和.h文件里。

新建一个文件夹,用来存放硬件驱动

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

 点击keil5的魔术棒: 

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

把文件夹添加进来之后,像建立main函数一样建立下图文件。 

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

LED.h用来存放这个驱动程序可以对外提供的函数或变量声明。 

按照Ctrl+Alt+空格,会弹出相应函数的提示框。

LED.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void)//打开时钟,配置端口
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,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);
}

LED.h

#ifndef __LED_H_
#define __LED_H_

void LED_Init(void);//打开时钟,配置端口

#endif

main.c

#include "stm32f10x.h"                 
#include "Delay.h"
#include "LED.h"
int main()
{
   LED_Init();
	while(1)
	{

	}
}

 这是,就会观察两个LED灯亮起来了,为啥我们没有配置高低电平,他会亮呢,因为我们的电路是低电平点亮,GPIO配置好了之后默认是低电平。

可以在初始化后面加GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);让LED熄灭。

GPIO_pin_0|GPIO_pin_1(×)p小写了

GPIO_Pin_0|GPIO_Pin_1(√)

 后面我们配置好LED开的函数,灭的函数。

LED.c

void LED_Init(void)//打开时钟,配置端口
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,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_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1);
}

void  LED0_ON(void)
{
     GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}	

void  LED0_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_0);
}

void  LED1_ON(void)
{
     GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}	

void  LED1_OFF(void)
{
	GPIO_SetBits(GPIOA,GPIO_Pin_1);
}

LED.h

#ifndef __LED_H_
#define __LED_H_

void LED_Init(void);//打开时钟,配置端口
void  LED0_ON(void);
void  LED0_OFF(void);
void  LED1_ON(void);
void  LED1_OFF(void);

#endif

 同理按上述方法,建立Key.c和Key.h

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

GPIO读取的四个函数:(按键需要读取I/O端口)

GPIO_ReadInputDataBit:这个函数是用来读取输入数据寄存器某一个端口的输入值的。

参数是 GPIOx,GPIO_Pin用来指定某一个端口,返回值是uint8_t,代表高低电平

GPIO_ReadInputData:这个函数比上一个函数少了一个Bit,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设。返回值是uint16_t,是一个16位数据,每一位代表一个端口值,

 GPIO_ReadOutputDataBit:这个函数是用来读取输出数据寄存器的某一位,所以原则来说,它并不是用来读取端口的输入数据的。这个函数一般用于输出模式下,用来看一下自己输出的是什么。

下面LED的翻转就用了这个。

GPIO_ReadOutputData:这个函数也是少了一个Bit,意思也一样,是用来读取整个输出寄存器的。

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

这就是四个函数的用途:

 Key.c

 #include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)//按键初始化,初始化为上拉输入模式
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//我们按键接到GPIOB上
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t Keynum=0;
	//读取GPIO端口
	if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==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)//表示按键按下
	{
		Delay_ms(20);//消抖
		while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);//直到松手
		Delay_ms(20);//消抖
		Keynum=2;
	}
	return Keynum;
}

Key.h

#ifndef __LED_H_
#define __LED_H_

void Key_Init(void);
uint8_t Key_GetNum(void);
#endif

main.c

#include "stm32f10x.h"                 
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main()
{
   LED_Init();
   Key_Init();
	while(1)
	{
//      LED0_ON();
//	  LED1_OFF();
//	  Delay_ms(500);
//	  LED1_ON();
//	  LED0_OFF();
//	  Delay_ms(500);
	  KeyNum=Key_GetNum();
		if(KeyNum==1)
		{
			  LED0_turn();
		}
		if(KeyNum==2)
		{
			 LED1_turn();
		}
	}
}

当然,还有Delay函数没有拿进来,自己可以写一个Delay函数,自己写代码时可以加一些注释,方便自己和他人理解,注释的规范可以参考32库函数里面的

这就是按键控制LED点亮的全部过程了。

1.2光敏传感器控制蜂鸣器

光敏电阻介绍:

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

因为电阻变化不容易直接观察,所以我们将传感器元件通常与定值电阻进行串联分压,

接地电容就是滤波用的。 滤除一些干扰,保证输出电压波形平滑

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

AO得到的是模拟电压,要想得到数字电压,要对AO进行二值化的输出,,二值化是通过芯片LM393来完成的,LM393是一个电压比较器芯片。看下图所示。电容对VCC滤波。

电压比较器就是一个运算放大器。运算放大器当做比较器的情况如下,

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件 左边的是电源指示灯,通道电就亮,

右边是DO输出指示灯,它可以指示DO的输出电平。低电平点亮,高电平熄灭。

上拉电阻R5是为了保证默认输出为高电平的。

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件 电路连接图:

 

上电时,可以看到两个灯都亮了,当我们遮住光线,输出指示灯灭,代表输出高电平(DO),松手时,输出指示灯1灭,代表输出低电平(DO),电位器可以调节高低电平的判断阈值。

Buzzer.c(蜂鸣器模块)

#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)//打开时钟,配置端口
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB,GPIO_Pin_0|GPIO_Pin_12);
}

	
void Buzzer_ON(void)
{
     GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}	

void Buzzer_OFF(void)
{
	GPIO_SetBits(GPIOB,GPIO_Pin_12);
}

void Buzzer_turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_12)==0)
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_12);
	}
	else
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_12);
	}
}

 Buzzer.h

#ifndef __BUZZER_H_
#define __BUZZER_H_

void Buzzer_Init(void);
void Buzzer_ON(void);
void  Buzzer_OFF(void);
void Buzzer_turn(void);

#endif

LightSensor.c(光敏传感器模块)

#include "stm32f10x.h"                  // Device header
#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void LightSensor_Init(void)//按键初始化,初始化为上拉输入模式
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//我们按键接到GPIOB上
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t LightSensor_Get(void)//得到DO的返回值,暗是1
{
	return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}

 LightSensor.h

#ifndef __LightSensor_H_
#define __LightSensor_H_

void LightSensor_Init(void);
uint8_t LightSensor_Get(void);

#endif

 main.c

#include "stm32f10x.h"                 
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"


int main()
{
	Buzzer_Init();
	LightSensor_Init();
	
	while(1)
	{
      if( LightSensor_Get()==1)//光线比较暗的情况
	  {
		  Buzzer_ON();
	  }
	  else
	  {
		   Buzzer_OFF();
	  }
	}
}

32单片机的C语言(与51些许不同)

数据类型 

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

 32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

在库函数用了许多。下面是例子, 

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件 只是这些不好理解,我们都换了一个让我们看得懂的名字。

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件 与上面有什么区别呢,宏定义任何名字都可以换,而typedef只能给变量类型换名字。所以宏定义的改名字范围要宽一些。

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件 这些没学好的再去学一下C语言吧。

32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件

 32单片机基础:GPIO输入,32单片机学习,单片机,嵌入式硬件文章来源地址https://www.toymoban.com/news/detail-836475.html

到了这里,关于32单片机基础:GPIO输入的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【单片机毕设选题】stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(30)
  • 单片机项目分享 基于stm32的便携用电功率统计系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月19日
    浏览(44)
  • 【单片机毕设选题】Stm32单片机的音乐播放器设计 - 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(27)
  • 单片机项目分享 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(37)
  • 【单片机毕设选题】 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(25)
  • 单片机项目分享 stm32机器视觉的口罩佩戴检测系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月22日
    浏览(29)
  • STM32毕设分享 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年04月11日
    浏览(21)
  • STM32单片机(三)第二节:GPIO输出练习3(蜂鸣器)

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2024年02月11日
    浏览(21)
  • 嵌入式(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

    上一篇文章我们介绍了嵌入式系统 嵌入式系统(Embedded System)是一种特定用途的计算机系统,它通常嵌入在更大的产品或系统中,用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成,旨在满足特定的需求,如嵌入在家电、汽车、医疗设备、工业自动化、消费

    2024年02月02日
    浏览(27)
  • 单片机毕设分享 基于STM32单片机的老人防摔倒报警系统 - 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月02日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包