按键抖动问题可利用Delay函数和定时器解决,Delay函数运行时,程序类似进入死时,占用较大单片机资源,定时器则无此问题。
引脚处于悬空状态时引脚电平不确定,具有一定危害,为防止此问题可从内外部解决。在单片机内部配置输出模式,或在外部加入一定的电路设置均可解决此问题。
二值化:通过电压比较器将模拟输入转换为数字电压输出(如0/1)。
两种类型的关键字均在Keil中均是正确的,一般使用stdint关键字,原关键字兼容老版本Keil软件。
需注意long与int类型数据均是32位数据。
只能用来给变量类型名换个名字,旧的名字仍然可以用。
#define与#typedef的区别:
一种数据类型,与数组类似。
用于数据打包,但可以打包多种类型的变量。注意利用typedef更改变量类型名来简化代码。
常用于打包数据的还有数组,但数组只能打包同一类型的数据。
枚举变量:成员变量的值只能从定义的集合内选取,否则会产生错误。避免如星期八之类的问题。
同样可利用#typedef来简化变量类型名以简化代码。
按键模块:
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //开启外设时钟
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;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) //按键1刚按下,Pin_1为低电平
{
Delay_ms (20); //消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) ; //若按下未松手,卡在死循环
Delay_ms (20); //消抖
KeyNum=1; //按下按键并松手,返回键码
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0) //按键1刚按下,Pin_1为低电平
{
Delay_ms (20); //消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) ; //若按下未松手,卡在死循环
Delay_ms (20); //消抖
KeyNum=2; //按下按键并松手,返回键码
}
return KeyNum;
}
蜂鸣器模块:
#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); //读取结构体变量,初始化外设
}
/**
* 函 数:蜂鸣器响
* 参 数:无
* 返 回 值:无
*/
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); //将引脚电平设置为高电平
}
if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_12) == 1) //判断引脚电平为高电平
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12); //将引脚电平设置为低电平
}
}
光敏传感器模块:
#include "stm32f10x.h" // Device header
/**
* 函 数:光敏传感器初始化
* 参 数:无
* 返 回 值:无
*/
void LightSensor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启外设时钟
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); //读取结构体变量,初始化外设
}
/**
* 函 数:获取光敏传感器状态
* 参 数:无
* 返 回 值:13号引脚电平,亮:模块在光线不足时输出高电平,指示灯不亮。光线充足时输出低电平,指示灯亮。
*/
uint8_t LightSensor_GetState(void)
{
return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13); //返回模块输出的电平值
}