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

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机(RD8G37)+超声波一体测距传感器实现简单的测距测速仪。

 9278bb850bb44edab90cb36a83ce4264.jpg

测距仪演示效果

 

新定义RD8G37Q48RJ开发板

051393b63f7b4bf0a258e947fbe23cc8.jpeg

超声波测距模块: 

8e5c3abfe06f4a7d80e23122651b14c5.png

8位并口屏

fa276aa0bc324c54bf022c22d4c27aaf.jpg

 

1、main.c


unsigned short timeConsuming=0;	
unsigned int oldDistance;void rectClearScreen(void);void updateDisplay(void)
{unsigned int d[2];float v,dis;char buf[8]={0};memset(buf, '0', 8);Measure_Distance(d);dis=((float)d[0])/1000;sprintf(buf,"%0.f2d",dis); // 获取当前秒 buf[4]='\0';		if(d[0]<500){//rectClearScreen();GUI_WriteASCII_BIG(6,60,buf,VGA_YELLOW,VGA_RED);}else GUI_WriteASCII_BIG(6,60,buf,VGA_WHITE,VGA_BLACK);if(oldDistance>d[0])v=((float)(oldDistance-d[0]))/d[1];else v=(d[0]-oldDistance)/d[1];sprintf(buf,"%0.2f",v); // 获取当前秒 buf[4]='\0';GUI_WriteASCII(150,60,buf,VGA_Mint,VGA_BLACK);oldDistance=d[0];}void rectClearScreen(void)
{uint8_t i;setColor(VGA_RED);for(i=0;i<30;i+=3){drawRect(i+6,i*176/220+60,214-i,110-i*176/220);}
}
void draw_interface(void)
{setColor(VGA_BLACK);clrScr(VGA_BLACK);setColor(VGA_Orange_Red);fillRect(5,5,105,83);setColor(VGA_Golden);fillRect(115,5,215,83);setColor(VGA_Medium_Blue);fillRect(5,93,105,171);setColor(VGA_Mint);fillRect(115,93,215,171);GUI_Write32CnChar(10,10,"测距测速仪",VGA_Orange_Red,VGA_BLACK);GUI_Write32CnChar(118,113,"新定义",VGA_WHITE,VGA_Dark_Green);GUI_WriteASCII(20,145,"RD8G37Q48RJ",VGA_Dark_Mineral_Blue,VGA_BLACK);setColor(VGA_BLACK);fillRect(5,53,215,111);GUI_Write32CnChar(102,72,"米",VGA_WHITE,VGA_BLACK);GUI_WriteASCII(150,60,"1.1",VGA_Mint,VGA_BLACK);GUI_WriteASCII(165,82,"m/s",VGA_WHITE,VGA_BLACK);setColor(0XC618);drawRoundRect(0,0,219,175);
}
void main(void)
{	/*<Generated by EasyCodeCube begin>*//*<UserCodeStart>*//*<SinOne-Tag><36>*/IcResourceInit();InitLCD();setColor(VGA_BLACK);draw_interface();/*<UserCodeEnd>*//*<SinOne-Tag><36>*//*<UserCodeStart>*//*<SinOne-Tag><4>*//*****MainLoop*****/while(1){/*<UserCodeStart>*//*<SinOne-Tag><14>*//***User program***/updateDisplay();Delay(50000);/*<UserCodeEnd>*//*<SinOne-Tag><14>*//*<Begin-Inserted by EasyCodeCube for Condition>*/}/*<UserCodeEnd>*//*<SinOne-Tag><4>*//*<Generated by EasyCodeCube end>*/
}

2、传感器驱动

HC_SR04.c

#include "SC_Init.h"
#include "HC_SR04.h"extern unsigned int time;void Delay_us(unsigned short time)
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--time);}void HC_GPIO_Init(void)  
{ResetTrig();   //Trig拉低,为输出脉冲触发信号做准备
}void Measure_Distance(unsigned int* distance) //测距
{//unsigned int distance[2]=0;SetTrig();     //10us的脉冲触发信号Delay_us(10);ResetTrig();while(HC_ECHO==0); //等待Echo输出高电平time=0;               //开始记录回波信号脉宽while(HC_ECHO==1); //等待Echo输出低电平	   distance[0]=time*1.7;//根据声速和时间计算距离,即distance=time*340/2/100distance[1]=time;/*关于分辨力(mm):定时器每次对time加1是10us,10us=0.01ms,340m/s=340mm/ms计算距离时,最小分辨力为:0.01(ms) * 340(mm/ms) / 2 = 1.7(mm)小于模块标准精度3mm,故测距结果十分精准*/return ; //返回距离,单位mm
}

