摘要
本文介绍了以 STC12C5A60S2单片机为核心、以 TOF10120激光测距传感器模块为距离传感器的一种低成本、高精度、微型化的激光测距仪。该测距仪采用了相位法激光测距,将测得的结果经计算转换反馈到 LCD1602屏上,从而实现测距功能。激光测距仪,是利用激光对目标的距离进行准确测定的仪器。激光测距仪在工作时向目标射出一束很细的激光,由光电元件接收目标反射的激光束,计时器测定激光束从发射到接收的时间,计算出从观测者到目标的距离。本文的激光测距仪是一维的激光测距仪,用于距离测量、定位。
模块介绍
激光测距模块原理 :
由激光发射器发射一束激光。经过分光镜后一束射向前方反光镜后,有信号接收器A接受,另-束直接由信号接收器B接收,两个信号接收器与激光发射器处于同一平面上。通过示波器观察出两束光波的相位变化,得到两束光接收到的时间差,通过计算算得激光发射器与反光镜的距离。
STC12C5A60S2单片机 :
STC12C5A60S2系列单片机是单个时钟/机器周期(1T)的单片机,是指令代码完全兼容传统的8051单片机,是新一代高速/低功耗/超强抗干扰的8051单片机,速度却快8051 8-12倍。在内部集成了MAX810复位电路、2路PWM、8路高速、10位A/D转换(250K/S),,对于电机的控制有着出色的表现,适合于强干扰场合。
LCD1602液晶显示基本原理 :
点阵图形式液晶由 M&N 个显示单元组成,假设 LCD 显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成。显示屏上64x16个显示单元与显示 RAM 区的1024字节相对应,每一字节的内容与显示屏上相应位置的亮暗对应。例如显示屏第一行的亮暗由 RAM 区的000H-00FH 的16字节的内容决定,当(000H) =FFH 时,屏幕左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH 时,屏幕右下角显示一条短亮线;当(000H) =FFH,(001H) =00H,(002H)=00H,(00EH)=00H,(00FH)=00H 时,在屏幕的顶部显示一条由8条亮线和8条暗线组成的虚线。这就是 LCD 显示的基本原理。
系统设计
系统总体设计
本系统由激光测距模块 TOF10120,最小系统核心板 STC12C5A60S2单片机,显示模块 LCD1602构成。由 TOF10120采集数据,通过 I2C 将数据传输到 STC12C5A60S2,STC12C5A60S2将数据进行处理,通过 LCD1602显示出实时距离。
硬件设计
激光测距模块选用 TOF10120,TOF10120是一款比较常用的近距离测距传感器,精度相对较高,价格也相对亲民。它的通信有两种方式,分别是 I2C 和 UART。由于 I2C 接口能够用软件模拟来扩充接口,灵活性高等原因,所以本次设计选用 I2C 来进行数据通信。显示模块依然选用经典的 LCD1602,处理系统则选用51单片机 STC12C5A60S2来实现。电路原理图如图所示:
软件设计
LCD1602模块:此次显示的模式为静态显示。首先定义好 LCD 的忙检测函数,显示字符前需检测 LCD 的状态。再定义写字符函数,用来向 LCD 写入指令或数据,注意写字符函数里的语句适当加上延时函数,等待语句的处理。然后定义 LCD 的光标移动函数和显示字符串函数,通过光标移动函数可以设置字符显示在 LCD 的具体位置,通过显示字符串函数可以输出想要的字符串。最后向 LCD 写入指令来对 LCD 进行初始化。
TOF10120模块:通过I2C来与单片机进行数据通信。所以需要编写的程序主体为I2C的处理程序。首先需要编写I2C总线初始化函数释放I2C总线的数据线和时钟线,再编写I2C总线的起始信号、停止信号、接收应答信号函数以备用。根据I2C写入和读取的正确时序来编写向I2C总线写入字节数据和从I2C总线读取字节数据的函数。因为TOF模块在单片机访问中有具体的数据地址,所以最后编写向任意地址写入一个字节数据和从任意地址读取一个字节数据的函数来与TOF进行数据通讯。
主程序模块: 首先对 LCD、I2C 和串口进行初始化。再在 LCD 上显示提示字符和单位。向串口写指令来对 TOF 进行设置,选择数据发送模式为模块发送。当接受标志位为1时向串口接收两个字节的数据,通过适当换算得到字符数组通过 LCD 显示出来。
系统实现
Keil 编写程序
在 Keil 里选择 AT89C51芯片,引入其库函数。编写好程序,查错 debug,检查语法错误,最后编译程序。生成 HEX 文件。
Proteus 仿真
由于 Proteus 无激光测距模块,所以用 SFR04代替。
实物连接和 STC-ISP 下载调试
照 Proteus 仿真图将实际器材连接完毕,用两根 USB 线连接51核心板和电脑,通过 STC-ISP 将程序烧录至 STC12C5A60S2单片机。将 TOF10120带盖玻片面对着不同距离的阻碍物体,观察 LCD1602所示数据。
系统调试
通过编译程序检测程序是否有语法错误。通过 Keil 的 debug 功能查看每一步的运行结果,检查程序的非语法错误。通过在 Proteus 的仿真查看仿真结果。通过 STC-ISP 烧录程序根据实物上的显示效果来进行最终调试。
遇到的问题一:烧录不进代码,STC-ISP一直处于连接中,原因是烧录过程中单片机的P3口不能接任何器件,由于设置的I2C串口在P3上,所以一直没烧上,通过网络搜寻解决。
遇到的问题二:LCD只亮不显示字符,原因是LCD没接地和供电。因为Proteus的LCD没接地和供电能显示字符,加上对LCD的工作原理不大清楚导致。
遇到的问题三:LCD只能显示一次数据,不能随TOF测距大小变化而变化,原因是没有正确写好接受数据标志位的状态。
遇到的问题四:LCD显示乱码,数值能随TOF所测距离增大而增大,但却不能显示正确数值,原因是处理TOF所传入的两字节数据方法有错。最后恶补了C语言处理数据的方法解决。
以上问题都是因为不熟悉 LCD 显示原理,TOF 传输数据形式,数据字符转换,Keil 的 debug 功能等知识所导致的,经过这次课程设计很好的学习到这些知识,也对单片机应用系统的设计方法有了一个清晰的认识,能自主解决所遇到的问题。