1、模块型号
我购买的激光测距模块使用的是TTL可输出方式,模块的选择根据使用场景选择,可以参考摩天官方的淘宝店铺。
2、模块型号
3、产品注意事项
4、模块测量接线
5、通信协议
波特率:9600/19200/38400/115200,默认38400
波特率设置需要使用原厂的串口调试助手更改
6、厂家配置的资料
我将厂家配置的资料发出来供大家参考
百度网盘链接:https://pan.baidu.com/s/1biMWVnXSu3cVpE577mE1EQ
提取码:wfp4
7、参考例程
把自己写的测试代码发出来,仅供参考。
例程说明:将采集到的距离信息在LCD1602显示出来
#include <reg51.h>
#include <intrins.h>
/*=================================================
*自定义数据类型
=================================================*/
typedef unsigned char uchar;
typedef unsigned int uint;
/*LED_Buffer[16]用来存储串口发送的数据,com_dat用来记录串口发送的个数*/
uchar LCD_Buffer[16],com_dat;//从串口接收的数据
#define LCD1602_DB P0 //LCD1602数据总线
/*摩天MyAntenna激光测距离模块常用命令*/
#define ONCE_MEASURE "iSM" //单次测量
//单片机IO管脚定义
sbit LCD1602_RS = P3^5; //RS端
sbit LCD1602_RW = P3^6; //RW端
sbit LCD1602_EN = P3^4; //EN端
void InitUART(void)
{
TMOD = 0x20;//设置定时器1,工作方式2,8位自动重载
SCON = 0x50;//设置串口工作方式1,允许接收
TH1 = 0xFD;//波特率设置为9600
TL1 = TH1;
PCON = 0x00;//波特率不加倍
EA = 1;//开总中断
ES = 1;//允许串联1中断
TR1 = 1;//启动定时器T1
}
//向串口发送一段字符串
void prints(char *s)
{
while(*s != '\0')//发送字符串,直到遇到0才结束
{
SBUF = *s++;
while(!TI);
TI = 0;
}
}
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
void Delay_ms(unsigned int time)
{
unsigned int i;
for(i=0; i<time; i++)
{
Delay1ms();
}
}
/*=================================================
*函数名称:Read_Busy
*函数功能:判断1602液晶忙,并等待
=================================================*/
void Read_Busy()
{
uchar busy;
LCD1602_DB = 0xff;//复位数据总线
LCD1602_RS = 0; //拉低RS
LCD1602_RW = 1; //拉高RW读
do
{
LCD1602_EN = 1;//使能EN
busy = LCD1602_DB;//读回数据
LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待
}
/*=================================================
*函数名称:LCD1602_Write_Cmd
*函数功能:写LCD1602命令
*调用:Read_Busy();
*输入:cmd:要写的命令
=================================================*/
void LCD1602_Write_Cmd(uchar cmd)
{
Read_Busy(); //判断忙,忙则等待
LCD1602_RS = 0;
LCD1602_RW = 0; //拉低RS、RW操作时序情况1602课件下中文使用说明基本操作时序章节
LCD1602_DB = cmd;//写入命令
LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内
LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿
}
/*=================================================
*函数名称:LCD1602_Write_Dat
*函数功能:写LCD1602数据
*调用:Read_Busy();
*输入:dat:需要写入的数据
=================================================*/
void LCD1602_Write_Dat(uchar dat)
{
Read_Busy();
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_EN = 1;
LCD1602_EN = 0;
}
/*=================================================
*函数名称:LCD1602_Dis_Str
*函数功能:在指定位置显示字符串
*调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();
*输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)
*str:需要显示的字符串
=================================================*/
void LCD1602_Dis_Str(uchar x, uchar y, uchar *str)
{
if(y) x |= 0x40;
x |= 0x80;
LCD1602_Write_Cmd(x);
while(*str != '\0')
{
LCD1602_Write_Dat(*str++);
}
}
/*=================================================
*函数名称:Init_LCD1602
*函数功能:1602初始化
*调用: LCD1602_Write_Cmd();
=================================================*/
void Init_LCD1602()
{
LCD1602_Write_Cmd(0x38); // 设置16*2显示,5*7点阵,8位数据接口
LCD1602_Write_Cmd(0x0c); //开显示
LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1
LCD1602_Write_Cmd(0x01); //清除显示
}
void main(void)
{
uchar TestStr[] = {"receive data:"};
com_dat = 0;
InitUART();
Init_LCD1602();//1602初始化
LCD1602_Dis_Str(0, 0, &TestStr[0]); //显示字符串
while(1)
{
LCD1602_Dis_Str(0, 1, LCD_Buffer);
com_dat = 0;
Delay_ms(500);
prints(ONCE_MEASURE); //向串口发送单次测量命令
}
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
LCD_Buffer[com_dat] = SBUF; //把从串口读出的数存到数组
RI = 0;
com_dat++;
if(com_dat == 16) com_dat = 0; //当com_dat = 16时,清0,防止数组溢出
}
}
O(∩_∩)O哈哈~,还是有一点瑕疵。这是当时用来做模块测试的一个例程,如果用在产品开发上,还有很多需要优化。