HC_SR04.h

#ifndef _HC_SR04_H_
#define _HC_SR04_H_#define HC_TRIG	P21
#define HC_ECHO	P20
#define SetTrig()    HC_TRIG=1
#define ResetTrig()  HC_TRIG=0
//#define ReadEcho()   GPIO_ReadPin(CW_GPIOB,GPIO_PIN_9)void HC_GPIO_Init(void);
void Measure_Distance(unsigned int* distance);#endif

3、初始化和中断

SC_Init.c,

初始化8位并口屏GPIO,TIMER0。

TIMER0设置为10us中断一次,做为距离传感器的测量时间最小单位。

void SC_Init(void)
{//Forbid editing areas before the following label !!!SC_GPIO_Init();SC_OPTION_Init();SC_TIM0_Init();/*write initial function here*/	EA = 1;	
}/*****************************************************
*函数名称: SC_GPIO_Init
*函数功能: GPIO初始化函数
*入口参数:void
*出口参数:void
*****************************************************/
void SC_GPIO_Init(void)
{//Forbid editing areas before the following label !!!GPIO_Init(GPIO3, GPIO_PIN_6,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_5,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_4,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_3,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_2,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_1,GPIO_MODE_OUT_PP);GPIO_Init(GPIO3, GPIO_PIN_0,GPIO_MODE_OUT_PP);GPIO_Init(GPIO1, GPIO_PIN_0,GPIO_MODE_OUT_PP);GPIO_Init(GPIO2, GPIO_PIN_0,GPIO_MODE_IN_HI);GPIO_Init(GPIO2, GPIO_PIN_1,GPIO_MODE_OUT_PP);GPIO_Init(GPIO0, GPIO_PIN_4,GPIO_MODE_OUT_PP);GPIO_Init(GPIO0, GPIO_PIN_5,GPIO_MODE_OUT_PP);GPIO_Init(GPIO0, GPIO_PIN_6,GPIO_MODE_OUT_PP);GPIO_Init(GPIO5, GPIO_PIN_1,GPIO_MODE_OUT_PP);GPIO_Init(GPIO5, GPIO_PIN_5,GPIO_MODE_OUT_PP);GPIO_Init(GPIO4, GPIO_PIN_7,GPIO_MODE_OUT_PP);/*GPIO_Init write here*/		
}/*****************************************************
*函数名称: SC_TIM0_Init
*函数功能: TIMER0初始化函数
*入口参数:void
*出口参数:void 
*****************************************************/
void SC_TIM0_Init(void)
{//Forbid editing areas before the following label !!!TIM0_TimeBaseInit(TIM0_PRESSEL_FSYS_D12,TIM0_MODE_TIMER);TIM0_WorkModeConfig(TIM0_WORK_MODE2,229, 0);TIM0_ITConfig(ENABLE,LOW);TIM0_Cmd(ENABLE);/*TIM0_Init write here*/		
}

SC_it.c

TIMER0中断,每次中断计数加1。

void Timer0Interrupt()		interrupt 1			   
{/*TIM0_it write here begin*///Forbid editing areas between the labels !!!/*TIM0_it write here*//*<Generated by EasyCodeCube begin>*//*<UserCodeStart>*//*<SinOne-Tag><55>*///Timer0Interrupt{/*<UserCodeStart>*//*<SinOne-Tag><15>*//***User program***/time++;/*<UserCodeEnd>*//*<SinOne-Tag><15>*//*<Begin-Inserted by EasyCodeCube for Condition>*/}/*<UserCodeEnd>*//*<SinOne-Tag><55>*//*<Generated by EasyCodeCube end>*//*Timer0Interrupt Flag Clear begin*///Forbid editing areas between the labels !!!/*Timer0Interrupt Flag Clear end*/		
}

