当前位置: 首页 > news >正文

STM32单片机的基本原理与应用(七)

超声波测距实验

基本原理

超声波测距实验是STM32单片机通过控制HC-SR04超声波模块,使其发送超声波,遇到物体反射回超声波来实现距离测量,其原理就是在发射超声波到接收超声波会有一段时间,而超声波在空气中传播的速度为声速(340M/S),时间*声速就是超声波的往返距离,那么测量距离=(往返时间*声速)/2=超声波往返距离/2。
HC-SR04是怎样做到发送和接收超声波的呢?HC-SR04具有两个控制端口TRIG和ECHO,TRIG用于触发测距,ECHO用于检测是否有超声波信号返回。TRIG给至少10us的高电平信号(超过10us表示在正常工作),接着模块自动发送8个40khz的方波,自动检测是否有信号返回。有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。

实验原理图

在这里插入图片描述

程序代码

1、超声波发送与接收

void Wave_SRD_Strat(void)
{GPIO_SetBits(GPIOB,Trig);   //将Trig设置为高电平delay_us(20);               //持续大于10us触发,触发超声波模块工作GPIO_ResetBits(GPIOB,Trig); 	
}
void EXTI9_5_IRQHandler(void)
{delay_us(10);if(EXTI_GetITStatus(EXTI_Line8)!=RESET){TIM_SetCounter(TIM3,0);TIM_Cmd(TIM3,ENABLE);while(GPIO_ReadInputDataBit(GPIOF,Echo));  //等待低电平TIM_Cmd(TIM3,DISABLE);Distance=TIM_GetCounter(TIM3)*340/200.0;if(Distance>0){printf("Distance:%f cm\r\n",Distance);}	EXTI_ClearITPendingBit(EXTI_Line8);}
}

2、主函数

int main(void){		delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200);	 //串口初始化为115200//EXTIX_Init();		 	//外部中断初始化Timer_SRD_Init(5000,7199);Wave_SRD_Init(); while(1){	    Wave_SRD_Strat();	delay_ms(2000);       	}}

实验现象

在这里插入图片描述
运行程序后打开串口调试助手(注意选择波特率为115200),此时可以观察到串口实时输出超声波距离,可用障碍物遮挡不断实验,障碍物距离不同显示的数据不同。

IIC/EEPROM实验

单片机通过代码模拟IIC总线并对EEPROM芯片AT24C256进行读写,单片机会在0号地址写入字符串‘STM32 IIC TEST’,然后重新读取0号地址并通过TFTLCD屏显示出来。

AT24C256外围电路原理图

在这里插入图片描述
A0、A1:地址选择输入端。
SCL:串行时钟输入。上升沿将SDA上的数据写入存储器,下降沿从存储器读出数据送SDA上。
SDA:双向串行数据输入输出口。用于存储器与单片机之间的数据交换。
WP:写保护输入。此引脚与地相连时,允许写操作;与VCC相连时,所有的写存储器操作被禁止。如果不连,芯片内部下拉到地。
EEPROM 进入开始状态后,需要一个8位的地址字来选择芯片进行读写。设备地址字由5位0、1组成的命令字和两位地址选择位A1、A0和一位读/写操作位构成。对于 AT24C256,命令字为“10100”,同一串行总线上可以连接4个设备,由地址线A1,A0加以区分。如只有一个AT24C256,A1,A0都取 0。最低位为1表示读操作,0表示写操作。
写操作有写页和写字节两种,读操作有当前地址读、随机读、读串三种方式。

程序代码

此处仅展示主函数。

int main(void){	 u8 datatemp[SIZE];delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200LED_Init();		  		//初始化与LED连接的硬件接口LCD_Init();			   	//初始化LCD 		AT24CXX_Init();			//IIC初始化 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(30,50,200,16,16,"STM32");	LCD_ShowString(30,70,200,16,16,"IIC TEST");	LCD_ShowString(30,90,200,16,16,"STM32F103ZET6");LCD_ShowString(30,110,200,16,16,"2015/1/15");	//LCD_ShowString(30,130,200,16,16,"KEY1:Write  KEY0:Read");	//显示提示信息		while(AT24CXX_Check())//检测不到24c02{LCD_ShowString(30,150,200,16,16,"24C0256 Check Failed!");printf("24C0256 Check Failed!");delay_ms(500);LCD_ShowString(30,150,200,16,16,"Please Check!      ");delay_ms(500);LED0=!LED0;//DS0闪烁}LCD_ShowString(30,150,200,16,16,"24C0256 Ready!");    POINT_COLOR=BLUE;//设置字体为蓝色	  LCD_Fill(0,170,239,319,WHITE);//清除半屏    LCD_ShowString(30,170,200,16,16,"Start Write 24C0256....");AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE); //写入LCD_ShowString(30,170,200,16,16,"24C0256 Write Finished!");//提示传送完成delay_ms(1800);			LCD_ShowString(30,170,200,16,16,"Start Read 24C0256.... ");AT24CXX_Read(0,datatemp,SIZE);  //读取LCD_ShowString(30,170,200,16,16,"The Data Readed Is:");//提示传送完成LCD_ShowString(30,190,200,16,16,datatemp);//显示读到的字符串while(1);}

实验现象

运行程序可以发现TFTLCD屏上显示EEPROM中0号地址保存的字符串“STM32 IIC TEST”。

触摸屏实验

触摸屏实验就是利用单片机制作一个绘图板功能,实现手、触摸笔写画功能。其主要采用电容式触摸屏。 电容式触摸屏主要分为两种:
1、 表面电容式电容触摸屏
表面电容式触摸屏技术是利用 ITO(铟锡氧化物,是一种透明的导电材料)导电膜,通过电场感应方式感测屏幕表面的触摸行为进行。但是表面电容式触摸屏有一些局限性,它只能识别一个手指或者一次触摸。
2、 投射式电容触摸屏
投射电容式触摸屏是传感器利用触摸屏电极发射出静电场线。一般用于投射电容传感技术的电容类型有两种:自我电容和交互电容。
自我电容又称绝对电容,是最广为采用的一种方法,自我电容通常是指扫描电极与地构成的电容。
交互电容又叫做跨越电容,它是在玻璃表面的横向和纵向的 ITO 电极的交叉处形成电容。交互电容的扫描方式就是扫描每个交叉处的电容变化,来判定触摸点的位置。

主函数

int main(void){	 		    delay_init();	    	 //延时函数初始化	  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200);	 	//串口初始化为115200 LED_Init();			     //LED端口初始化LCD_Init();	
//	KEY_Init();	 	tp_dev.init();	 POINT_COLOR=RED;//设置字体为红色 LCD_ShowString(60,50,200,16,16,"STM32");	LCD_ShowString(60,70,200,16,16,"TOUCH TEST");	LCD_ShowString(60,90,200,16,16,"STM32F103ZET6");LCD_ShowString(60,110,200,16,16,"2020/1/15");//LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");	
//   	if(tp_dev.touchtype!=0XFF)LCD_ShowString(60,130,200,16,16,"Press KEY0 to Adjust");//电阻屏才显示delay_ms(1500);Load_Drow_Dialog();	 	if(tp_dev.touchtype&0X80)ctp_test();	//电容屏测试else rtp_test(); 						//电阻屏测试
}

相关文章:

STM32单片机的基本原理与应用(七)

超声波测距实验 基本原理 超声波测距实验是STM32单片机通过控制HC-SR04超声波模块,使其发送超声波,遇到物体反射回超声波来实现距离测量,其原理就是在发射超声波到接收超声波会有一段时间,而超声波在空气中传播的速度为声速&…...

LLM应用开发与落地:使用gradio十分钟搭建聊天UI

一、背景 如果你是做LLM应用开发的,特别是做后端开发,你一定会遇到怎么快速写一个聊天UI界面来调试prompt或agent的问题。这时候的你可能在苦恼中,毕竟react.js, next.js, css, html也不是每个人都那么熟练,对吧?即使…...

智慧城市:打造低碳未来,引领城市数字化转型新篇章

在“万物皆可数字化”的新时代浪潮下,智慧城市作为未来城市发展的先锋方向,正在以前所未有的速度和规模重塑我们的城市面貌。 智慧城市不仅是一个技术革新的标志,更是城市治理、民生服务等领域全面升级的重要引擎。 一、智慧城市的多元应用领…...

ChatGPT之制作短视频

引言 今天带来了如何使用 ChatGPT和剪映来制作简单的短视频教程,在这其中 ChatGPT的作用主要是帮我们生成文案,剪映的功能就是根据文案自动生成视频,并配上一些图片、动画、字幕和解说。 ChatGPT生成文案 首先,我们需要使用提示…...

k8s学习(RKE+k8s+rancher2.x)成长系列之简配版环境搭建(二)

三、简配版集群,适用于demo环境 1.集群架构设计 主机名角色配置(核数,内存,磁盘)MasterRKE,controlplane,etcd,worker,rancher-master2C 8G 40GSlaver1controlplane,worker,rancher-master2C 8G 40GSlaver2controlplane,worker,rancher-mas…...

智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 智能优化算法 | Matlab实现合作优化算法(CSA)(内含完整源码) 源码设计 clear clc close SearchAgents_no=30; % Number of search agents Max_iteration=1000;...

mysql如何备份某些库的某些表

MySQL备份数据库 mysql如何备份某些库的某些表 要备份某个库里的部分表,该如何操作? 例如:要备份db01库里的20张表,表很多又不想备份整个库 或者要备份多个库里的不同表,又如何操作? 例如:备份…...

C++类和对象入门(三)

顾得泉:个人主页 个人专栏:《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂,年薪百万! 前言 在c中,类型分为两类,一类是内置类型,另一类是自定义类型。 1.内置类型&#xf…...

【0255】揭晓pg内核中MyBackendId的分配机制(后端进程Id,BackendId)(一)

文章目录 1. 前言2. MyBackendId分配机制2.1 全局变量MyBackendId2.2 共享缓存无效内存段(shared inval buffer)2.2.1 shmInvalBuffer缓冲区2.2.2 shmInvalBuffer初始化1. 前言 MyBackendId的数据类型是BackendId(backendid.h src/include/storage),它表示“当前活动的后…...

Python爬虫requests库详解

使用 requests 上一节中,我们了解了 urllib 的基本用法,但是其中确实有不方便的地方,比如处理网页验证和 Cookies 时,需要写 Opener 和 Handler 来处理。为了更加方便地实现这些操作,就有了更为强大的库 requests&…...

【漏洞复现】EPON上行A8-C政企网关信息泄露漏洞

Nx01 产品简介 EPON上行A8-C政企网关是一款终端产品,提供企业网络解决方案。 Nx02 漏洞描述 EPON上行A8-C政企网关敏感信息泄露漏洞,攻击者通过敏感信息泄露获取管理员密码。 Nx03 产品主页 fofa-query: "ZXECS" && title"Web…...

发送get请求并且发送请求头(header),java实现

发送get请求时,发送请求头(Header)中的内容 方便第二次调用其他url时传递参数,例如userCode或者租户编码 调用方式 Autowired private HttpServletRequest request;先注入HttpServletRequestpublic xxx xxx(){String url &quo…...

介绍docker

一:介绍docker: Docker 并没有单独的图形界面,它主要通过命令行来进行管理和操作 1、 docker ps:显示正在运行的容器。 docker images:显示本地的镜像。 docker run:创建并启动一个新容器。 docker stop&a…...

Web课程学习笔记--CSS盒模型

CSS 盒模型 盒模型 网页设计中常听的属性名:内容(content)、填充(padding)、边框(border)、边界(margin), CSS盒子模式都具备这些属性。 这些属性我们可以把它转移到我们日常生活中的盒子(箱子)上来理解,日常生活中所…...

中学一级教师是什么职称等级

在教育的世界里,每一个角色都肩负着不可或缺的使命。其中,中学一级教师这一职称,就如同武侠小说里的“隐藏高手”,不显山不露水,却拥有着举重若轻的实力。 中学一级教师究竟是个怎样的职称等级呢?今天&…...

2024年2月CCF-全国精英算法大赛题目

第一次参加这种比赛,虽然是c类赛事,但是是ccf主办的,难度还是有点的,主要是前面签到题主要是思想,后面的题目难度太高,身为力扣只刷了一百多道题目的我解决不了,这几道我只做了B,C题,E题超时了&…...

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器,源操作数 2、含义解析: (1):mov 指令传送数据 案例: MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…...

SpringBoot整理-安全(Spring Security)

在 Spring Boot 应用中实现安全性通常涉及到集成 Spring Security 框架。Spring Security 是一个功能强大且高度可定制的认证和访问控制框架,非常适合用于保护 Spring Boot 应用。 核心特性 认证: 认证是确认某个实体的身份,Spring Security 支持多种认证机制,如表单登录、L…...

【技能树学习】Git入门——练习题解析

前言 本篇文章给出了Git入门技能树中部分的练习题解析,包括分支管理,Git标签,在Mac和Windows上使用GitVSCode的步骤。强调了git cherry-pick不直接支持从标签中选择提交,git tag -d只能删除本地标签,Mac系统的终端可以…...

Springboot+vue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的企业财务管理系统(有报告)。Javaee项目,springboot vue前后端分离项目 项目介绍: 本文设计了一个基于Springbootvue的前后端分离的企业财务管理系统,采用M(model&…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

ios苹果系统,js 滑动屏幕、锚定无效

现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...