基于STM32F103C8T6的超声波模拟雷达设计。【C8T6最小系统板+标准固件库+1.8‘TFT-LCD屏】

2023-11-10

前言:

        之前为做毕设一直在网上浏览关于STM32单片机的DIY项目,大多数设计都是关于智能家居方面的应用,通过浏览不同平台的内容发现了一个采用超声波测距并通过屏幕反馈障碍物位置的模拟雷达设计,感觉很有创意,但网上关于此项目的内容大多都是采用arduino开发,不符合我的主控要求。

在查询资料的过程中发现了一篇大佬混分巨兽龙某某写的文章:基于STM32的超声波雷达项目【可拟合构建平面地图】(代码开源)_混分巨兽龙某某的博客-CSDN博客_基于stm32的超声雷达设计https://blog.csdn.net/black_sneak/article/details/127050718        他的雷达设计是基于STM32F103ZET6主控,采用HAL库开发,搭配2.4寸TFT-LCD屏反馈信息。我有一块ST7735驱动的1.8'TFT-LCD屏,就在之前的屏幕例程里进行改动,并复刻了大佬的UI设计,改为采用标准外设库开发,主控用了比较经济的C8T6最小系统板。

         由于本人也是一名小白,发表此博客仅用于分享基于该平台的超声波模拟雷达程序,设计原理建议参考上面我分享的这位博主的文章,写的非常全面与详细。

制作超声波模拟雷达的硬件清单:

超声波模拟雷达硬件列表:
(1)STM32F103C8T6最小系统板 X1
(2)1.8'TFT-LCD屏 X1
(3)SG90舵机 X1
(4)HC-SR04超声波模块 X1
(5)超声波模块支架 X1
(6)面包板/洞洞板及排线等

实物效果图:

接线指引:

TFT-LCD接口:

外设↓​​​​​​​         主控↓
GND            地
VCC        3.3V/5V
SCL           PA5
SDA           PA7
RST           PB0
DC             PB1
CS             PA4 
BLK          PB10

HC-SR04接口:

外设↓​​​​​​​         主控↓

VCC            5V
Trig            PA0
Echo          PA1

GND            地

SG90接口:

外设↓​​​​​​​         主控↓
VCC            5V
信号           PB6
GND            地
 

整体设计流程:

主要程序:

主函数(main.c)

#include "stm32f10x.h"
#include "delay.h"
#include "QDTFT_demo.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include "HCSR04.h"
#include "tim.h"
#include "radar.h"
#include "servo.h"

int main(void)
{  
	int i=50;
	SystemInit();	//System init.
    delay_init(72);//Delay init.
	Timer_Init();	//初始化定时器
	Lcd_Init();  //LCD屏初始化
	HC_SR04_Init(); //初始化超声波测距模块
	TIM4_CH1_PWM_Init(2000,720);//PWM频率=72000000/2000/720=50hz=20ms
	LCD_LED_SET; //通过IO控制背光亮
	Lcd_Clear(BLACK);	
	
	//画雷达图
	radar_picture();
	
  while(1)
  {
	  //TIM_SetCompare1(TIM4,250); // 250/2000*20ms=2.5ms
	  int a=0;
	  int d=0;
	  int Distance_mm=0;		
	  if(i==50) //0-180°循环
		{
		  for(i=50;i<250;i++)
		  {
			  Distance_mm=sonar_mm(); //获取超声波数据
			  LCD_ShowNum(37,114,Distance_mm,3); //显示距离值	 			
		  	  TIM_SetCompare1(TIM4,i); //控制舵机变化
			  a=(i-50)*180/200; //角度随舵机变化
			  LCD_ShowNum(37,2,a,3); //显示角度值
			  if(Distance_mm>500)
			  {Distance_mm=0;} //限制测距最大值
			  d=Distance_mm*0.19; //通过测距判断障碍物方位
			  Radarline2(a,d); //显示障碍物方位(打点模拟)
			  delay_ms(100);
		  }	
		}
    if(i==250) //180-0°循环
    {		
      for(i=250;i>50;i--)
		  {
			  Distance_mm=sonar_mm();
			  LCD_ShowNum(37,114,Distance_mm,3);					
		  	  TIM_SetCompare1(TIM4,i);
			  a=(i-50)*180/200;
			  LCD_ShowNum(36,2,a,3);
			  if(Distance_mm>500)
			  {Distance_mm=0;}
			  d=Distance_mm*0.19;
			  Radarline2(a,d);
			  delay_ms(100);
		  }	
			Lcd_Clear(BLACK); //清屏
			radar_picture(); //刷新雷达图
    }	
  }

}

雷达UI(radar.c) 

#include "stm32f10x.h"
#include "Lcd_Driver.h"
#include "GUI.h"
#include "delay.h"
#include "bmp.h"
#include "math.h"
#include "radar.h"

