摘要
本系统硬件部分由电源模块、控制模块、OLED显示模块、报警模块、测距模块组成。电源模块采用78M05稳压芯片模块,目的是给单片机提供5V的稳定电压;控制模块用的是STM32F103C8T6芯片,用于控制整个测距系统的运行;显示模块用的OLED显示屏,用于显示系统所测的距离的值和报警值,单位mm和m;报警模块用的是蜂鸣器模块,在系统所测的距离值低于报警值时发出声光警报;测距模块采用的是HC-SR04超声波传感器模块,收到单片机的信号后会进行超声波的发射与接收。软件部分主要是配置各个模块的管脚及其输入输出方式,以及在何时启动各个模块的报警、采集数据的处理及传输。
功能描述:
1、采用STM32F103C8T6最小系统板。
2、OLED显示屏实时显示超声波测到的距离。
3、当超声波测出的实际距离小于设定的报警距离时就会使得蜂鸣器发出声音报警。
4、PWM输出控制LED亮暗程度。
5、测量范围:2cm--4m。
需要关注私聊!!!
实物成品图:
主要程序:
#include "stm32f10x.h"
#include "Delay.h"
#include "OLED.h"
#include "Timer.h"
#include "HCSR04.h"
#include "PWM.h"
#include "BEEP.h"
uint64_t numlen(uint64_t num)//计算数字的长度
{
uint64_t len = 1; // 初始长度为1
for(; num > 9; ++len) // 判断num是否大于9,否则长度+1
num /= 10; // 使用除法进行运算,直到num小于1
return len; // 返回长度的值
}
int main(void)
{
OLED_Init();
Timer_Init();
HC_SR04_Init();
PWM_Init();
BEEP_Init();
OLED_ShowString(1, 1, "Distance:");
while (1)
{
int Distance_mm=sonar_mm(); //获取距离测量结果,单位毫米(mm)
int Distance_m=Distance_mm/1000; //转换为米(m)为单位,将整数部分放入Distance_m
int Distance_m_p=Distance_mm%1000; //转换为米(m)为单位,将小数部分放入Distance_m_p
OLED_ShowNum(2, 1,Distance_m,numlen(Distance_m)); //显示测量结果的整数部分
OLED_ShowChar(2, 1+numlen(Distance_m), '.'); //显示小数点
if(Distance_m_p<100){ //判断是否小于100毫米
OLED_ShowChar(2, 1+numlen(Distance_m)+1,'0'); //因为单位是米,所以小于10cm时要加0
OLED_ShowNum(2, 1+numlen(Distance_m)+2,Distance_m_p,numlen(Distance_m_p)); //显示测量结果的小数部分
OLED_ShowChar(2, 1+numlen(Distance_m)+2+numlen(Distance_m_p), 'm'); //显示单位
}else
{
OLED_ShowNum(2, 1+numlen(Distance_m)+1,Distance_m_p,numlen(Distance_m_p)); //显示测量结果的小数部分
OLED_ShowChar(2, 1+numlen(Distance_m)+1+numlen(Distance_m_p), 'm'); //显示单位
}
OLED_ShowNum(3, 1,Distance_mm,numlen(Distance_mm)); //显示单位为毫米的距离结果
OLED_ShowString(3, 1 + numlen(Distance_mm), "mm");
Delay_ms(100);
PWM_SetCompare3(Distance_mm/10);
Delay_ms(10);
}
}