用STM32玩SR04(测距、串口显示、OLED显示)

开发板:STM32F103ZET6(正点原子F103核心板)

硬件:HC-SR04,随便就能买

软件:Keil MDK5.29

Gitee项目已发布,需要源码请自助下载

STM32F103ZET6:地址(gitee)

这次玩的是HC-SR04,一种超声波测距模块,便宜又好用,长着两个不知道像什么的圆柱,我买回来的长这样

买回来的时候给的资料有51的,有PLC的,就是没有STM32的,离谱,不知道你们买回来的资料是不是这样的

还好有个时序图和解析,看懂就行

图上的解释已经很清楚了,一个端口发出一段10us以上的高电平后拉低,然后模块自己检测,检测完之后在另一个端口输出一段高电平又拉低,时间跟前面发出去的时间成比例,上网查到了Trip是第一个要输一段高电平的端口,第二个端口是Echo,那么根据这个解释,我们就可以开始做程序辣

超声波模块使用

SR04初始化

先要选端口,我这里选用了这个版上的两个普通端口,分别是PC1(Trip)和PC2(Echo),如果你们想的话,也可以改,代码只需要改一点,应该没有大问题

端口代码如下:

void SR04_Init(void)
{
/* 初始化Trip */
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PC端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //Trip-->PC1端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC1 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //Echo-->PC2端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOC2 GPIO_ResetBits(GPIOC,GPIO_Pin_1); //Trip先拉低
GPIO_ResetBits(GPIOC,GPIO_Pin_2); //Echo也拉低
TIM4_Init(65535,71);
}

我在试验的时候用了定时器4来计算Echo的高电平时间,这样就不用我自己计算了

定时器初始化代码如下

void TIM4_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器3时钟 //定时器TIM4初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断 TIM_Cmd(TIM4, DISABLE); //关闭TIMx ,到时再开
}

这两个初始化就到了我们的运行逻辑了

运行逻辑代码如下

float SR04_Getlen(void)
{
Trip = 1;
delay_us(20);
Trip = 0; while(Echo == 0)
{
TIM_SetCounter(TIM4,0);
TIM_Cmd(TIM4, DISABLE);
}
while(Echo == 1)
{
TIM_Cmd(TIM4, ENABLE);
}
time = TIM_GetCounter(TIM4);
return time;
}

SR04使用串口打印数据

到了这里了就搞定了SR04的代码了,但要让他显示出来的话,还需要一些东西,我这里试试串口打印数据

代码如下

#include "sys.h"
#include "delay.h"
#include "sr04.h"
#include "led.h"
#include "usart.h" int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
SR04_Init();
uart_init(115200); float Length = 0; while(1)
{
LED0 =!LED0;
Length = (SR04_Getlen()*340/2/10000);
printf ("距离为%.2fcm \r\n",Length);
delay_ms(100);
}
}

测试的效果还是不错的

bilibili视频链接:链接

SR04使用OLED来传输数据,并显示在OLED上

要用OLED来显示数据显然要比串口好看的多,毕竟方便<(^-^)>,我使用的OLED模块仍然是之前用的技新的0.96寸,(主要是手上有一块就不想换了)

选用的端口经过查阅原理图,找到PB10(SCL)和PB11(SDA)作为IIC端口



程序主要使用了打印字符串和中文、数字,都是之前有的,我就不发了,直接看调用

调用程序如下:

void Show_float(float x);

int main(void)
{
vu8 key = 0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
SR04_Init();
OLED_Init();
KEY_Init(); float Length = 0;
unsigned char kong[] = " "; OLED_ShowCHinese(16,2,0,32,Welcome);
OLED_ShowCHinese(32,2,1,32,Welcome);
OLED_ShowCHinese(48,2,2,32,Welcome);
OLED_ShowCHinese(64,2,3,32,Welcome);
OLED_ShowCHinese(80,2,4,32,Welcome);
OLED_ShowCHinese(96,2,5,32,Welcome);
delay_ms(1000); while(1)
{
LED0 =!LED0;
key=KEY_Scan(0); //得到键值
if (key)
{
switch(key)
{
case KEY0_PRES:
OLED_Clear();
OLED_ShowCHinese(8,2,0,32,Distance);
OLED_ShowCHinese(24,2,1,32,Distance);
OLED_ShowCHinese(40,2,2,32,Distance);
OLED_ShowCHinese(56,2,3,32,Distance);
break;
}
while(1)
{
Length = (SR04_Getlen()*340/2/10000);
OLED_ShowString(72,2,kong);
Show_float(Length);
delay_ms(100);
key=KEY_Scan(0); //得到键值
if (key) break;
}
}else delay_ms(100);
}
} void Show_float(float x)
{
int temp1 = (int)x;
int temp2 = (int)((x-temp1)*10.0);
int wei1 = 0,wei2 = 0,tmp;
unsigned char dian[] = ".";
unsigned char danwei[] = "cm";
tmp = temp1;
while(tmp != 0)
{
tmp/=10;
wei1++;
}
tmp = temp2;
while(tmp != 0)
{
tmp/=10;
wei2++;
}
OLED_ShowNum(72,2,temp1,wei1,16);
OLED_ShowString(72+wei1*8,2,dian);
OLED_ShowNum(72+wei1*8+8,2,temp2,wei2,16);
OLED_ShowString(72+wei1*8+8+wei2*8,2,danwei);
}