void Radarline(double k,int r) //画斜线:(角度,长度)
{
	double x,y;
	
	x=80+r*(double)cos(k/180*3.1415926);	
	y=108-r*(double)sin(k/180*3.1415926);
	
	Gui_DrawLine(80,108,x,y,GREEN); //原点坐标
		
}

void Radarline2(double k,int r)
{
	double x,y;
	
	x=80+r*(double)cos(k/180*3.1415926);	
	y=108-r*(double)sin(k/180*3.1415926);
	
	LCD_DrawPoint2(x,y,RED);	
}

void radar_picture()//雷达图
{
	//画圆:(圆心坐标,半径,颜色)
	Gui_Circle(80,108,76,GREEN);
	Gui_Circle(80,108,57,GREEN);
	Gui_Circle(80,108,38,GREEN);
	Gui_Circle(80,108,19,GREEN);
	//画斜线:(角度,长度)
	Radarline(30,85);
	Radarline(60,85);
	Radarline(90,85);
	Radarline(120,85);
	Radarline(150,85);
	//画矩形:目的是覆盖掉圆的下半部分
	rectangle(0,108,160,128,BLACK); //(起点坐标,终点坐标,颜色)
	Gui_DrawLine(0,108,160,108,GREEN); //画横坐标轴
	
	//数据信息
	/*字库采用甲乙丙丁代表显示不同位置的°(度)*/
	Gui_DrawFont_GBK16(0,112,GREEN,BLACK,"距离");
	Gui_DrawFont_GBK16(30,112,GREEN,BLACK,":");
	Gui_DrawFont_GBK16(0,0,GREEN,BLACK,"角度");
	Gui_DrawFont_GBK16(30,0,GREEN,BLACK,":");	
	Gui_DrawFont_GBK16(61,110,GREEN,BLACK,"mm");	
	Gui_DrawFont_GBK16(61,0,GREEN,BLACK,"乙"); //显示°
  
    LCD_ShowNum(0,46,150,3);  //150°数值
    Gui_DrawFont_GBK16(18,32,GREEN,BLACK,"甲"); //150°符号
    LCD_ShowNum(38,22,120,3); //120°数值
    Gui_DrawFont_GBK16(56,8,GREEN,BLACK,"甲");  //120°符号
    LCD_ShowNum(83,20,90,2);   //90°数值
    Gui_DrawFont_GBK16(97,18,GREEN,BLACK,"乙");	 //90°符号
    LCD_ShowNum(124,32,60,2);  //60°数值
    Gui_DrawFont_GBK16(133,17,GREEN,BLACK,"甲"); //60°符号
    LCD_ShowNum(140,49,30,2);  //30°数值
    Gui_DrawFont_GBK16(141,34,GREEN,BLACK,"丁"); //30°符号		

	Gui_DrawFont_GBK16(80,0,GREEN,BLACK,"超声波雷达");
}

雷达UI(radar.h) 

#ifndef __RADAR_H
#define __RADAR_H

void Radarline(double k,int r);
void Radarline2(double k,int r);
void radar_picture();

#endif

本人接触STM32平台也不久,一些地方写的可能不完善,欢迎各位大佬批评指正。大家也可以点赞支持一下本博主,如果有需要私信我分享出完整工程 。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于STM32F103C8T6的超声波模拟雷达设计。【C8T6最小系统板+标准固件库+1.8‘TFT-LCD屏】 的相关文章

