2019 电子设计大赛 激光炮题目 使用的模块和程序
外形:
购买连接:
依赖:
也是通过串口进行控制的,usart_all.h
usart_all.c
见 STM32超级通用串口程序(秘籍)
代码:
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;
}
}
}