|

今天測(cè)試了一下按鍵控制蜂鳴器,具體程序見附件
想要實(shí)現(xiàn)按鍵按下,蜂鳴器響,按鍵按下,蜂鳴器關(guān)的功能
這個(gè)按道理很簡(jiǎn)單,可是實(shí)際操作時(shí)發(fā)現(xiàn)了程序里一個(gè)奇怪現(xiàn)象!。
按鍵檢測(cè)使用的是GPIO上拉輸入模式,也就是空懸為高電平
這樣按下按鍵之后檢測(cè)到低電平剛好合適
按鍵一端接gnd,一端接PB0,PB11這里未使用
蜂鳴器是買的低電平驅(qū)動(dòng)的小模塊,3V到5V都兼容,這里只用到了PA1,PA2未使用
具體程序如下
這是蜂鳴器的初始化和翻轉(zhuǎn)單片機(jī)程序
/********************************
#include"stm32f10x.h" // Device header
voidLED_Init(void) //也可用蜂鳴器低電平驅(qū)動(dòng)代替
{
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);//初始設(shè)置高,防止開始低電平驅(qū)動(dòng)蜂鳴器
}
void LED1_Turn(void) //蜂鳴器狀態(tài)翻轉(zhuǎn)程序
{
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);
}
}
*********************************************/
這是按鍵的相關(guān)程序
/*****************************************
#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;//上拉輸入,懸空時(shí)為高電平,適合按鍵
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//只對(duì)輸出管用,這里輸入隨便填
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_1 | GPIO_Pin_11);//初始設(shè)置高,防止低電平驅(qū)動(dòng)蜂鳴器
}
uint8_tGet_KeyNum(void)
{
uint8_t KeyNum = 0;//定義一個(gè)局部變量未檢測(cè)為0,一定要加=0。!
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)== 0)
{
Delay_ms(20);//按下消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) ==0); //沒有松手一直執(zhí)行這條
Delay_ms(20);//松開消抖
KeyNum= 1;
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)== 0)
{
Delay_ms(20);//按下消抖
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) ==0); //沒有松手一直執(zhí)行這條,用來(lái)確認(rèn)松手
Delay_ms(20);//松開消抖
KeyNum= 11;
}
returnKeyNum;
}
**********************************************/
以下是main.c內(nèi)的所有調(diào)用函數(shù)
/********************************************
#include"stm32f10x.h" // Device header
#include"Delay.h"
#include"LED.h"
#include"Key.h"
#define di 100
int main(void)
{
uint8_t KeyNum; //main函數(shù)內(nèi)局部變量
LED_Init();
Key_Init();
while(1)
{
KeyNum= Get_KeyNum();
if(KeyNum==1) //PB1按鍵按下
{
LED1_Turn();//PA1翻轉(zhuǎn)
}
}
}
*********************************************/
以上看上去確實(shí)沒有問題對(duì)吧,實(shí)際上也沒有問題,
因?yàn)檫@是我發(fā)現(xiàn)問題之后,修正過的程序
真正的問題在于,
原來(lái)的程序里只有一條語(yǔ)句與這不一樣,
那就是按鍵的相關(guān)程序里面的
uint8_tGet_KeyNum(void)函數(shù)里的
第一行的uint8_tKeyNum = 0; 這樣寫達(dá)到了我的目的:按鍵按下,蜂鳴器響,按鍵按下,蜂鳴器關(guān)
原先我寫的是uint8_t KeyNum;這樣執(zhí)行只有按著按鍵的時(shí)候蜂鳴器才會(huì)響???非常奇怪的現(xiàn)象
在我學(xué)習(xí)51單片機(jī)的過程中,老師一直對(duì)我說(shuō)的是,如果定義一個(gè)變量,不給它賦初值,默認(rèn)為0。
現(xiàn)在看起來(lái)好像是我理解有問題。。。。
uint8_tKeyNum = 0;和uint8_t KeyNum;有啥區(qū)別???
如果沒有區(qū)別,為什么現(xiàn)象不一樣???
局部變量里面定義了之后,
如果不賦值
Return 返回的難道不是0???是個(gè)隨記數(shù)??也不對(duì)啊,求賜教?
不能理解,所以想請(qǐng)教各位大佬,如覺幼稚,請(qǐng)多多指教。
|
-
-
3-3按鍵控制LED.7z
2023-2-9 22:40 上傳
點(diǎn)擊文件名下載附件
174.89 KB, 下載次數(shù): 3
|