随机推荐

  • 【设计模式】创建者模式_工厂、抽象工厂、建造者

    设计模式六大原则 开闭原则 Open Close Principle 开闭原则就是说对扩展开放 对修改关闭 在程序需要进行拓展的时候 不能去修改原有的代码 而是要扩展原有代码 单一职责原则 不要存在多于一个导致类变更的原因 也就是说每个类应
  • 若依框架_05:接口汇总

    若依接口汇总 一 登录 路由渲染 1 1 登录 1 1 1 登录 1 1 2 注册 1 1 3 获取验证码 1 1 4 获取用户详细信息 1 1 5 登出 1 2 路由渲染 1 2 1 获取路由 二 系统管理模块 2 1 用户管理 2 1
  • javascript中defer和async 区别

    defer和async 区别 1 没有 defer 或 async 浏览器会立即加载并执行指定的脚本 立即 指的是在渲染该 script 标签之下的文档元素之前 也就是说不等待后续载入的文档元素 读到就加载并执行 2 有 async 加载和
  • 递归函数的例子python卖鸭子_递归算法实现卖鸭子

    问题重述 1 一个人赶着鸭子去每个村庄卖 每经过一个村子卖去所赶鸭子的一半又一只 这样他经过了七个村子后还剩两只鸭子 问他出发时共赶多少只鸭子 经过每个村子卖出多少只鸭子 代码 题目分析 设在经过n 个村子时有xn 只鸭子 根据题意可以得到
  • MATLAB算法实战应用案例精讲-【集成算法】集成学习模型Bagging(附Python和R语言代码)

    目录 前言 几个相关概念 几个高频面试题目
  • 阿里云-MaxComputer学习+踩坑 第001天

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 DataWorks是什么 二 MaxComputer是什么 1 产品介绍 2 表分区规范 3 官方分区文档 总结 前言 由于公司 一家蒸蒸日上的小跨境电商
  • [搬运]台湾大学机器学习课程 by 李宏毅

    最近看到一个比较好的机器学习课程 大致听了一遍 整体感觉机器学习领域还是比较难 虽然李宏毅老师讲得还是挺好的 没有足够基础吸收起来还是有一定困难 即便是已经把过程讲了一遍 也很难理解到那些理论是如何构建起来的 这个课程一个好是讲到了当前最热
  • 科目一考试系统服务器奔溃,科目一错误率最高的题 学员都崩溃了

    2017 02 28 09 07 59 做错这种基础题目的时候 与其有时间责怪出题人套路太深 不如反省一下自己为什么做题的时候没有多看选项一眼 在学习科目一的时候 很多学员都对科目一的题目感到头疼 有的是因为交通法规太难背 有的是对绕人的题
  • css video 样式,使用CSS修改 video 标签默认样式

    使用CSS修改 video 标签默认样式 时间 2019 11 08 17 42 14 来源 作者 效果展示 1 模拟直播 去除进度条 当前观看时间 剩余时间 效果 2 去除 video 标签全部控件 效果 Tags CSS 点击 评论 声
  • 10x倍加速PDE的AI求解:元自动解码器求解参数化偏微分方程

    研究背景 科学和工程中的许多应用需要求解具有不同方程系数 不同边界条件甚至不同求解域形状的偏微分方程 Partial Differential Equation PDE 即需要求解一个方程族而不是单个方程 这类应用经常在反问题求解 控制和优
  • 关于RxJava最友好的文章

    本篇文章已授权微信公众号 guolin blog 郭霖 独家发布 RxJava到底是什么 让我们直接跳过官方那种晦涩的追求精确的定义 其实初学RxJava只要把握两点 观察者模式和异步 就基本可以熟练使用RxJava了 异步在这里并不需要做
  • urllib.request.urlopen详解

    视频链接https www bilibili com video BV1Us41177P1 p 2 requests get详解见 https blog csdn net qq 41845823 article details 119516
  • 基于Multisim的四人抢答器设计与仿真

    功能 1 抢答器最多可供4名选手参赛 编号为1 4号 各队对应用一个按钮S1 S4中一个控制 并设置一个清零和抢答控制开关S5 该开关由主持人控制 2 抢答器具有锁存功能 直到主持人 清零 3 开关S作为清零及抢答控制开关 由主持人控制 当
  • 关于Navicat 报错1251连接不成功Mysql

    使用Navicat 连接数据库时候出现1251错误 解决方法 1 首先打开mysql exe 然后输入密码 mysql exe可以在安装的位置搜索一下 2 输入ALTER USER root localhost IDENTIFIED WIT
  • C#WinForm界面: 使用IrisSkin4实现美化换肤

    记录IrisSkin4应用过程 方便以后参考 步骤一 在网上下载IrisSkin4 dll和它的皮肤文件 步骤二 复制以下两个文件到winfrom项目的Debug文件夹下 步骤三 引用IrisSkin4 dll文件 步骤四 在工具箱空白处点
  • 数字图像处理(冈萨雷斯 第三版)

    1 1 图像与图像处理的概念 图像 Image 使用各种观测系统以不同形式和手段观测客观世界而获得的 可以直接或间接作用于人眼并进而产生视觉的实体 包括 各类图片 如普通照片 X光片 遥感图片 各类光学图像 如电影 电视画面 客观世界在人们
  • MySQL——索引详解

    目录 一 为什么要有索引 二 什么是索引 三 索引的原理 四 MySQL的存储引擎 五 索引的数据结构 六 聚簇和非聚簇索引 七 索引的设计原则 一 为什么要有索引 一般的应用系统 读写比例在10 1左右 而且插入操作和一般的更新操作很少出
  • 系统分析中的决策问题

    例如你设计一个图书馆系统支持用户预订被借出的书籍 有两个解决方案 一是 每一本书被归还时校验是否有人预订 如有预订则以某种方式如短信等通知预订客户 同时书籍做另类处理不会被流入馆内以节省时间 但是问题是预订的客户要来走一个预订的流程即管理员
  • 【B站】动态规划学习

    https www bilibili com video BV1ET4y1U7T6 p 6 spm id from pageDriver 暴力递归到动态规划 测试用例 include
  • 基于STM32F103C8T6的超声波模拟雷达设计。【C8T6最小系统板+标准固件库+1.8‘TFT-LCD屏】

    前言 之前为做毕设一直在网上浏览关于STM32单片机的DIY项目 大多数设计都是关于智能家居方面的应用 通过浏览不同平台的内容发现了一个采用超声波测距并通过屏幕反馈障碍物位置的模拟雷达设计 感觉很有创意 但网上关于此项目的内容大多都是采用a