新定义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/100
	distance[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。

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS上h5长按识别图片二维码,图片会默认放大,禁用这一默认行为

iOS上h5长按识别图片二维码&#xff0c;图片会默认放大&#xff0c;禁用这一默认行为 测试代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-widt…

变分自编码器(Variational AutoEncoder,VAE)

1 从AE谈起 说到编码器这块&#xff0c;不可避免地要讲起AE&#xff08;AutoEncoder&#xff09;自编码器。它的结构下图所示&#xff1a; 据图可知&#xff0c;AE通过自监督的训练方式&#xff0c;能够将输入的原始特征通过编码encoder后得到潜在的特征编码&#xff0c;实现了…

npm依赖库备份

常用命令 设置默认使用本地缓存安装Nodejs时会自动安装npm&#xff0c;但是局路径是C:\Users\Caffrey\AppData\Roaming\npm默认的缓存路径是C:\Users\Caffrey\AppData\Roaming\npm-cache&#xff1b;查看npm的prefix和cache路径配置信息设置路径 设置默认使用本地缓存 npm con…

MySQL面试题 | 14.精选MySQL面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Java NIO (三)NIO Channel类

1 概述 前面提到&#xff0c;Java NIO中一个socket连接使用一个Channel来表示。从更广泛的层面来说&#xff0c;一个通道可以表示一个底层的文件描述符&#xff0c;例如硬件设备、文件、网络连接等。然而&#xff0c;远不止如此&#xff0c;Java NIO的通道可以更加细化。例如&a…

实战 | OpenCV两种不同方法实现粘连大米粒分割计数(步骤 + 源码)

导 读 本文主要介绍基于OpenCV的两种不同方法实现粘连大米分割计数,并给详细步骤和源码。源码和图片素材见文末。 背景介绍 测试图如下,图中有个别米粒相互粘连,本文主要演示如何使用OpenCV用两种不同方法将其分割并计数。 方法一:基于分水岭算法 基于分水岭算法…

【playwright】新一代自动化测试神器playwright+python系列课程18_playwritht元素相关操作_等待元素到某种状态

元素相关操作_等待元素到某种状态 对于自动化测试来说&#xff0c;本质上就是定位元素、操作元素。网页上的元素有不同状态&#xff0c;有些元素本来不在网页的DOM中&#xff0c;经过某一步操作后才出现。有些元素是本来就已经在DOM中但是是隐藏的状态&#xff0c;经过某一步操…

K8S--解决访问Harbor私有仓库无权限的问题(401 Unauthorized)

原文网址&#xff1a;K8S--解决访问Harbor私有仓库无权限的问题&#xff08;401 Unauthorized&#xff09;-CSDN博客 简介 本文解决K8S访问Harbor私有仓库无权限的问题&#xff1a;401 Unauthorized。 问题复现 用Harbor部署了私有仓库&#xff0c;将镜像推送上去。指定私有…

python数字图像处理基础(五)——Canny边缘检测、图像金字塔、图像分割

目录 Canny边缘检测原理步骤 图像金字塔1.高斯金字塔2.拉普拉斯金字塔 图像分割图像轮廓检测1.检测轮廓2.绘制轮廓3.补充 Canny边缘检测 梯度是什么? 梯度就是变化的最快的那个方向 edge cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]…

第90讲:MySQL数据库主从复制集群原理概念以及搭建流程

文章目录 1.MySQL主从复制集群的核心概念1.1.什么是主从复制集群1.2.主从复制集群中的专业术语1.3.主从复制集群工作原理1.4.主从复制中的小细节1.5.搭建主从复制集群的前提条件1.6.MySQL主从复制集群的架构信息 2.搭建MySQL多实例环境2.1.在mysql-1中搭建身为主库的MySQL实例2…

小程序 自定义组件和生命周期

文章目录 ⾃定义组件创建⾃定义组件声明组件编辑组件注册组件 声明引⼊⾃定义组件⻚⾯中使⽤⾃定义组件定义段与⽰例⽅法组件-⾃定义组件传参过程 小程序生命周期应用生命周期页面生命周期页面生命周期 ⾃定义组件 类似vue或者react中的自定义组件 ⼩程序允许我们使⽤⾃定义组件…

设计模式的学习笔记

设计模式的学习笔记 一. 设计模式相关内容介绍 1 设计模式概述 1.1 软件设计模式的产生背景 设计模式最初并不是出现在软件设计中&#xff0c;而是被用于建筑领域的设计中。 1977 年美国著名建筑大师、加利福尼亚大学伯克利分校环境结构中心主任 Christopher Alexander 在…

【动态规划】【数学】【C++算法】18赛车

作者推荐 视频算法专题 本文涉及知识点 动态规划 数学 LeetCode818赛车 你的赛车可以从位置 0 开始&#xff0c;并且速度为 1 &#xff0c;在一条无限长的数轴上行驶。赛车也可以向负方向行驶。赛车可以按照由加速指令 ‘A’ 和倒车指令 ‘R’ 组成的指令序列自动行驶。 当…

情人节专属--html5 canvas制作情人节告白爱心动画特效

💖效果展示 💖html展示 <!doctype html> <html> <head> <meta charset=

2023年移远车载全面开花,智能座舱加速进击

作为汽车智能化的关键组件&#xff0c;车载模组正发挥着越来越重要的作用。 移远通信进入车载模组领域近十年&#xff0c;已形成了完善的车载产品队列&#xff0c;不但在5G/4G车载通信、智能座舱、C-V2X车路协同等领域打造了一枝独秀的产品线&#xff0c;也推出了车规级Wi-Fi/蓝…

解决springboot启动报Failed to start bean ‘subProtocolWebSocketHandler‘;

解决springboot启动报 Failed to start bean subProtocolWebSocketHandler; nested exception is java.lang.IllegalArgumentException: No handlers 问题发现问题解决 问题发现 使用springboot整合websocket&#xff0c;启动时报错&#xff0c;示例代码&#xff1a; EnableW…

大数据时代的黄金机遇:阿里云大数据分析师ACP认证【一条龙服务100%通过】

扫码和我联系 随着大数据技术的迅速发展和广泛应用&#xff0c;成为了当今时代最具吸引力的技术之一。为了让更多技术人才把握这一时代机遇&#xff0c;阿里云推出了大数据分析师ACP认证&#xff08;Alibaba Cloud Certified Professional - Data Analyst&#xff09;&#xf…

数据结构:顺序栈

栈是一种先进后出的数据结构&#xff0c;只允许在一端&#xff08;栈顶&#xff09;操作&#xff0c;代码中top表示栈顶。 stack.h /* * 文件名称&#xff1a;stack.h * 创 建 者&#xff1a;cxy * 创建日期&#xff1a;2024年01月17日 * 描 述&#xff1a; …

LeetCode、2542. 最大子序列的分数【中等,排序+小顶堆】

文章目录 前言LeetCode、2542. 最大子序列的分数【中等&#xff0c;排序小顶堆】题目及类型思路及代码实现 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领…

基于Springboot的摄影分享网站系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的摄影分享网站系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…