【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程

文章目录

    • 1、模块型号
    • 2、模块型号
    • 3、产品注意事项
    • 4、模块测量接线
    • 5、通信协议
    • 6、厂家配置的资料
    • 7、参考例程

1、模块型号

【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第1张图片
我购买的激光测距模块使用的是TTL可输出方式,模块的选择根据使用场景选择,可以参考摩天官方的淘宝店铺。
【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第2张图片
【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第3张图片

2、模块型号

【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第4张图片

3、产品注意事项

【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第5张图片

4、模块测量接线

【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第6张图片
【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第7张图片

5、通信协议

波特率:9600/19200/38400/115200,默认38400

波特率设置需要使用原厂的串口调试助手更改

6、厂家配置的资料

我将厂家配置的资料发出来供大家参考
百度网盘链接:https://pan.baidu.com/s/1biMWVnXSu3cVpE577mE1EQ
提取码:wfp4

7、参考例程

把自己写的测试代码发出来,仅供参考。
例程说明:将采集到的距离信息在LCD1602显示出来

#include 
#include 

/*=================================================
*自定义数据类型
=================================================*/
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,防止数组溢出
		
    }
}

【传感器文档与工程例程】STC89C52RC摩天MyAntenna激光测距离传感器模块工程例程_第8张图片
O(∩_∩)O哈哈~,还是有一点瑕疵。这是当时用来做模块测试的一个例程,如果用在产品开发上,还有很多需要优化。

你可能感兴趣的:(单片机基础,单片机,keil,mdk)