|

今天測試了一下按鍵控制蜂鳴器,具體程序見附件
想要實現按鍵按下,蜂鳴器響,按鍵按下,蜂鳴器關的功能
這個按道理很簡單,可是實際操作時發現了程序里一個奇怪現象!!!
按鍵檢測使用的是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???是個隨記數??也不對啊,求賜教?
不能理解,所以想請教各位大佬,如覺幼稚,請多多指教。
|
|