赞
踩
目录
震动感应灯在生活中常见,本次通过设计震动感应灯程序来实现:震动->灯亮的现象。以此来学习记录知识:震动感应灯涉及了I/O口的输入/输出模式、传感器外设与单片机线路的连接。
1、STM32F103C8T6芯片;
2、震动传感器;
本次使用SW-420 常闭型震动传感器(2-3块钱一个)。
3、LED灯(3块钱100个)。
1、使用说明
2、完整接线图
实物接线图:
3、震动传感器原理图与开关原理图
想要达到的效果:有震动后,LED灯出现常亮或者闪烁现象(常亮或者闪烁由代码决定)。
源码:
1、main.c
- #include "stm32f10x.h" // Device header
- #include "Shake_Init.h" //引入文件
- #include "Led_Init.h"
- #include "Delay.h"
-
- int main(void)
- {
- Shake_Init(); //震动传感器初始化配置
- Led_Init(); //Led初始化配置
-
- while(1)
- {
- //如果检测到GPIOA部分的3口输入为高电平,即检测到有震动,灯灭
- if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3) == 1)
- {
- //延迟500us达到闪烁的现象
- Delay_us(500);
- GPIO_ResetBits(GPIOA, GPIO_Pin_0);
- }
- else
- {
- //延迟500us达到闪烁的现象
- Delay_us(500);
- GPIO_SetBits(GPIOA, GPIO_Pin_0);
- }
- }
- }
-
2、Led.c/h
- #include "stm32f10x.h" // Device header
-
- void Led_Init(void)
- {
- //开启外设时钟控制
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- //定义结构体并赋值
- GPIO_InitTypeDef GPIO_InitStruct;
- //模式选择为输出模式,给LED灯赋高低电平来控制亮灭
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 ;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
-
- #ifndef __Led_Init_
- #define __Led_Init_
-
- void Led_Init(void);
-
- #endif
3、Shack.c/h
- #include "stm32f10x.h" // Device header
-
- void Shake_Init(void)
- {
- //开启时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
- //配置结构体
- GPIO_InitTypeDef GPIO_InitStruct;
- //模式选择输入模式的上拉输入
- //使用的震动传感器默认是低电平输出(无震动)
- //需要接受输入的高低电平信号进行判断
- GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD;
- GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
- GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStruct);
- }
- #ifndef __Shake_Init_H
- #define __Shake_Init_H
-
- void Shake_Init(void);
-
- #endif
4、Delay.c/h
- #include "stm32f10x.h"
-
- /**
- * @brief 微秒级延时
- * @param xus 延时时长,范围:0~233015
- * @retval 无
- */
- void Delay_us(uint32_t xus)
- {
- SysTick->LOAD = 72 * xus; //设置定时器重装值
- SysTick->VAL = 0x00; //清空当前计数值
- SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
- while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
- SysTick->CTRL = 0x00000004; //关闭定时器
- }
-
- /**
- * @brief 毫秒级延时
- * @param xms 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_ms(uint32_t xms)
- {
- while(xms--)
- {
- Delay_us(1000);
- }
- }
-
- /**
- * @brief 秒级延时
- * @param xs 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_s(uint32_t xs)
- {
- while(xs--)
- {
- Delay_ms(1000);
- }
- }
- #ifndef __DELAY_H
- #define __DELAY_H
-
- void Delay_us(uint32_t us);
- void Delay_ms(uint32_t ms);
- void Delay_s(uint32_t s);
-
- #endif
1、没有震动时,接在GPIOA的A0口LED灯不亮;
2、有震动时,接在GPIOA的A0口LED灯闪烁,并且DO指示灯也会闪烁(闪烁可能是因为接受到的震动不连续,或是其它原因) 。
总结:
1、接线,飞线;
2、I/O口模式选择的多样化;
3、代码优化。
如何改进?
1、硬件:使用继电器,稳定接收高低电平;
2、软件:使用中断,节省CPU;
3、硬件:加入蜂鸣器,在灯亮或闪烁时,同步响起->震动报警装置。
以上内容为学习知识总结,存在错误或者有其它问题欢迎交流指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。