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

news2025/1/3 6:25:54

本文描述用新定义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。

 

 

 

 

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

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

相关文章

Linux基础命令(超详细)

1、Linux命令入门 命令: 告诉我们要做什么事 选项: 规定做事的方式参数: 规定对谁做这件事 ls命令 # ls 展示目录中的文件信息 ls # -a 展示所有文件内容,包括隐藏文件(以点开头的文件内容) # -l 以列表形式详细展示文件内容 # -h 以合适的单位展示文件大小, 配合-l进行使用 #…

Google推广之关键字匹配类型

做过线上推广的小伙伴们应该都知道&#xff0c;关键字有肯定和否定形式&#xff0c;今天我们主要跟大家分享肯定式关键字的四种匹配类型。不同匹配面向的客户群体不尽相同&#xff0c;比如&#xff0c;我们可以使用“广泛匹配”类型&#xff0c;向广泛的受众群体展示广告&#…

电梯节能落座-智慧停车场️,电梯不仅可载人也可以载汽车!

电梯不仅可载人也可以载汽车哦&#xff01; 在北京市丰台区&#xff0c;有这么一个智慧停车场&#x1f17f;️ &#xff0c;共298个停车位&#xff0c;全部智能一体化&#xff0c;简直是“豪华” “智能” 的象征。 523能源&#xff1a;小伍&#xff0c;你跑题了... 小伍&am…

2023年的年度总结PPT不一样了?

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 到了年终&#xff0c;需要撰写年度总结和制定计划了吗&#xff1f; 找不到合适的 PPT 模板&#xff1f; 感到缺乏灵感&#xff1f; 为做 PPT 绞尽脑汁&#xff1f; 为何不试试 AI 写 PPT 呢&#xff1f…

Docker篇之修改docker默认磁盘占用目录

一、前言 通常情况下&#xff0c;当我们默认安装docker服务时&#xff0c;在不指定默认存储路径时&#xff0c;docker会自动创建目录&#xff0c;经常会出现打满根目录的情况。 默认存储路径为&#xff1a;/var/lib/docker 下 可通过如下进行查询&#xff1a; docker info输出…

Pandas.DataFrame.drop() 删除行或列 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.1.2 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 Pandas稳定版更新及变动内容整合专题&#xff1a; Pandas稳定版更新及变动迭持续更新。 Pandas API参…

web3.0基本概念简析

web3.0概念简析 web3.0的发展史 web1.0 仅用于展示&#xff0c;无法进行点赞评论等交互 web2.0 不仅可以展示&#xff0c;还可以上传视频、图片等&#xff0c;用户可以参与创作内容并获取收益。但还是中心化的模型 缺点 1 机械化的人机验证 2 账户安全无法保证 多年未登陆…

Mechanics 1-Mechanics Toolkit(课件-编辑中)

1.1 Quantities&#xff0c;Units&Modelling 1.1.1 Scalars(标量) & Vectors(矢量) Scalars: 跑步速度5m/s 实际应用中为什么要引入Vector&#xff1f; 这个数据如果在导弹拦截中够用吗&#xff1f; 除了速率(Speed)&#xff0c;还需要发射方向(direction) 因此用Spe…

[C++] opencv - Mat::convertTo函数介绍和使用场景

Mat::convertTo()函数 Converts an array to another data type with optional scaling. 该函数主要用于数据类型的相互转换。 The method converts source pixel values to the target data type. saturate_cast<> is applied at the end to avoid possible overf…

安装Sql2012提示:需要更新以前的Visual Studio 2010 实例

解决方案&#xff1a;先卸载visual studio 2010 ,安装SQL2012

net 8.0 + mysql 数据库的应用与实现

首先引入nutget包 第二步根目录创建一个文件夹名字自取&#xff0c;再建一个SqlContent类 using Microsoft.EntityFrameworkCore; using System.Data.Entity; using DbContext Microsoft.EntityFrameworkCore.DbContext;namespace YuanFuTouBao2022Core.Dao {public class Sql…

C语言位域定义与使用

参考文章&#xff1a; 【C语言】详解位域定义与使用_c 语言定义位-CSDN博客 代码有修改&#xff0c;主要是变量初始化&#xff0c;原程序可能相应内存不能写。且第二个字节F不好区分各位。 #include <stdio.h>typedef struct {unsigned short b1 : 1;unsigned short b…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用相机日志跟踪功能&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和短曝光功能的技术背景Baumer工业相机通过NEOAPI SDK使用相机日志跟踪功能1.引用合适的类文件2.通过NEOAPI SDK使用相机日志跟踪功能3.通…

群晖NAS搭建WebDav结合内网穿透实现公网访问本地影视资源

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SAP 中的外部接口:预扣税

文章目录 1 Introduction2 implementation3 Summary 1 Introduction We use BP create WTAX_TYPE ,I don’t find a bapi. We will update for it . We will impement WTax type , WTax code ,Subject in the ‘BP’. 2 implementation UPDATE lfbw SET witht gs_alv-wit…

FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录 FreeRTOS学习第7篇--周期性延迟和相对性延迟函数时间延迟vTaskDelay函数原型vTaskDelayUntil函数原型PrintTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第7篇–周期性延迟和相对性延迟函数 本文目标&#xff1a;学习与使用FreeRTOS中的延迟函数&…

YOLOv8改进 | Conv篇 | 在线重参数化卷积OREPA助力二次创新(提高推理速度 + FPS)

一、本文介绍 本文给大家带来的改进机制是一种重参数化的卷积模块OREPA,这种重参数化模块非常适合用于二次创新,我们可以将其替换网络中的其它卷积模块可以不影响推理速度的同时让模型学习到更多的特征。OREPA是通过在线卷积重参数化(Online Convolutional Re-parameteriza…

基于Java+SSM技术的宠物领养系统设计与实现【附源码】

基于JavaSSM技术的宠物领养系统设计与实现【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 …

架设一台NFS服务器,并按照以下要求配置

1、开放/nfs/shared目录&#xff0c;供所有用户查询资料 2、开放/nfs/upload目录&#xff0c;为192.168.xxx.0/24网段主机可以上传目录&#xff0c; 并将所有用户及所属的组映射为nfs-upload,其UID和GID均为210 3、将/home/tom目录仅共享给192.168.xxx.xxx这台主机&#xff0c;…

【嘉立创EDA-PCB设计指南】2.详解BOM表+C0603封装绘制流程+元件封装其它注意点总结+原理图转到PCB流程

前言&#xff1a;本文详解BOM表C0603封装绘制流程元件封装其它注意点总结原理图转到PCB流程。最终会实现如下图所示的PCB初态。对于封装绘制的流程是一样的&#xff0c;所以只在第2章节对C0603进行详细的封装流程描述&#xff0c;对该PCB的其它元件在第3章节-元件封装的其它注意…