总结

1、程序中用了TIMER0,主要是TIMER0可以做到us级,可以使测距更准确。

2、HC_SR04传感器的算法是通用的。

3、RD8G37Q48是QFN封装,PCB封装引脚延长到3mm,可以用烙铁焊接。

4、HC_SR04传感器不能测太远距离,室内3米以内应该没问题。

5、所用屏幕为ST7775,220*176分辨率,8位并口屏。

6、工程的建立用的是EasyCodeCube.exe,主要实现了gpio和timer初始化。程序编写和下载用的是keil。

 

 

 

 

相关文章:

新定义51单片机(RD8G37)实现测距测速仪

本文描述用新定义51单片机&#xff08;RD8G37&#xff09;超声波一体测距传感器实现简单的测距测速仪。 测距仪演示效果 新定义RD8G37Q48RJ开发板 超声波测距模块&#xff1a; 8位并口屏 1、main.c unsigned short timeConsuming0; unsigned int oldDistance;void rectClearS…...

Unity中URP下获取每一个额外灯数据

文章目录 前言一、我们先来看一下 SimpleLit 中的调用二、获取额外灯索引1、非移动平台2、非GLES平台3、大多数平台 三、获取额外灯数据 前言 在上一篇文章中&#xff0c;我们知道了URP下是怎么获取额外灯数量的。 Unity中URP下获取额外灯数量 在这篇文章中&#xff0c;我们…...

差分进化算法求解基于移动边缘计算 (MEC) 的无线区块链网络的联合挖矿决策和资源分配(提供MATLAB代码)

一、优化模型介绍 在所研究的区块链网络中&#xff0c;优化的变量为&#xff1a;挖矿决策&#xff08;即 m&#xff09;和资源分配&#xff08;即 p 和 f&#xff09;&#xff0c;目标函数是使所有矿工的总利润最大化。问题可以表述为&#xff1a; max ⁡ m , p , f F miner …...

Tomcat Notes: Web Security, HTTPS In Tomcat

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…...

智能小程序登陆能力开发文档及示例代码

小程序登录 涂鸦官方提供了登录能力&#xff0c;开发者可以通过相关 API 获取 App 的用户身份标识&#xff0c;快速的建立小程序内的用户体系。 登录流程 说明 需要调用 ty.login() 获取 临时登录凭证 code&#xff0c;并将 code 传到开发者服务器开发者服务器调用涂鸦云开发…...

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…...

openssl3.2/test/certs - 041 - 1024-bit leaf key

