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

这篇具有很好参考价值的文章主要介绍了新定义51单片机(RD8G37)实现测距测速仪。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

测距仪演示效果

 文章来源地址https://www.toymoban.com/news/detail-801115.html

新定义RD8G37Q48RJ开发板

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

超声波测距模块: 

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

8位并口屏

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

 

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。

 

 

 

 

到了这里,关于新定义51单片机(RD8G37)实现测距测速仪的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机设计基于51单片机的智能风扇控制系统设计与实现

      我们常见的电风扇一般只有四、五个风速档,用的是人工开关,而且并不是每个人家里都会有空调,或者在一些小型的工厂或者一些小型加工厂,这些地方都可能没有配备大型的中央空调系统这些东西,所以这些东西往往都会采用风扇这种小成本的东西来代替,但是不清楚

    2024年02月03日
    浏览(69)
  • C51单片机实现呼吸灯

         呼吸灯的效果是灯的亮度由暗缓慢变亮再缓慢变暗。      实现思路是改变小灯亮与暗在单位周期的占空比。如下图 具体代码如下:

    2024年02月11日
    浏览(54)
  • 通过51单片机实现直流电机调速

    随着各种工业生产设备和机械设备的广泛使用,直流电机调速技术的研究和应用越来越受到人们的重视,具有广泛的应用前景。本项目通过51单片机实现直流电机调速功能,为实际工程应用提供一个可靠和有效的调速方案。 如果需要下载项目工程,可以去这里: https://blog.c

    2024年02月14日
    浏览(48)
  • 51单片机实现矩阵键盘密码锁

    使用51单片机的矩阵键盘模块以及led1602显示屏,实现模拟密码锁。 当程序烧录到单片机中后,led1602屏幕会显示文字。 第一行会显示单词“PASSWORD”,第二行显示4个0,表示我们要写入的四位密码,每位默认为0。 矩阵键盘前两行与第三行的前两个分别代表输入1-9与0,第三行第

    2024年02月03日
    浏览(58)
  • 【【51单片机蜂鸣器实现起风了】】

    前面的有两个非常关键的点希望兄弟们明白 我一开始也失算了 这里兄弟们注意务必改成int 不然会超出 就会出现播放一半从头开始的情况 下面是两份起风了代码直接附上main.c 因为另外的其实和我之前说的模板都一样复制粘贴就行 为什么是2份因为什么ABCD大调我不懂啊 我看乐

    2024年02月16日
    浏览(123)
  • 51单片机点阵屏实现俄罗斯方块

    前言 一、关于点阵屏 二、俄罗斯方块代码部分 1.main主函数 2.按键扫描 3.方块生成 4.方块显示  5.方块下降   6.固定的方块显示 7.方块的左右移动 8.键值的判断与执行  9.方块的旋转   10.总代码 总结 这里采用的是清翔51单片机,通过独立键盘实现左右移动和旋转,通过8×8点

    2024年02月11日
    浏览(35)
  • 【51单片机】矩阵按键实现数码管显示

    闲的没事看一看玩一玩········· 矩阵按键 数码管是一种导体发光器件,其基本单元是发光二极管。按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管 共阴极数码管是指将所有发光二极管的阴极接到一起形成共阴极的数码管,共阴极的数码管在应用时将公共

    2024年02月02日
    浏览(60)
  • 基于51单片机实现时间显示及闹钟设置

    本次为大学中的一次创新实验,当时老师叫我自己拿个单片机去玩,为了赶时间就做了个简单的时间显示和闹钟设置,因为比较简单所以也把代码附上了。 1.单片机 单片机内部内部资源:Flash——程序存储空间;RAM——数据存储空间;SFR——特殊功能寄存器。51单片机指的是

    2024年02月07日
    浏览(40)
  • 51单片机-定时器(简易时钟的实现)

    最近在学习51单片机,学到了 定时器 这块,由于自己的基础不太扎实,在这方面花了很多时间,这里通过对定时器和中断的介绍,用 简易时钟 这个例子来对学习的内容进行加深巩固,把自己的经验分享给大家,希望对大家能够有帮助。 其实就是单片机的内部,通过系统时钟

    2024年02月03日
    浏览(68)
  • 51单片机实现SG90舵机任意角度转动

    参考单片机——SG90舵机工作原理_掏一淘哆啦A梦的奇妙口袋的博客-CSDN博客​​​​​​ 这位博主做的代码,在此基础上进行简单修改成可以用51单片机的定时器和中断实现SG90舵机任意角度转动 完整代码如下:  这里对主要的内容进行解释。 根据51单片机定时器计数初值的计

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包