|
今天测试了一下按键控制蜂鸣器,具体程序见附件
想要实现按键按下,蜂鸣器响,按键按下,蜂鸣器关的功能
这个按道理很简单,可是实际操作时发现了程序里一个奇怪现象!!!
按键检测使用的是GPIO上拉输入模式,也就是空悬为高电平
这样按下按键之后检测到低电平刚好合适
按键一端接gnd,一端接PB0,PB11这里未使用
蜂鸣器是买的低电平驱动的小模块,3V到5V都兼容,这里只用到了PA1,PA2未使用
具体程序如下
这是蜂鸣器的初始化和翻转单片机程序
/********************************
#include"stm32f10x.h" // Device header
voidLED_Init(void) //也可用蜂鸣器低电平驱动代替
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDefGPIO_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);
GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);//初始设置高,防止开始低电平驱动蜂鸣器
}
void LED1_Turn(void) //蜂鸣器状态翻转程序
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==1)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
elseif(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
}
*********************************************/
这是按键的相关程序
/*****************************************
#include"stm32f10x.h" // Device header
#include"Delay.h"
void Key_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDefGPIO_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);
GPIO_SetBits(GPIOB,GPIO_Pin_1 | GPIO_Pin_11);//初始设置高,防止低电平驱动蜂鸣器
}
uint8_tGet_KeyNum(void)
{
uint8_t KeyNum = 0;//定义一个局部变量未检测为0,一定要加=0!!!
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= 11;
}
returnKeyNum;
}
**********************************************/
以下是main.c内的所有调用函数
/********************************************
#include"stm32f10x.h" // Device header
#include"Delay.h"
#include"LED.h"
#include"Key.h"
#define di 100
int main(void)
{
uint8_t KeyNum; //main函数内局部变量
LED_Init();
Key_Init();
while(1)
{
KeyNum= Get_KeyNum();
if(KeyNum==1) //PB1按键按下
{
LED1_Turn();//PA1翻转
}
}
}
*********************************************/
以上看上去确实没有问题对吧,实际上也没有问题,
因为这是我发现问题之后,修正过的程序
真正的问题在于,
原来的程序里只有一条语句与这不一样,
那就是按键的相关程序里面的
uint8_tGet_KeyNum(void)函数里的
第一行的uint8_tKeyNum = 0; 这样写达到了我的目的:按键按下,蜂鸣器响,按键按下,蜂鸣器关
原先我写的是uint8_t KeyNum;这样执行只有按着按键的时候蜂鸣器才会响???非常奇怪的现象
在我学习51单片机的过程中,老师一直对我说的是,如果定义一个变量,不给它赋初值,默认为0。
现在看起来好像是我理解有问题。。。。
uint8_tKeyNum = 0;和uint8_t KeyNum;有啥区别???
如果没有区别,为什么现象不一样???
局部变量里面定义了之后,
如果不赋值
Return 返回的难道不是0???是个随记数??也不对啊,求赐教?
不能理解,所以想请教各位大佬,如觉幼稚,请多多指教。
|
|