文章目录 openssl3.2/test/certs - 041 - 1024-bit leaf key概述笔记END openssl3.2/test/certs - 041 - 1024-bit leaf key 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 /*! * \file D:\my_dev\my_local_git_prj\study\openSSL\test_certs\041\my_openssl_linux_…...

「创新引领未来」科东软件荣获第十二届中国创新创业大赛(广东·广州赛区)优胜奖

近日&#xff0c;广州市科学技术局公布第十二届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2023年广州科技创新创业大赛常规赛拟获奖企业名单。科东软件凭借国产化技术创新优势、强大的应用场景落地能力和丰富的行业解决方案&#xff0c;荣获第十二届中国创新创业…...

Linux下安装 Redis7

Linux下安装 Redis7 三、Linux下安装 Redis7【redis-7.2.4.tar.gz】3.1.下载redis的安装包3.1.1.手动下载Redis压缩包并上传【redis-7.2.4.tar.gz】3.1.2.wget工具下载redis-7.2.4.tar.gz 3.2.将安装包进行解压缩3.3.进入redis的安装包3.4.检查是否有gcc 环境3.5.编译和安装并指…...

spire.doc合并word文档

文章目录 spire.doc合并word文档1. 引入maven依赖2. 需要合并的word3. 合并文档代码4. 合并结果 spire.doc合并word文档 1. 引入maven依赖 <repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://r…...

蓝桥杯官网填空题(01串的熵)

问题描述 答案提交 这是一道结果填空的题, 你只需要算出结果后提交即可。本题的结果为一 个整数, 在提交答案时只填写这个整数, 填写多余的内容将无法得分。 import java.util.*;public class Main {public static void main(String[] args) {for(double zero1;zero<2333…...

【CodeTop】TOP 100 刷题 51-60

文章目录 51. 缺失的第一个正数题目描述代码与解题思路 52. 训练计划 II题目描述代码与解题思路 53. 子集题目描述代码与解题思路 54. 最小覆盖子串题目描述代码与解题思路 55. 从前序与中序遍历序列构造二叉树题目描述代码与解题思路 56. 零钱兑换题目描述代码与解题思路 57. …...

k8s的图形化工具---rancher

rancher是一个开源的企业级多集群的k8s管理平台。 rancher和k8s的区别&#xff1a;都是为了容器的调度和编排系统。但是rancher不仅可以调度还可以管理整个k8s集群。 rancher自带监控(普罗米修斯) 实验部署 master01 20.0.0.32 node01 20.0.0.34 node02 20.0.0.35 test …...

npm安装卡住问题(最新版)

npm安装卡住问题(最新版) 背景&#xff1a; ​ 最近这两天用npm安装一些包的时候&#xff0c;发现一直卡住&#xff1a; 报错&#xff1a; idealTree:npm: sill idealTree buildDeps之前能用的现在不能用了&#xff0c;我一想&#xff0c;是不是源头的问题&#xff0c;还真是…...

什么是线程死锁

死锁是指两个或两个以上的进程&#xff08;线程&#xff09;在执行过程中&#xff0c;由于竞争资 源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推 进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些永远在互相…...

Django从入门到精通(二)

目录 三、视图 3.1、文件or文件夹 3.2、相对和绝对导入urls 3.3、视图参数requests 3.4、返回值 3.5、响应头 3.6、FBV和CBV FBV 四、静态资源 4.1、静态文件 4.2、媒体文件 五、模板 5.1、寻找html模板 5.2、模板处理的本质 5.3、常见模板语法 5.4、内置模板函…...

建筑物防雷检测安全接地应用解决方案

雷电是一种自然现象&#xff0c;具有极高的电压和电流&#xff0c;对建筑物及其内部设备、人员和财产可能造成严重的危害&#xff0c;如火灾、爆炸、电击、电磁干扰等。因此&#xff0c;建筑物必须采取有效的防雷措施&#xff0c;以保障建筑物的安全和可靠运行。建筑物防雷检测…...

支付宝小程序开发踩坑笔记(支付宝、学习强国小程序)

1、接口请求安卓端回调 success&#xff0c;IOS 端回调 fail 原因&#xff1a;dataType 设置不对&#xff0c;默认是 json 格式&#xff0c;对返回数据会进行 json 解析&#xff0c;如果解析失败&#xff0c;就会回调 fail 。加密传输一般是 text 格式。 2、input 禁止输入空格…...

如何降低微服务复杂度丨云栖大会微服务主题分享实录

作者&#xff1a;谢吉宝 本文整理自阿里云资深技术专家、中间件负责人谢吉宝在2023云栖大会《极简微服务模式&#xff0c;降低微服务复杂度的最佳实践》的分享 2023 云栖大会现场 当面临复杂的挑战时&#xff0c;"分而治之"的方法往往能取得显著的效果。微服务架构…...

openresty 安装, nginx与 openresty

openresty VS nginx Nginx 是一款高性能的 Web 服务器和反向代理服务器&#xff0c;具备基础的功能如HTTP服务、负载均衡、反向代理以及动静分离等。它是许多互联网应用的核心组件&#xff0c;因其模块化和可扩展的设计而受到欢迎。1 OpenResty 是基于 Nginx 的 Web 平台&…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...