江协科技STM32:按键控制LED&光敏传感器控制蜂鸣器

按键控制LED

LED模块

2e507a69b8984da5a653528aa3904c8b.png

左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平

3e6c726732634bfaa6a99c443341c206.png

右上角PA0,把上拉电阻想象成弹簧

当按键松手时,引脚由于上拉作用,自然保持为高电平,当按键按下时,引脚直接接到GND,有一股无穷大的力把这个引脚往下拉,弹簧对抗不了无穷大的力,所以已经为低电平,这种情况引脚不会出现悬空状态,所以此时PA0引脚可以配置为浮空输入或者上拉输入

7fba513e45904c16a6774b8694fa7672.png

如果是上拉输入,那就会有两个上拉电阻,然后它们共同作用,这时高电平就会更强一些,对应高电平就更加稳定,不过也会有点瑕疵,当引脚被强行拉低时,损耗也就会更大一些

 

df6910b1f31e4c9db268193408c2ccd0.png

左边的PA0要设置乘下拉输入模式,当按键按下时,引脚为高电平,松开时,引脚回到默认低电平

不过最好还是设置成上拉输入模式,了解一下就行

右边的PA0需要配置下拉输入模式或浮空输入模式

总结

091f8ca2e0034ed985f48fddd35b337b.png

这两个电路接法按键按下时引脚是低电平,松手是高电平

20682bb5b3634a0e889394325cf9548d.png

这两个接法是按下时是高电平,松手是低电平

传感器模块

3452f41e86cd439487f16baea6dc2bda.png

D0数字输出随便接一个端口,比如PA0

A0模拟输出,目前不考虑

编程部分  

 

91fe6b896f474d589ddd1fc271bddc33.png

复制之前的文件夹,改成现在的按键控制LED名字

4e6b0145812c4d2bac1850be1e16e9a5.png

打开工程,然后开始修改,这里用模块化编程的思想来编写按键的程序和LED的程序

abdf91d715d348d8b010a373017634eb.png在工程文件夹新建Hardware,用来存放硬件驱动,也就是把按键程序和LED程序都放在这里面

e5af6e22cec64f1080dbc0bf9cd74d74.png然后点击这里

8167849920114b338d7b81c2cdacf2ef.png

0c6306fa6b5d4ca59e50f56c60d875f8.png

新建一个叫Hardware

97be14f957dc4f08b435e9b0e5ed1a16.png

创建成功就会出现右边这个

56eb918217f04b2b8dcd2c6ccdee26f9.png

然后点击魔术棒

287aee08c39e4e80b293f605b23667c1.png

68bd640472ed40aeb875a5e7359c5c51.png

选择C/C++,点击这个

ae8d286e064644bfa38960f7056cf5a1.png

把刚才新建的Hardwar文件夹添加到头文件的路径列表中,这样就添加了一个Hardware文件夹

a4561d45b5f54b2abbf2df82b97c898b.png

然后右键,添加新的文件

5c422e7bef4e4c5ab415228f85769567.png选择第一个,名字LED,,路径存在Hardwar文件夹里面,然后点击ADD

6ce8797a99744e769a074fa69b8c1e66.png

然后继续创建

这样就建好了LED.C和LED.h两个文件用来封装LED的驱动程序

LED.c用来存放驱动程序的主体代码

LED.H用来存放这个驱动程序可以对外提供的函数或变量的声明

e2c3beb5ba4e48fcbbfea77bb0b1c38d.png

029840c613e34fbb9c876d796bae39bf.png

然后点开.c文件,右键,选择这个

71274310737741c9a9b8cd9b88e94258.png

.h文件,要添加一个放在头文件重复包含的代码,这里格式都是固定的,我们的函数和变量声明就放在这个括号里面

4f3d2d0d5e1b453fb37cdf240d380f98.png

这里完成之后要注意在endif那块换行,不然会有警告

a92ac285d26c4af99f1f8c5f0145b152.png

然后就开始写LED.c文件开始写LED初始化函数,这个函数用来初始化LED,只要是用外设来控制一定要打开时钟,配置端口模式这写东西

1355c8fad35f41c389b1ff3003966d7d.png这个就是上个LED灯的设置模式,直接按原来的设置就行,需要改变的就是引脚,因为是两个灯,所以控制Pin_1和Pin_2

这样LED初始化代码就写完了

c9675312b4de464c802170d26fdeef28.png

这时只需要调用这个函数,LED的两个GPIO口就初始化完成了

