一、前言
隨著科技的不斷進(jìn)步和應(yīng)用需求的增加,測距儀成為了許多領(lǐng)域必備的工具之一。傳統(tǒng)的測距儀價(jià)格昂貴、體積龐大,使用起來不夠方便。本項(xiàng)目采用STC89C52單片機(jī)作為主控芯片,結(jié)合XKC-KL200激光測距模塊和LCD1602顯示器,實(shí)現(xiàn)了一個(gè)簡易且高效的激光測距儀。這個(gè)測距儀可以幫助用戶快速準(zhǔn)確地測量目標(biāo)與測距儀之間的距離,并將結(jié)果通過LCD1602顯示器直觀地展示出來。
目前很多測距儀主要采用超聲波或紅外線等技術(shù)進(jìn)行測量,但這些方法存在一定的局限性,比如受到環(huán)境干擾、測量距離有限等問題。而激光測距技術(shù)在測量精度和穩(wěn)定性方面具有顯著優(yōu)勢。XKC-KL200模塊是一款基于激光測距原理的模塊,具有高精度、快速測量等特點(diǎn)。通過與STC89C52單片機(jī)相結(jié)合,能夠利用模塊提供的數(shù)據(jù)和功能,快速實(shí)現(xiàn)一個(gè)功能完善的激光測距儀。
LCD1602顯示器作為輸出設(shè)備,能夠直觀地顯示測得的距離信息,具有體積小巧、低功耗、易于集成等特點(diǎn),非常適合作為測距儀的顯示屏。通過將測量結(jié)果轉(zhuǎn)換為字符串,并利用LCD1602的命令和數(shù)據(jù)寫入函數(shù),可以在顯示器上清晰地展示出測得的距離值。
基于STC89C52單片機(jī)和XKC-KL200激光測距模塊的激光測距儀項(xiàng)目,結(jié)合了激光測距技術(shù)和單片機(jī)控制技術(shù),通過LCD1602顯示器直觀地展示出測得的距離信息。這個(gè)項(xiàng)目不僅滿足了測距需求,而且具有成本低、體積小、使用方便等優(yōu)勢,無論是在建筑、工程、地理測量還是運(yùn)動(dòng)、航空等領(lǐng)域,這個(gè)激光測距儀都可以正常使用。
二、硬件連線說明
【1】LCD1602模塊
(1)VSS 引腳連接到單片機(jī)的GND引腳(地線)
(3)VO 引腳可以通過一個(gè)10K電位器連接到單片機(jī)的GND引腳,用于調(diào)節(jié)背光亮度
(4)RS 引腳連接到單片機(jī)的P0口(作為命令/數(shù)據(jù)選擇引腳)
(5)RW 引腳連接到單片機(jī)的GND引腳(將LCD設(shè)為寫模式)
(6)E 引腳連接到單片機(jī)的P1口(作為使能引腳)
(7)D0 ~ D7 引腳分別連接到單片機(jī)的P2 ~ P7口(作為數(shù)據(jù)引腳)
【2】XKC-KL200激光測距模塊
(1)VCC 引腳連接到單片機(jī)的5V引腳(正電源)
(2)GND 引腳連接到單片機(jī)的GND引腳(地線)
(3)TX 引腳連接到單片機(jī)的RXD引腳(串口接收引腳)
(4)RX 引腳連接到單片機(jī)的TXD引腳(串口發(fā)送引腳)
三、XKC-KL200激光測距模塊
XKC-KL200 是一款智能非接觸式開關(guān)、帶有 UART 串口,高低電平或 NPN 驅(qū)動(dòng)輸出的激光測距傳感器。
該傳感器利用激光對(duì)物體漫反射原理:當(dāng)人或物體進(jìn)入傳感器設(shè)定的感應(yīng)區(qū)域,傳感器輸出信號(hào),同時(shí)能精確輸出
距離;人或物體離開感應(yīng)區(qū)后傳感器則關(guān)閉輸出。
硬件采用 uart。 棕色(VCC)、黃色(信號(hào)輸出)藍(lán)色(GND)、黑色(RXD)
供電 5~24V
在客戶 MCU 電源與 OUTPUT(黃線)之間跨接一個(gè) 1K 左右的上拉電阻。
串口默認(rèn)配置: 波特率:9600 、數(shù)據(jù)位:8 、校驗(yàn)位:無 、停止位:1
應(yīng)用范圍
(1)智能感應(yīng)潔具。
(2)家居安防。
(3)智能檢測,智能控制。
(4)機(jī)器人障礙識(shí)別。
(5)實(shí)時(shí)顯示距離。
(6)水龍頭感應(yīng)、大小便斗自動(dòng)沖水、自動(dòng)烘手機(jī)、防盜器、自動(dòng)門鈴、樓梯過道感應(yīng)、電視近距離收看電視
提醒器、自動(dòng)門、廣告燈箱、自動(dòng)垃圾箱。
四、項(xiàng)目代碼設(shè)計(jì)
#include <reg52.h>
#include <stdio.h>
// LCD1602引腳連接
sbit LCD_RS = P0^0; // RS引腳接口定義
sbit LCD_E = P1^0; // E引腳接口定義
sbit LCD_D4 = P2^4; // D4引腳接口定義
sbit LCD_D5 = P2^5; // D5引腳接口定義
sbit LCD_D6 = P2^6; // D6引腳接口定義
sbit LCD_D7 = P2^7; // D7引腳接口定義
// 激光測距模塊引腳連接
sbit laser_TX = P3^0; // TX引腳接口定義
sbit laser_RX = P3^1; // RX引腳接口定義
// LCD1602初始化
void LCD_Init() {
LCD_WriteCommand(0x02); // 回到Home位置
LCD_WriteCommand(0x28); // 設(shè)置4位數(shù)據(jù)總線、2行顯示、5x8點(diǎn)陣
LCD_WriteCommand(0x0C); // 顯示開,關(guān)游標(biāo)
LCD_WriteCommand(0x06); // 光標(biāo)右移
LCD_WriteCommand(0x01); // 清屏
}
// 向LCD寫入命令
void LCD_WriteCommand(unsigned char command) {
LCD_RS = 0; // 將RS置低,指定為寫入命令
LCD_E = 0; // 拉低E線,準(zhǔn)備寫入
LCD_D4 = command >> 4 & 0x01; // 寫入高4位數(shù)據(jù)
LCD_D5 = command >> 5 & 0x01;
LCD_D6 = command >> 6 & 0x01;
LCD_D7 = command >> 7 & 0x01;
LCD_E = 1; // 拉高E線,寫入命令
DelayMs(1); // 延時(shí)等待
LCD_E = 0; // 拉低E線,結(jié)束寫入
LCD_D4 = command >> 0 & 0x01; // 寫入低4位數(shù)據(jù)
LCD_D5 = command >> 1 & 0x01;
LCD_D6 = command >> 2 & 0x01;
LCD_D7 = command >> 3 & 0x01;
LCD_E = 1; // 拉高E線,寫入命令
DelayMs(1); // 延時(shí)等待
LCD_E = 0; // 拉低E線,結(jié)束寫入
}
// 向LCD寫入數(shù)據(jù)
void LCD_WriteData(unsigned char dat) {
LCD_RS = 1; // 將RS置高,指定為寫入數(shù)據(jù)
LCD_E = 0; // 拉低E線,準(zhǔn)備寫入
LCD_D4 = dat >> 4 & 0x01; // 寫入高4位數(shù)據(jù)
LCD_D5 = dat >> 5 & 0x01;
LCD_D6 = dat >> 6 & 0x01;
LCD_D7 = dat >> 7 & 0x01;
LCD_E = 1; // 拉高E線,寫入數(shù)據(jù)
DelayMs(1); // 延時(shí)等待
LCD_E = 0; // 拉低E線,結(jié)束寫入
LCD_D4 = dat >> 0 & 0x01; // 寫入低4位數(shù)據(jù)
LCD_D5 = dat >> 1 & 0x01;
LCD_D6 = dat >> 2 & 0x01;
LCD_D7 = dat >> 3 & 0x01;
LCD_E = 1; // 拉高E線,寫入數(shù)據(jù)
DelayMs(1); // 延時(shí)等待
LCD_E = 0; // 拉低E線,結(jié)束寫入
}
// 清空LCD顯示
void LCD_Clear() {
LCD_WriteCommand(0x01); // 清屏指令
DelayMs(2); // 延時(shí)等待
}
// 在指定位置顯示字符串
void LCD_DisplayString(unsigned char x, unsigned char y, unsigned char *str) {
unsigned char addr;
if (y == 0) {
addr = 0x80 + x; // 第一行地址計(jì)算
} else {
addr = 0xC0 + x; // 第二行地址計(jì)算
}
LCD_WriteCommand(addr); // 設(shè)置顯示位置
while (*str != '?') {
LCD_WriteData(*str); // 逐個(gè)顯示字符
str++;
}
}
// 毫秒級(jí)延時(shí)函數(shù)
void DelayMs(unsigned int ms) {
unsigned int i, j;
for (i = ms; i > 0; i--) {
for (j = 110; j > 0; j--);
}
}
// 串口初始化
void UART_Init() {
TMOD = 0x20; // 設(shè)置定時(shí)器1為模式2
TH1 = 0xFD; // 設(shè)置波特率為9600
TL1 = 0xFD;
TR1 = 1; // 啟動(dòng)定時(shí)器1開始工作
SCON = 0x50; // 設(shè)置UART為模式1,允許接收
}
// 串口數(shù)據(jù)接收
unsigned char UART_Receive() {
while (!RI); // 等待接收完成
RI = 0;
return SBUF; // 返回接收到的數(shù)據(jù)
}
五、總結(jié)
在本項(xiàng)目中,成功設(shè)計(jì)了一個(gè)激光測距儀,使用STC89C52作為主控芯片,搭配XKC-Kl200激光測距模塊。通過串口通信的方式,能夠獲取到被測物體與激光測距模塊之間的距離,并將其實(shí)時(shí)顯示在LCD1602液晶顯示屏上。
項(xiàng)目的實(shí)現(xiàn)過程中,先進(jìn)行硬件連接,將STC89C52與XKC-Kl200模塊通過串口相連,連接了LCD1602顯示屏。編寫程序代碼,LCD1602和串口通信的初始化函數(shù),以及數(shù)據(jù)的接收和顯示函數(shù)。
通過激光測距儀,可以方便地獲得不同物體與測距模塊之間的距離信息,并通過LCD1602顯示出來。這為測量工作提供了便利,無論是在科研實(shí)驗(yàn)、工程測量還是日常生活中,都具有廣泛的應(yīng)用前景。