一:按鍵控制LED燈
????????STM32的第三課,我們來學(xué)習(xí)如何使用按鍵來控制LED燈的亮滅。上一節(jié)課我們通過代碼控制了LED的狀態(tài),但是還是處于一種較為低級的方式控制LED燈,缺少交互性,用按鍵進行控制屬于更高的一個層次。然后我們將學(xué)習(xí)通過光敏傳感器控制蜂鳴器的通斷,讓我們的學(xué)習(xí)之路更加有趣、精彩。
1.1 初始化函數(shù)代碼的編寫?
? ? ? ? 首先編寫LED小燈的初始化函數(shù)代碼,用于初始化將要控制LED小燈的I/O口。
? ? ? ? 首先,在工程文件中先創(chuàng)建一個名為Hardware的文件夾,用于存放我們將要配置的系統(tǒng)文件。
? ? ? ? ?同樣,在魔術(shù)棒里面,配置Hardware文件夾的頭文件路徑,用于使用自己編寫的頭文件驅(qū)動程序。此處再演示一下如何進行配置。
? ? ? ? 第一步:先在工程文件中創(chuàng)建名為Hardware的文件夾。
第二步,在三個小箱子里面添加名為Hardware的文件,用于存放編寫的驅(qū)動代碼。?
????????然后右鍵左側(cè)剛添加的Hardware文件夾,選擇添加新文件到Hardware?????????然后依次選擇.c文件,名稱填LED,點Add再選擇下面的.h文件,名稱也填LED,點Add,這樣我們就在Hardware文件夾里面創(chuàng)建了兩個配置驅(qū)動的文件了。
?????????同時按照同樣的思路,再創(chuàng)建一個Key.c和Key.h的兩個驅(qū)動文件放在Hardware文件夾里,用于配置按鍵的驅(qū)動。
????????在魔術(shù)棒里添加上Hardware的頭文件地址即可。
? ? ? ? 在驅(qū)動文件LED.c文件里,主要編寫驅(qū)動文件的函數(shù),用于在主函數(shù)main.c文件里面直接引用。把所有想實現(xiàn)的功能都編寫成函數(shù)有利于代碼的檢查和移植。LED.h文件主要編寫對外引用函數(shù)的代碼,這就是.c文件和.h文件的主要區(qū)別。
? ? ? ? ? 在驅(qū)動文件LED.c文件里,首先編寫初始化函數(shù)的代碼,然后再編寫相關(guān)功能的代碼,比如說LED_ON\LED_OFF、LED_Turn,分別代表LED燈的亮滅和電位翻轉(zhuǎn)。詳細(xì)代碼見如下所示:
LED.c
#include "stm32f10x.h"
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_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_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
void LED2_Turn(void)
{
if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == 0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
}
????????LED.h文件里主要放置LED.c文件中的函數(shù)對外引用,直接把函數(shù)的名稱拿過來即可。但是LED.h文件首先要寫上防止重復(fù)引用的函數(shù),都是一個套路,所有的.h文件里面都要寫。詳細(xì)代碼如下:
LED.h
#ifndef __LED_H
#define __LED_H
void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);
void LED1_Turn(void);
void LED2_Turn(void);
#endif
這樣一來LED小燈的驅(qū)動代碼就寫好了。
然后我們再來配置按鍵的驅(qū)動代碼LED.c和LED.h的代碼內(nèi)容。
LED.c代碼也是需要我們編寫相關(guān)功能的驅(qū)動代碼函數(shù),首先編寫初始化函數(shù),結(jié)構(gòu)和上文LED.c的初始化函數(shù)大同小異,只有引腳端口號不一樣而已。然后編寫按鍵的數(shù)據(jù)讀取函數(shù),在這里我們使用GPIO_ReadInputDataBit函數(shù),可以直接讀取某一個引腳的電位值。按鍵需要延時20微秒用于防抖,詳細(xì)代碼如下:
Key.c
#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)
{
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 __KEY_H
#define __KEY_H
#include "stm32f10x.h" // Device header
void Key_Init(void);
uint8_t Key_GetNum(void);
#endif
這樣一來,初始化驅(qū)動文件就配置好了。
1.2 電路接線方法
1.3 主體代碼演示?
?首先我們要配置好頭文件,延時函數(shù)Delay.h也要配置上,這一點在我上一篇文章中有講到。然后初始化LED和Key,再循環(huán)函數(shù)里面編寫相關(guān)代碼即可。代碼如下:
main.c
#include "stm32f10x.h"
#include "LED.h"
#include "Delay.h"
#include "KEY.h"
uint8_t KeyNum;
int main(void)
{
LED_Init();
Key_Init();
while(1)
{
//************按鍵控制LED
KeyNum = Key_GetNum();
if(KeyNum == 1)
{
LED1_Turn();
}
if(KeyNum == 2)
{
LED2_Turn();
}
}
}
1.4 實操效果展示
?
二:光敏電阻控制蜂鳴器?
?????????光敏電阻是采用半導(dǎo)體材料制作,利用內(nèi)光電效應(yīng)工作的光電元件。它在光線的作用下其阻值往往變小,這種現(xiàn) 象稱為光導(dǎo)效應(yīng),因此,光敏電阻又稱光導(dǎo)管。
2.1 光敏電阻傳感器
?2.1.1 產(chǎn)品特性
?????????光敏電阻模塊一般用來檢測周圍環(huán)境的光線的亮度,觸發(fā)單片機或繼電器模塊等。使用寬電壓LM393比較器,信號干凈,波形好,驅(qū)動能力強,超過15mA。配可調(diào)電位器可調(diào)節(jié)檢測光線亮度。設(shè)有固定螺栓孔M3,方便安裝。
2.1.2 工作原理?
????????光敏電阻是用硫化隔或硒化隔等半導(dǎo)體材料制成的特殊電阻器,其工作原理是基于內(nèi)光電效應(yīng)。隨著光照強度的升高,電阻值迅速降低,由于光照產(chǎn)生的載流子都參與導(dǎo)電,在外加電場的作用下作漂移運動,電子奔向電源的正極,空穴奔向電源的負(fù)極,從而使光敏電阻器的阻值迅速下降。其在無光照時,幾乎呈高阻狀態(tài),暗電阻很大。
2.1.3 產(chǎn)品參數(shù)?
?????????工作電壓:DC3.3-5V
????????光敏電阻型號:5516
?2.1.4 使用說明
?????????數(shù)字量DO輸出端可以直接驅(qū)動本店繼電器模塊,由此可以組成一個光控開關(guān)。模擬量A0可以和AD模塊相連,通過AD轉(zhuǎn)換,可以獲得環(huán)境光強的數(shù)值。當(dāng)環(huán)境光線亮度達(dá)不到設(shè)定閩值時,DO端輸出高電平,當(dāng)外界環(huán)境光線亮度超過設(shè)定閩值時,DO端輸出低電平。檢測亮度可以通過電位器進行調(diào)節(jié),順時針調(diào)電位器,檢測亮度增加;逆時針調(diào)電位器,檢測亮度減少。
2.2 初始化驅(qū)動代碼的編寫?
?????????首先創(chuàng)建有關(guān)于蜂鳴器的Buzzer.c和Buzzer.h的兩個驅(qū)動文件,再創(chuàng)建有關(guān)于光敏傳感器的LightSensor.c和LightSensor.h的兩個驅(qū)動文件,按照上文的方法分別添加到Hardware文件中。
????????Buzzer.c文件主要編寫實現(xiàn)蜂鳴器響起來的代碼函數(shù),類型和上文類似,這里不再贅述。直接給出Buzzer.c和Buzzer.h的代碼。
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(GPIOA,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
? ? ? ? 關(guān)于LightSensor.c和LightSensor.h的兩個驅(qū)動文件的話,在LightSensor.c文件中內(nèi)容與上文類似,不過有關(guān)代碼部分我們只需要傳回光敏傳感器引腳的值就行。代碼如下:
LightSensor.c
#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);
GPIO_SetBits(GPIOA,GPIO_Pin_13);
}
uint8_t LightSensor_Get(void)
{
return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}
LightSensor.h
#ifndef __LIGHT_SENSOR_
#define __LIGHT_SENSOR_
void LightSensor_Init(void);
uint8_t LightSensor_Get(void);
#endif
如此一來,我們驅(qū)動文件基本上配置好了,下面只要完善主函數(shù)main.c中的代碼即可。
2.3 電路接線方法
2.4 主體代碼演示?
? ? ? ? ?相關(guān)的頭文件是必須要包含的,比如#include "stm32f10x.h"、#include "Delay.h",還有剛剛配置好的#include "Buzzer.h"、#include "LightSensor.h"等頭文件。
? ? ? ? 緊接著初始化Buzzer和LightSensor函數(shù)。
? ? ? ? 在while循環(huán)函數(shù)中,接收光敏傳感器返回的引腳電位數(shù)值,進行 if 判斷。代碼如下所示:
#include "stm32f10x.h"
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"
int main(void)
{
Buzzer_Init();
LightSensor_Init();
while(1)
{
if (LightSensor_Get() == 1)
{
Buzzer_ON();
}
else
{
Buzzer_OFF();
}
}
}
2.5 實操效果演示?
文章來源:http://www.zghlxwxcb.cn/news/detail-861481.html
與君共勉??,關(guān)注我,持續(xù)更新中~?文章來源地址http://www.zghlxwxcb.cn/news/detail-861481.html
到了這里,關(guān)于STM32第三課:按鍵控制LED燈,光敏傳感器控制蜂鳴器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!