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

news2024/11/30 2:26:32

超声波测距实验

基本原理

超声波测距实验是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);	 	//串口初始化为115200
	LED_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(); 						//电阻屏测试
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1447737.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-动态内存

目录 一、动态内存运行机制二、动态内存开发流程三、动态内存使用说明四、动态内存核心算法五、动态内存接口六、代码分析(待续...)坚持就有收获 一、动态内存运行机制 动态内存管理,即在内存资源充足的情况下,根据用户需求&…

单个摄像头(单目RGB)实时3D手的跟踪

概述: 通过单个普通RGB摄像头就可以实现3D手的实时跟踪。 来自论文: GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 官网地址如下链接: GANerated Hands for Real-Time 3D Hand Tracking from Monocular RGB 应用…

Linux_环境变量_命令行参数

一.环境变量 在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。当你想要运行一个程序时: 如果带有路径的话,则直接将对应路径的程序加载进内存&#xff0…

Linux入门(1)Linux介绍

目录 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的&am…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中,安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时,保护用户信息的安全性是非常重要…

vue-组件组成和组件通信(四)

组件的三大组成部分 (结构/样式/逻辑) scoped样式冲突 默认情况:写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 1. 全局样式: 默认组件中的样式会作用到全局 2. 局部样式: 可以给组件加上 scoped 属性, 可以让样式只作用于当前组…

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection 1 实现尺度不变性 不管多近多远,多大多小都能检测出来 找到一个函数,实现尺度的选择特性 2 高斯偏导模版求边缘 做卷积 3 高斯二阶导拉普拉斯 看哪个信号能产生最大响应 高斯…

TinUI v5预发布记录

TinUI v5预发布记录 前言新控件滚动选择框菜单按钮 新样式pre1pre2pre3 新功能导入字体文件 前言 TinUI是一个从2021年正式开始并一直维护到现在的小项目,中间经过了四代版本的更新。因为一些原因,2023年,TinUI-4后更新较少。 TinUI发展历程…

【MATLAB】小波神经网络回归预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 小波神经网络回归预测算法是一种利用小波变换和人工神经网络相结合的方法,用于解决回归预测问题。下面将详细介绍该算法的原理与方法: 小波变换: 小波变…

网络渗透测试:Wireshark抓取qq图片

Wireshark Wireshark Downloadhttps://www.wireshark.org/download.html 简介 WireShark是非常流行的网络封包分析工具,可以截取各种网络数据包,并显示数据包详细信息。常用于开发测试过程中各种问题定位。本文主要内容包括: 1、Wireshar…

内网穿透 | 推荐两个免费的内网穿透工具

目录 1、简介 2、Ngrok 2.1、下载安装 2.2、运行 2.3、固定域名 2.4、配置多服务 3、cpolar 3.1、下载安装 3.2、运行 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应…

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元

【前沿技术杂谈:AI 模型训练成本】到 2030 年,AI 模型训练成本预计将从 1 亿美元增加到 5 亿美元 简述五年后,人工智能将掌握在谁的手中? 简述 根据 OpenAI 最近的一份报告,到 2030 年,训练大型 AI 模型的成…

matplotlib从起点出发(13)_Tutorial_13_Autoscaling

0 自动放缩 轴上的限制可以手动设置(例如ax.set_xlim(xmin, xmax)),或者Matplotlib可以根据Axes上已有的数据自动设置它们。此种放缩行为有许多选项,如下所述。 我们将从一个简单的折线图开始,显示自动缩放将轴限制扩展到数据的…

11-OpenFeign-实现负载均衡策略

2021.0.1版本使用 spring-cloud-loadbalancer 1、默认开启负载均衡策略 使用default RoundRobinLoadBalancer策略 无需yaml文件配置,openfeignclient配置 RandomLoadBalancer :基于随机访问的负载均衡策略NacosLoadBalancer:基于Nacos权重…

软件项目—项目管理计划

《项目管理计划》 1.项目总体组织架构 2.项目进度管理办法 3.项目沟通管理 4.项目风险管理

c++关于this指针

this指针是隐藏在每一个成员函数中的特殊指针,它指向的是所在成员对象的本身。this顾名思义,就是“这个” this:指针,指向当前的对象 ,"我" ,只能出现在类的成员函数中,一般不使用 class A { private:int i; public:int get()//获取成员变量…

微信小程序开发学习笔记《17》uni-app框架-tabBar

微信小程序开发学习笔记《17》uni-app框架-tabBar 博主正在学习微信小程序开发,希望记录自己学习过程同时与广大网友共同学习讨论。建议仔细阅读uni-app对应官方文档 一、创建tabBar分支 运行如下的命令,基于master分支在本地创建tabBar子分支&#x…

2.13学习总结

1.出差(Bleeman—ford)(spfa) (dijkstra) 2.最小生成树(prim)(Kruskal) 最短路问题: 出差https://www.luogu.com.cn/problem/P8802 题目描述 AA …

专利申请与论文发表有什么区别

一、背景 专利申请和发表期刊论文是科研成果两种不同的保护与传播方式,它们的主要区别在于: 1. 目的与性质: - **专利申请**:主要目的是获得对发明创造的法律保护,确保发明人在一定时期内(如发明专利通…

数据工程工程师学习路线图

数据工程岗位要求 Skill Sets required: - Hands on experience enabling data via Adobe Analytics and/or Google Analytics - Understanding of how customer level data is captured and stitched with behavioural data - Experience working with Testing (QA) and D…