b34d701b97e94c519e19941435b96a9b.png

因为这个函数需要被外部引用,所以复制这个函数,放到LED.h文件里面,这样就是对模块外部声明,这个函数是可以被外部调用的函数

bf067b5791bd467c91b0801e19e09512.png然后删除之前的代码,在上面写这个来声明

036366110aac480a98d85e9dc6f65642.png

然后在主函数里面直接,调用LED_Init,这样就完成了LED的初始化,然后编译,下载

2330fd44bbb942b082181366e724e4ef.png

这里就会看到灯都会亮,说明端口配置和模块化编程没有问题,亮是因为GPIO配置好了默认激素低电平

35d7c98b62d74066b2da79c4ec560ee6.png

f805c88259a14753838834bc217008a4.png

可以回到这里加上这个,这样,如果不操作LED,灯就是灭的

 

然后开始正式编写功能代码

我们需要电路和熄灭LED函数

509fe05d956349eba0fb039707677a71.png

还是在这个里面编写,这个函数就是用来点亮LED1的函数

556fe58783bd401e9c08e2cdf3054829.png

这个函数使用来熄灭LED1的函数

16bfef90ac2941909c303f06e96e9e0a.png

然后复制粘贴编写LED2,点亮和熄灭函数,把名字和引脚改一下

这就是打开和关闭LED2D函数了

20e7ec3ab7c24900a5df510da0cacc70.png然后把这四个函数放在LED.h文件声明一下,这样LED的驱动函数模块就封装好了

74e337bf56b74bdb94bfc2e12e5af628.png

然后在主函数调用

40387d9e91504a4ea2cd3676858a61fd.png

LED1就闪烁了

0811fb22d6a844ab83cac0417edf8564.png

写上LED2的

8aca17fd0a924429a831a4dc10c7761a.png

两个灯会交替闪烁

然后开始写按键部分的代码

dc3b6c2a08be46758fcc1fff7a01a634.png

还是跟之前一样在Hardware里面创建Key.C和Key.h文件

bd73438516ac4643a4f2246a81712a61.png

还是一样的操作

1ce889f2b5534ff49499522b549adbfe.png在Key.C文件创建按键初始化函数,在这里面,我们把按键的两个端口都初始化为上拉输入模式

8d96e9465cb34a0d965bdcf99ddf8156.png

时钟启动写GPIOB

第七行因为我们要读取按键,所以问你选择GPIO_Mode_IPU上拉输入

第八行因为我们按键接在了PB1和PB11口上,所以写这两个,选中1号和11号口

bee33594c7fd43729c03dfbcbac7ce1b.png

然后来写读取按键值的函数,调用这个函数就可以返回按下按键的键码,它的返回值就是uint8_t等价于unsigned char

14ce57be39b84480ace847141769cd3a.png

初始化按键返回值,然后返回KeyNum,按键键码默认给0,如果没有按键按下,就返回0,

然后写读取函数

bad44c24a79b4d8287f7ccbbe0b28be8.png

读取函数介绍

这四个GPIO的读取函数

GPIO_ReadInputDataBit 它的作用是用来读取输入数据寄存器某一个端口的输入值的,它的参数是GPIOx和GPIO_Pin,用来指定某一个端口,

cd0551166c2e4ebbb4677909642337ce.png它的返回值是uint8_t,代表这个端口的高低电平,读取按键就需要用到这个函数

GPIO_ReadInputData它的作用,它是用来读取整个输入数据寄存器的,参数只有一个GPIOx,用来指定外设,返回值是uint16_t是一个16位的数据,每一位代表一个端口值

GPIO_ReadInputDataBit它的作用是用来读取输出寄存器的某一个位,它并不是用来读取端口的输入数据的,这个函数一般用于输出模式下,用来看一下自己输出的是什么

GPIO_ReadOutputData它的作用是用来读取整个输出寄存器的 

看图来理解

648fbfd206984620ba0f870ba215a3d9.png0d3a7c60109c4afab40d8ebd74dbae13.png568e2c482f5b412d92738d0429048c26.png5db1dcce3dcf4b7da8bf9ab39d6b09b4.png所以说,如果想要输入GPIO口的话,就需要GPIO_ReadInputData,GPIO_ReadOutputDataBit这两个参数 

如果在输出模式下,想看要看现在看输出什么就用GPIO_ReadOutputDataBit,GPIO_ReadOutputData

 

这就是这四个函数的用途

回到Key.c

