新定义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。

 

 

 

 

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

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

相关文章

阿里云国外服务器价格表

阿里云国外服务器优惠活动「全球云服务器精选特惠」&#xff0c;国外服务器租用价格24元一个月起&#xff0c;免备案适合搭建网站&#xff0c;部署独立站等业务场景&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云国外服务器优惠活动&#xff1a; 全球云服务器精选特惠…

web terminal - 如何在mac os上运行gotty

gotty可以让你使用web terminal的方式与环境进行交互&#xff0c;实现终端效果 假设你已经配置好了go环境&#xff0c;首先使用go get github.com/yudai/gotty命令获取可执行文件&#xff0c;默认会安装在$GOPATH/bin这个目录下&#xff0c;注意如果你的go版本比较高&#xff…

大数据深度学习ResNet深度残差网络详解:网络结构解读与PyTorch实现教程

文章目录 大数据深度学习ResNet深度残差网络详解&#xff1a;网络结构解读与PyTorch实现教程一、深度残差网络&#xff08;Deep Residual Networks&#xff09;简介深度学习与网络深度的挑战残差学习的提出为什么ResNet有效&#xff1f; 二、深度学习与梯度消失问题梯度消失问题…

2024年腾讯云轻量服务器和CVM云服务器性能如何?

腾讯云轻量服务器和云服务器有什么区别&#xff1f;为什么轻量应用服务器价格便宜&#xff1f;是因为轻量服务器CPU内存性能比云服务器CVM性能差吗&#xff1f;轻量应用服务器适合中小企业或个人开发者搭建企业官网、博客论坛、微信小程序或开发测试环境&#xff0c;云服务器CV…

RaspberryPi(树莓派)配置 VNC

RaspberryPi&#xff08;树莓派&#xff09;是可以通过 VNC 来连接到机器上进行图形化操作的。 什么 VNC VNC&#xff08;Virtual Network Computing&#xff09;&#xff0c;为一种使用RFB协议的屏幕画面分享及远程操作软件。此软件借由网络&#xff0c;可发送键盘与鼠标的动…

node.js(express.js)+mysql实现注册功能

文章目录 实现步骤一、获取客户端提交到服务器的用户信息&#xff0c;对表单中的数据&#xff0c;进行合法性的效验 代码如下:二、检测用户名是否被占用三、对密码进行加密四、插入新用户&#xff08;完整代码&#xff09;总结 实现步骤 一、获取客户端提交到服务器的用户信息…

plc红绿灯程序

引言&#xff1a; PLC&#xff08;Programmable Logic Controller&#xff0c;可编程逻辑控制器&#xff09;是一种用于工业自动化控制的电子设备。西门子的SIMATIC S7-200是这类设备的一个流行系列&#xff0c;广泛应用于小型至中等规模的自动化项目中。它具有以下特点&#…

常见的设计模式(模板与方法,观察者模式,策略模式)

前言 随着时间的推移&#xff0c;软件代码越来越庞大&#xff0c;随着而来的就是如何维护日趋庞大的软件系统。在面向对象开发出现之前&#xff0c;使用的是面向过程开发来设计大型的软件程序&#xff0c;面向过程开发将软件分成一个个单独的模块&#xff0c;模块之间使用函数…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-17 串讲

7.6 MySQL基本函数的使用(❤❤❤)

7.6 MySQL基本函数的使用 1. 提要2. 数字函数3. 字符函数3.1 替换字符3.2 左填充字符及截取字符串 4. 日期函数4.1 日期函数4.2 表达式占位符4.3 日期偏移计算4.4 日期间隔 5. 条件函数5.1 IF语句5.2 case...when语句 1. 提要 2. 数字函数 3. 字符函数 3.1 替换字符 -- INSERT…

[剪藏] - 任泽平年终演讲精华:点燃希望——2024中国经济十大预测

任泽平年终演讲精华&#xff1a;点燃希望——2024中国经济十大预测 泽平宏观 2023-12-23 08:01 发表于上海 12月22日22:30&#xff0c;任泽平年终秀“点燃希望乐观者前行——2024中国经济十大预测”圆满收官。 泽平宏观、北京广播电视台、上海高净值研究院、北京时间等携手打…

Gorm 应用开发时区问题与unique唯一索引字段数据冲突问题

文章目录 一、定义表模型时区问题1.1 time.Time 与int641.2 优势 二、unique唯一索引字段数据冲突问题 一、定义表模型时区问题 1.1 time.Time 与int64 一般情况下&#xff0c;我们在定义表模型的时候&#xff0c;会使用time.Time&#xff0c;但是会根据当前时间存储。返回给…

现代密码学 考点汇总(下)

现代密码学 考点汇总 写在最前面考试范围一、给一个简单的方案&#xff0c;判断是否cca安全二、随机预言机模型之下的简单应用 2. MAC概念回顾MAC的定义适应性CMA&#xff08;Chosen Message Attack&#xff09;PPT攻击者不可忽略的概率&#xff08;negl(n)&#xff09;总结 案…

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

vue2+webpack升级vue3+vite,报错Cannot read properties of null (reading ‘isCE‘)

同学们可以私信我加入学习群&#xff01; 正文开始 前言问题分析解决总结 前言 系列文章&#xff1a;vue2webpack升级vue3vite&#xff0c;修改插件兼容性bug 前面的文章主要是介绍&#xff0c;在升级初始阶段遇到的一些显而易见的兼容性问题和bug。随着项目迭代的不断深入&a…

视频美颜SDK技术解析与技术对比

当下&#xff0c;各类应用和服务纷纷采用视频美颜SDK&#xff0c;以提供更加令人满意的视觉效果。本文将深入探讨视频美颜SDK的技术原理&#xff0c;同时对比不同SDK的特性&#xff0c;为开发者和决策者提供全面的技术参考。 一、技术原理解析 1.图像处理基础 视频美颜SDK基…

易懂的方式讲解ARM中断原理以及中断嵌套方法

ARM有七种模式&#xff0c;我们这里只讨论SVC、IRQ和FIQ模式。 我们可以假设ARM核心有两根中断引脚&#xff08;实际上是看不见的&#xff09;&#xff0c;一根叫 irq pin, 一根叫fiq pin。在ARM的cpsr中&#xff0c;有一个I位和一个F位&#xff0c;分别用来禁止IRQ和FIQ。 先…

MyBatisPlus学习笔记三-核心功能

接上篇&#xff1a; MyBatisPlus学习笔记二-CSDN博客 1、核心功能-IService开发基础业务接口 1.1、介绍 1.2、引用依赖 1.3、配置文件 1.4、用例-新增 1.5、用例-删除 1.6、用例-根据id查询 1.7、用例-根据ids查询 2、核心功能-IService开发复杂业务接口 2.1、实例-更新 3、…

Elasticsearch各种文档操作2

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据过滤字段查询文档概述指定想要显示的字段示例 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作 过滤字段查询文档 概述 默认情况下&#xff0c;Elasticsearch 在搜索的结果中…

vite和webpack的区别和作用

前言 Vite 和 Webpack 都是现代化的前端构建工具&#xff0c;它们可以帮助开发者优化前端项目的构建和性能。虽然它们的目标是相似的&#xff0c;但它们在设计和实现方面有许多不同之处。 一、Vite详解和作用 vite 是什么 vite —— 一个由 vue 作者尤雨溪开发的 web 开发工…