OLED打印的效果就更好辣

bilibili视频链接:链接

这个文章到这里就结束啦,在这里提前祝大家五一假期过的开心呀~~

用STM32玩SR04(测距、串口显示、OLED显示)的更多相关文章

  1. 用STM32玩OLED(显示文字、图片、动图gif等)

    目录 用STM32玩OLED(显示文字.图片.动图gif等) 1. 显示字符串 2. 显示中文 3. 显示图片 4. 显示动图 5. 总结测试 用STM32玩OLED(显示文字.图片.动图gif等) ...

  2. 基于STM32的脉搏心率检测仪(OLED可以实时显示脉冲波形)

    —设计完整,功能可全部实现,有完整报告文档说明.程序以及pcb文件— 可作为:课程设计,STM32实践学习,电子制作等 设计所实现的功能: 利用STM32的AD采集功能实时采集心率传感器信号输出引脚输 ...

  3. 玩转X-CTR100 l STM32F4 l OLED显示-SSD1306无字库

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      OLED显示屏具有自发光特性,不需要背光, ...

  4. 致敬学长!J20航模遥控器开源项目计划【开局篇】 | 先做一个开机界面 | MATLAB图像二值化 | Img2Lcd图片取模 | OLED显示图片

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  5. 灵感手环第一步——0.96寸OLED显示实验

    这算是我这个系列的第一篇博客吧.首先要解决的就是屏幕显示问题.我选择了目前新兴起的OLED显示模块. OLED(OrganicLightEmittingDiode),中文译作有机发光二极管,目前被广泛 ...

  6. ESP8266开发之旅 应用篇② OLED显示天气屏

    1.前言     这一篇,博主将教大家怎么去实现一个简易版本的天气助手.     先来一个博主已经实现功能的图片,如下: 1.1 知识储备     本篇需要用到以下知识点: 运用到ArduinoJso ...

  7. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  8. C#上位机串口控制12864显示

    实现的效果 上面是用Proteus仿真的,,对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分........... 为了程序一启动就把电脑上能用的串口号显示 ...

  9. MicroPython之TPYBoard v102开发板控制OLED显示中文

    转载请以链接形式注明文章来源,公众号:MicroPython玩家汇 0x00前言 之前看到一篇文章是关于TPYBoardv102控制OLED屏显示的,看到之后就想尝试一下使用OLED屏来显示中文.最近 ...

随机推荐

  1. 微信小程序列表拖动排序Demo

    wxml页面编写 <view class="container"> <view bindtap="box" class="box&q ...

  2. 32位x86处理器架构

    我们看看32 位 x86 处理器的基本架构特点.这些处理器包括了 Intel IA-32 系列中的成员和所有 32 位 AMD 处理器. 操作模式 x86 处理器有三个主要的操作模式:保护模式.实地址 ...

  3. 虚拟机VMware的安装与Xshell的应用

    先安装VMware 1.安装就按照提示一点点安装就行了 配置网络 打开VMware 这里的IOS映像文件在https://developer.aliyun.com/mirror/里下载 这里用方向键往 ...

  4. 7-19(排序) 寻找大富翁 (25 分)(归并排序)(C语言实现)

    7-19(排序) 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式 ...

  5. 论文翻译:2021_Performance optimizations on deep noise suppression models

    论文地址:深度噪声抑制模型的性能优化 引用格式:Chee J, Braun S, Gopal V, et al. Performance optimizations on deep noise sup ...

  6. OpenHarmony标准设备应用开发(二)——布局、动画与音乐

    (以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点) 邢碌 上一章我们讲解了应用编译环境准备,设备编译环境准备,开发板烧录,将一个最简单的 OpenAtom OpenHar ...

  7. html 移动端与PC端之间的转换

    href 里面写路径 if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackB ...

  8. Dom基础(二):Dom性能优化

    一.尽量将DOM查询做缓存 1 let pElements = document.getElementById('div1') //将dom缓存 2 3 for(let i=0:i<pEleme ...

  9. python基础练习题(题目 将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5)

    day9 --------------------------------------------------------------- 实例014:分解质因数 题目 将一个整数分解质因数.例如:输入 ...

  10. Dubbo 学习笔记

    分布式基础理论 1. 什么是分布式系统? 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统 2. 应用架构演变 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起 ...