红外测距
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计题目红外测距二级学院
专业
班级
学生姓名
学号
指导教师
摘要
现代科学技术的发展,进入了许多新领域,而在测距方面先后出现了激光测距、微波雷达测距、超声波测距及红外线测距。
为了实现物体近距离、高精度的无线测量而采用了红外发射接收模块作为距离传感器,单片机作为处理器,编写A/D转换和显示程序,完成了一套便推式的红外距离测量系统,系统可以高精度的实时显示所测的距离,本系统结构简单可靠、体积小、测量精度高、方便使用。
关键词:红外测距; A/D转换;实时显示;
目录
一、概述 (3)
1.意义: (3)
2.小组的工作分配: (3)
3.系统主要功能 (3)
二、硬件电路设计及描述 (3)
1.方案及设计思想: (3)
2.电路原理图 (5)
3.芯片资料: (6)
4.元件清单: (8)
三、软件设计流程及描述 (9)
1.模块层次结构图 (9)
2.程序流程图 (11)
3.源程序代码 (11)
1602显示模块程序: (11)
红外测距模块程序: (13)
四.测试 (17)
五.总结 (18)
1.小组总结............................................................................................. 错误!未定义书签。
2.个人总结.............................................................................................. 错误!未定义书签。
参考文献: . (18)
一、概述
1.意义:
距离,是个很微妙的东西,因此人们就会用具体的数值来表示。
于是就有了人工测量,而在现今社会,人们已经与高科技接轨,便有了激光测距、微波雷达测距、超声波测距及红外线测距。
我们所做的课题便是红外线测距,而做此课题不为其他,只为自己动手,做一个简易的,精确的,近距离的距离检测仪,这也是对我们所学知识的一种考验方法,更多的是更系统的认识单片机,了解AD转换和红外收发模块。
2.小组的工作分配:
3.系统主要功能
实时测量红外发收管与障碍之间的距离。
二、硬件电路设计及描述
1.方案及设计思想:
设计要求:红外测距
A、利用红外发射管发送信号,信号经过障碍物反射,红外接收管接收反射的信号。
B、用单片机将红外收发管与障碍物之间的距离实时显示出来
方案一、时间差测距法:此方案是将红外发射管发送的信号与接收管接收信
号的时间差写入单片机中,在单片机中用算法将距离计算出来。
原理图如图X-1所示。
方案二、反射能量法:此方案是用红外发射管发射信号,然后用红外接收管接收信号,将接收的信号强度经过AD转换,录入单片机中显示出来,并将对应的距离记录下来。
完成一段范围内的测量,将所记录下的数据写入单片机中,然后便可进行测量距离了。
原理图如图X-2所示。
图X-1 时间差测距法
图X-2反射能量法
方案比较:通过以上两种方案分析,我们可以看到方案一的误差很大,由于红外装置测
的距离比较近,而光速很快,因此反馈到单片机中的时间很短,单片机很难准确处理,而在一般情况下的光速不太准确,因此误差较大。
方案二是先将实验数据录入单片机中,因此在测量时存在的误差就会相对较小,综合考虑,选择方案二可行。
2.电路原理图
仿真电路图
结构图
AD转换模块
由于单片机不能直接处理红外接收管接收的电压信号,所以先通过AD转换,将信号转换为单片机能够处理的数字信号,以完成所需实验内容。
红外收发模块
红外发送管是用于发送信号,经过障碍物将信号反射,红外接收管接收到反射回来的信号,然后根据信号强弱将对应的电压值显示在显示模块上,并将此时的距离记录。
然后整改程序,用红外收发模块进行测距,就可在显示模块上显示出红外接收管接收的信号强度对应的距离值。
3.芯片资料:
TLC2543管脚图
TLC2543是TI公司的12位串行模数转换器,使用开关电容逐次逼近技术完成A/D 转换过程。
由于是串行输入结构,能够节省51系列单片机I/O资源;且价格适中,
分辨率较高,因此在仪器仪表中有较为广泛的应用。
2TLC2543的特点:
(1)12位分辩率A/D转换器;
(2)在工作温度范围内10μs转换时间;
(3)11个模拟输入通道;
(4)3路内置自测试方式;
(5)采样率为66kbps;
(6)线性误差±1LSBmax;
(7)有转换结束输出EOC;(8)具有单、双极性输出;
(9)可编程的MSB或LSB前导;(10)可编程输出数据长度。
TLC2543引脚说明:
AT89S52管脚图4.元件清单:
三、软件设计流程及描述
1.模块层次结构图
简述:先将AD 采集程序写入单片机中,进行实验,将固定距离所采集到的信号强度记录下来,然后将对应的数据加入程序中,最后通过红外模块进行测量,便可显示出对应的距离值,主程序是整个程序的基础,也是核心。
2.程序流程图
3.源程序代码
1602显示模块程序:
#include<lcd1602.h>
#include<reg52.h>
sbit lcdrs=P2^5;
sbit lcdrw=P2^6;
sbit lcden=P2^7;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void write_com(uchar com) {
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date) {
lcdrs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcdrw=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
红外测距模块程序:
#include<reg52.h>
#include<lcd1602.h>
#define uchar unsigned char
#define uint unsigned int
sbit clk=P1^4;
sbit cs=P1^5;
sbit din=P1^6;
sbit dout=P1^7;
sbit bit7=B^7; // 数据的最高位
uchar count,conword;//控制字的高四位决定通道口bit cy;
void write_sfm(uchar add,uint date)
{
uint bai,shi,ge;
ge=date%10;
shi=date%100/10;
bai=date%1000/100;
write_com(0x80+add);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
write_data('m');
write_data('m');
}
void write_sfm1(uchar add,uint date)
{
uint qian,bai,shi,ge;
ge=date%10;
shi=date%100/10;
bai=date%1000/100;
qian=date/1000;
write_com(0x80+0x40+add);
write_data(0x30+qian);
write_com(0x80+0x40+0x08);
write_data(0x2e);
write_data(0x30+bai);
write_data(0x30+shi);
write_data(0x30+ge);
}
uint readad(uchar conword)
{
char i;
uint advalue=0;
uchar value=0;
conword=conword<<4; // 控制字高四位与低四位互换变成了高四位就是选择的通道口
clk=0;
cs=1; //cs为高,clk din 被禁止dout成高阻态
cs=0; //cs为低clk din使能dout脱离高阻状态
B=conword; //控制字
for(i=8;i>0;i--)
{
cy=dout; //dout 的高位传给cy
din=bit7;//控制字高位先送入
clk=1; //控制字在时钟信号的上升沿送入
B=B<<1; //控制字的次高位移入高位
clk=0;
value=value<<1;
if(cy==1) value++;//value是dout的高八位
}
advalue=value;
advalue=advalue<<4; //高四位与低四位互换得出输出值
value=0x00;
for(i=4;i>0;i--) //dout 高四位的值赋给value
{
cy=dout;
value=value<<1;
if(cy==1)
{
value++;
}
clk=1;
clk=0;
}
advalue=advalue+value;
cs=1;
return advalue; // TLC 转换出的advalue=U(显示的电压值)*4096/5 ; }
main()
{
uint ad,l;
init();
while(1)
{
delay(100);
ad=readad(0x00);
ad=ad*0.00122*1000;// 将ad转换为与输入的电压值相等ad*5/4096 在扩大1000
if(ad>0&&ad<55)
l=0;
if(ad>=55&&ad<70)
l=40;
if(ad>=70&&ad<80)
l=35;
if(ad>=80&&ad<100)
l=30;
if(ad>=100&&ad<120)
l=27;
if(ad>=120&&ad<150)
l=25;
if(ad>=150&&ad<185)
l=22;
if(ad>=185&&ad<230)
l=20;
if(ad>=230&&ad<320)
l=17;
if(ad>=320&&ad<420)
l=15;
if(ad>=420&&ad<590)
l=12;
if(ad>=590&&ad<660)
l=10;
if(ad>=660)
l=0;
write_sfm(7,l);
write_sfm1(7,ad);
}
}
四.测试
测试方法:先写入电压采集程序,接入电源,将对应距离的电压值标定出来。
再将标定的值与对应距离写入程序中,接入电源,便可测量距离。
测试设备:直尺,直流稳压电源,挡板。
整理数据:
系统指标:由于此系统反应不太稳定,因此此作品只适合作为研究对象,不适合用于实际的测距。
备注:由于红外对管的性能不高,在测试一段时间过后,红外接收管的信号会衰减,因此可能会造成很大的误差。
这也是此次实验的最大失败之处。
五.总结
参考文献:
刘坤《51单片机典型应用开发范例大全》中国铁道出版社
彭伟《单片机C语言程序设计实训—基于8051+Proteus仿真》电子工业出版社。