2e829b75c5104ce79b6b9eb0bbd3b14d.png因为需要读取外部输入的一个端口值,所以需要GPIO_ReadInputDataBit这个函数

0012ba4b118a4533aba40ca4f0c1b4c5.pngc190fcb5f66048a1a74a7e14295d674a.png上面代码意思是如果==0就代表按键按下,然后又因为按键按下有抖动所以要消抖,然后让KeyNum=1返回到函数,代表按键1按下

 

4dc6361faacc47b298aa13a433a12c33.png

复制粘贴按键1的,然后按键二改一下名字

d2ad2f507c474c73911ba1d5197ceb5a.pnga9d028a936b34920b3630b46e96b56b5.png然后再Key.h里面声明

1984eb5e2ce848229487be63c9209b53.png

然后初始化按键,并且创建全局变量KeyNum

9fea1816e91945038984fed9ce7b55bc.png然后

42d5a2f821814e2ca59a9227348e5a9c.png上面代码意思就是如果按键1按下,LED1灯亮,如果按键2按下LED2熄灭

b24ea2b98dd0415fa4f4e1c9658ca1c5.png

14c4191f81184ee1a67669f34251c6b0.png这就是这个操作了

 

我们需要的程序是按一下熄灭,再按一下点亮,也就是按键按下,LED的状态取反,所以继续编写

这就需要用到GPIO_ReadOutputBit的函数了

043b72184650400d97c798f4b0b5a111.png

c673a67f04614b4b9f792391b0a40ebc.png

87936c076e344d46ba43c55d8536e28a.png上面的函数逻辑就是,调用这个GPIO_ReadOutputBit函数,读取当前的端口的输出状态,如果当前输出0,就给它置1,否则就置0,这样就实现了端口的电平翻转

c4afb8704b2f433f8de3a4ed300a73d4.png

a5a6f724785540698c482297ec39bf63.png

然后给LED2也加上翻转的功能

08209fff00c04e70b26c62a47b2d68bd.png

然后声明一下

b56e78358ca546fe9b1333dd94dcf5bb.png

然后修改一下,就完成了

 

蜂鸣器模块

c8c1fa88707e44cba42a2147b0b8f7d0.png

还是复制文件夹,改名字

fce2db866eb64cf18f8f3791e12dd66a.png

还是一样的步骤,再Harewar文件夹,添加蜂鸣器.c和.h文件

89ea3456f6d9433c93f7a0b14617e53c.png

302599671b094cb6a083031772f7781f.png

然后还是一样的步骤

3cb26ea325d94b37ac74290508cea924.png

eb9416038d0a4672bb84a50b9e59cecd.png

逻辑跟LED.c是一样的还是开启时钟配置端口,名字改一下,改成Buzzer开头的,把引脚改成Pin_12

这样蜂鸣器的驱动程序就完成了

e34b82c68b9049edba77b88e18f8b29e.png

然后去.h文件声明一下

8252deb857a7497d9d60b378e8d773aa.png

添加这个头文件

ff331024102c4dfa8c2ea04a03d724c7.png

初始化蜂鸣器

5a0249e1ce3b4dd4a1631159296954f5.png

测试一下蜂鸣器,响就没问题,

c23648f4eb024417983c018c8d34cbee.png

然后来弄光敏传感器的模块,还是一样的步骤再Hardware里面添加传感器.c和.h文件

24e3b05f006740baba182e4153cbf28f.png

c33e34bbba564939ad5cfc7a4e60f5c4.png

还是一样的步骤

a3b63aff355846afb8bc01cda570a95f.png创建初始化传感器函数

74b4de43c3f348d3b9cea57d9590235b.png选择的是GPIOB

GPIO模式,可以选择上拉输入模式,如果这个模块始终都接在端口上,也可以选择浮空输入,只要保证引脚不会选课即可,这里选择上拉输入模式,引脚因为光敏传感器连接的是PB13号端口,所以改成Pin_13

这样初始化就完成了

8c783008fdc4476992269fa2a70d96d9.png

然后就写读取端口的函数,因为要求比较简单,所以直接写一个返回端口值的就行了

这就完成了

9b833757beec44f1babe33673afcbf9c.png

然后声明一下

0209f13df9eb4af49dca3755bbdedc6b.png

添加这个

4d07a30c206a48fab33fbd15d7f519ff.png6ec32a3c4bb7410d9694ee12fda643dc.png13行意思是如果光敏电阻感觉暗,就响,否则就不响

 

结束

 

  • 15
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值