80米工业激光测距模块的使用

2019 电子设计大赛 激光炮题目 使用的模块和程序

外形:

在这里插入图片描述

购买连接:

80米工业激光测距

依赖:

也是通过串口进行控制的,usart_all.h usart_all.cSTM32超级通用串口程序(秘籍)

代码:

laser.h

#ifndef __LASER_H
#define __LASER_H

#include "sys.h"

void LASER_Init(void);
void LASER_Measure_Signal(void);
void LASER_Measure_Continuous(void);
char LASER_Open_Light(u8 enable);
char LASER_get_distance( u16 *distance);

#endif

laser.c

#include "laser.h"
#include "usart_all.h"
#include "delay.h"

//设置起始点
//输入:start
//0:尾端
//1:顶端
char LASER_Set_StartPosition(u8 start) {
	if(start==0 || start==1) {
		UART4_PutChar(0xFA);
		UART4_PutChar(0x04);
		UART4_PutChar(0x08);
		
		UART4_PutChar(start);
		
		UART4_PutChar((u8)~(0xFA+0x04+0x08+start)+1);
		return 1;
	} else {
		return 0;
	}
}

//设置量程
//输入:range
//5:5m
//10:10m
//30:30m
//50:50m
//80:80m
char LASER_Set_Range(u8 range) {
	if(range==5 || range==10 || range==30 || range==50 || range==80) {
		UART4_PutChar(0xFA);
		UART4_PutChar(0x04);
		UART4_PutChar(0x09);
		
		UART4_PutChar(range);
		
		UART4_PutChar((u8)~(0xFA+0x04+0x09+range)+1);
		return 1;
	} else {
		return 0;
	}
}

//设置频率
//输入freq
//0:0Hz
//5:5Hz
//10:10Hz
//20:20Hz
char LASER_Set_Freq(u8 freq) {
	if(freq==0 || freq==5 || freq==10 || freq==20) {
		UART4_PutChar(0xFA);
		UART4_PutChar(0x04);
		UART4_PutChar(0x0A);
		
		UART4_PutChar(freq);
		
		UART4_PutChar((u8)~(0xFA+0x04+0x0A+freq)+1);
		return 1;
	} else {
		return 0;
	}
}

//设置分辨率
//输入solution
//1:1mm
//2: 0.1mm
char LASER_Set_Solution(u8 solution) {
	if(solution==1 || solution==2) {
		UART4_PutChar(0xFA);
		UART4_PutChar(0x04);
		UART4_PutChar(0x0C);
		
		UART4_PutChar(solution);
		
		UART4_PutChar((u8)~(0xFA+0x04+0x0C+solution)+1);
		return 1;
	} else {
		return 0;
	}
}

//是否开启激光瞄准
//输入:enable
//0:关闭
//1:开启
char LASER_Open_Light(u8 enable) {
	if(enable==0 || enable==1) {
		UART4_PutChar(0x80);
		UART4_PutChar(0x06);
		UART4_PutChar(0x05);
		
		UART4_PutChar(enable);
		
		UART4_PutChar((u8)~(0x80+0x06+0x05+enable)+1);
		return 1;
	} else {
		return 0;
	}
}

//单次测量
void LASER_Measure_Signal(void) {
	UART4_PutChar(0x80);
	UART4_PutChar(0x06);
	UART4_PutChar(0x02);
	
	UART4_PutChar((u8)~(0x80+0x06+0x02)+1);
}

//连续测量
void LASER_Measure_Continuous(void) {
	UART4_PutChar(0x80);
	UART4_PutChar(0x06);
	UART4_PutChar(0x03);
	
	UART4_PutChar((u8)~(0x80+0x06+0x03)+1);
}

//激光测距模块初始化
void LASER_Init(void) {
	UART4_Init(9600);
	LASER_Set_StartPosition(1);//设置起始点为顶端
	delay_ms(500);
	LASER_Set_Range(5);//量程为5米
	delay_ms(500);
	LASER_Set_Freq(20);//频率为20Hz
	delay_ms(500);
	LASER_Set_Solution(1);//设置分辨率为1mm
	delay_ms(500);
	LASER_Open_Light(0);//开启激光瞄准
	delay_ms(500);
}

char LASER_get_distance( u16 *distance) {
	u8 flag_start = 0;
	u8 data[10];


	LASER_Open_Light(1);
	delay_ms(500);
	UART4_ClearRXBuf();
	LASER_Measure_Signal();

	
	while(1) {
		while(!UART4_GetChar(&flag_start)); //直至获得数据开头
		if(flag_start == 0x80) {
			//此步超级阻塞
			while(UART4_RX_Len < 10); //直至获得所有信息数据+数据结尾
			UART4_GetDatas(data, 10);
			if(data[2] == 0x30) {
				*distance = 100*(data[4]-0x30)+10*(data[6]-0x30)+(data[7]-0x30);
				delay_ms(500);
				LASER_Open_Light(0);
				delay_ms(500); 
				return 1;
			}
			//接收成功
			// for(i=0; i<cmd_length; i++) {
			// 	*cmd = data[i];
			// 	cmd++;
			// }
			// return 1;
		}
	}
	
	
}

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

匿名匿名匿名11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值