红外测距单片机课程设计说明书Word格式.docx
《红外测距单片机课程设计说明书Word格式.docx》由会员分享,可在线阅读,更多相关《红外测距单片机课程设计说明书Word格式.docx(24页珍藏版)》请在冰豆网上搜索。
1)超声波测距器的系统设计,STC12C5A60S2单片机作为主控模块;
2)用动态扫描法实现LED数字显示,超声波驱动信号用单片机的定时器完成;
3)单片机使用P1.0端口输出超声波转化器所需的40KHz方波信号ISD1820语音播放距离,并用LED数字显示显示其距离值。
方案三
1)激光测距系统设计,STC12C5A60S2单片机作为主控模块;
2)过单片机控制CPLD计时部分开始计时与停止计时,并通过软件计算控制LED显示所测得的被测物的实际距离;
3)CPLD计时部分采,40MHZ的脉冲信号,单个周期为2.5ns,通过P0口调取到单片机的方便,并用LED数字显示显示其距离值。
5.设计方案选择
我们小组考虑到
红外测距的优点是便宜,易制,安全。
激光测距存在诸多缺点,例如需要注意人体安全,且制做的难度较大,成本较高,而且光学系统需要保持干净,否则将影响测量。
超声波测距缺点是精度较低,且成本较高。
三者经过相互比较,从经济和我们所学的知识考虑。
红外测距对我们初学者的锻炼是大于其他两者的。
并且红外测距的电路相对于其他两者比较容易焊接,容易检查和修改。
第2章硬件系统
2.1.硬件系统的基本结构和原理图
该系统主要由AT89C52芯片,红外测距传感器,ISD语音模块、LCD显示、电源模块及键盘接口电路等组成。
其主要组成构图如下:
图2.1电路结构图
图2.2电路原理图
2.2红外收发模块
红外发送管是用于发送信号,经过障碍物将信号反射,红外接收管接收到反射回来的信号,然后根据信号强弱将对应的电压值显示在显示模块上,并将此时的距离记录下来。
然后整改程序,用红外收发模块进行测距,就可在显示模块上显示出红外接收管接收的信号强度对应的距离值。
GP2Y0A02YK0F红外测距传感器20-150cm
图2.3红外传感器结构图图2.4protel中红外传感器
如图2.4所示GP2Y0A02YK0F有3个端口,其中VCC接信号输入,VO接P1口,GND接地线。
GP2Y0A02YK0F测量范围在20cm-150cm之间,测量误差小于0.5cm,是一个距离测量传感器单元,PSD的集成组合构成(位置敏感探测器),IRED(红外发光二极管)和信号原理电路。
2.3语音报警模块
2.3.1ISD1820可以播报实时距离
图2.5ISD1802电路图
2.3.2蜂鸣器及LED警示灯警报
蜂鸣器,发声元件。
当距离达阈值的时候,蜂鸣器响同时用LED警示灯进行闪烁报警提示。
2.6蜂鸣器报警
2.4LCD显示模块
图2.7LCD显示模块
LCD与单片机的接口电路如图2.7所示,单片机P0分别接D1-D7,同时接上排阻,而在排阻另一端接上vcc。
单片机上的P3.4接E,P3.5接RS,单片机通过P0口向LCD输送数据,显示测得的距离。
值得注意的是,P0口要接上拉电阻来保证对LCD的成功驱动。
2.5AT89C52单片机概述
本次课程设计采用的是增强型8051单片机,型号STC12C5A60S2。
STC12C5A60S2/AD/PWM系列单片机指令代码完全
兼容传统8051,但速度快8-12倍。
内部集成MAX810专用复位电路,2路PWM,8路高速10位A/D转换(250K/S,即25万次/秒),针对电机控制,强干扰场合。
图2.8STC12C5A60S2单片机
单片机的时钟信号用来提供单片机片内各种微操作的时间基准,时钟信号通常用两种电路形式得到:
内部振荡和外部振荡。
本次设计选择在单片机外接晶体振荡器构成内部振荡方式,片内高增益反向放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器并产生振荡时钟脉冲。
外接晶体以及电容C2和C1构成并联谐振电路,它们起稳定振荡频率、快速起振的作用,其值均为30P左右,晶振频率选11.0592MHz。
图2.9ST89C52单片机最小系统
2.6按键模块
此模块采用4个独立按键来改变报警阈值。
按键1(加10CM)接P1^4,按键2(减10CM)接P1^5,按键3(RESET),接P1^6,按键4(RESET),接P1^7。
图2.10按键模块
第3章软件设计
3.1程序流程图
在整个系统运行过程中。
当红外系统被启动后,首先,对AT89C52单片机进行初始化。
然后,当AT89C52单片机接收到红外接收电路传输的电压信号后,经A/D转换程序,将片外的模拟信号转换为单片机可识别的数字信号,并经电压—距离转换子程序,将变化的电压转换为距离。
最后,在动态扫描LCD显示器上显示出来。
主程序流程图如图3.1所示。
图3.1程序流程图
红外测距系统软件设计主要由主程序,延时函数,显示程序函数组成。
程序开始,红外测距主程序第一步将显示屏1602初始化,并显示测量开始,第二步导入延时程序,并显示程序,显示电压和距离。
其次子函数调用,读A/D并转换函数得出电压值,再调用距离计算函数,得出距离值。
此时主函数中显示函数会将电压和距离显示出来,程序就此结束。
此程序中多次使用调用子函数,读A/D,距离计算函数,算术平均滤波程序构成AD值的采集和计算;
LCD忙标志判断函数,写数据子函数,写命令子函数,显示数据调整函数,字符串显示函数,显示子函数构成显示函数;
1602初始化函数,LCD清屏函数则构成清屏函数。
不过完成程序并不是一次就能成功的,首先要先将AD采集程序写入单片机中,进行实验,将固定距离所采集到的信号强度记录下来,然后将对应的数据加入程序中,最后通过红外模块进行测量,便可显示出对应的距离值,主程序是整个程序的基础,也是核心。
此时距离计算函数才算完成,距离计算函数实际就是测量时得出距离电压关系,我们反过来先拿出距离再得出电压,举例来说,用卷尺量50CM距离,再用红外测距系统来量50CM距离,这时对应50CM距离的电压记下来。
根据这个方法把其它各个距离的电压记下来,把这个对应关系变成计算距离的函数,再测距时就可以根据这个函数来得出距离了。
图3.2单片机实物图
第4章系统软硬件调试
4.1硬件调试
红外测距仪的制作为了使信号稳定,最好给输入电源加上一个滤波电路,否则显示屏上有闪烁,不稳定,会增加误差,但总体来说不影响结果。
在本次设计中,主控模块是非常重要的部分,它不仅是本次设计的核心,在本次硬件调试中也遇到了问题,接上电源的时候,显示屏不亮,没有任何显示,于是我做了如下的工作:
(1)检查电源是否通电,发现指示灯亮着;
(2)编程使P1为低电平,检查到P1输出为低;
(3)检查P0口未接上拉电阻,接上显示屏发亮了。
在本次硬件调试中还遇到了显示屏出显示,但显示有很大问题,调节距离后,显示还是不变,检查后发现LCD与vcc没接好,或RS,RW,E与单片机接触不良。
4.2软件调试
硬件电路制作完成并调试好后,便可将程序编译好下载到单片机试运行。
根据所设计的电路参数和程序,测距仪能测的范围为20cm~150cm,测距仪最大误差不超过0.5cm。
系统调试完后对各个距离进行多次测量,与预定值进行比较,对测量误差进行多次实验分析,不断调节器件和修改程序使其达到实际使用的测量要求。
为了更方便了解电压与距离之间的关系,我将程序做了些许修改,在显示距离的基础上再把电压也显示出来了,这样结果一目了然。
因为电压与距离之间的关系不是线性关系,所用用函数来表示会有误差,于是我将此函数修改,重新测量,每个距离对应的电压记录下来输入程序,如此一来,测试更加准确,误差更小了。
4.3测试结果绘图
图4.1是红外距离传感器GP2Y0A02YK0F电压距离关系图,图中所测电压对应的不同距离值,图中横坐标代表距离,纵坐标是距离电压值,单位是cm。
从图中可以看出,电压与距离并不是线性关系,而是一条相对平滑的曲线。
因此结果不一定十分准确,接近此图即可。
最终的红外测距系统可以实现20-150cm的近距离测量,测量误差为0.5cm,可以计算出被测物体的距离。
在测量距离精度方面,还有待于改进。
电压v
2.89
1.94
1.47
1.18
0.98
测距cm
19
30
41
51
62
实距cm
20
40
50
60
表4.1电压距离关系
4.5调试中遇到的问题
在焊接过程中一些地方出现虚焊等接触不良的问题,导致显示不稳定有闪烁。
接线过程中用插针接线容易导致接线松动,没接到或者接触不良。
环境问题:
红外线在空气介质的传播过程中会有很大的衰减,其衰减遵循指数规律。
一般情况下能测150cm,但是空气介质发生改变,如尘埃过多,导致红外线强度降低,测量发生误差,且测量距离变小。
周围有其他辐射源,并且强度很大时会影响测量结果。
结论
对所设计的电路进行测量、校准发现其测量范围在20cm—150cm内的平面物体做了多次测量发现,其最大误差为0.5cm,且重复性好。
该测距仪稳定性比较高、灵敏度比较高,测量时在红外线测距仪周围没有其它物体。
但是在检测过程中会有一些不便的地方:
1.测量时在红外线测距仪和目标物体之间周没有其它可阻挡的物体,由于是根据反射能量法,且发射功率有限,反射回来的红外线能量容易过低而无法采集,测距仪无法测量150cm外的物体。
2.必须在干净清新的空气环境下测量,空气中一旦尘埃过多,会对反射红外线强度有极大的干扰,最终影响计算距离的值。
3.不能够实现不同温度下的测距功能。
4.因为超声波是将空气作为媒介所以受电磁干扰比较大。
红外线测距仪的原理有两种:
一种是红外线传播的时间来计算出传播距离;
一种是根据发射光的强弱可以判断所测的距离,由于接收管接收的光强是随与发光管的距离变化而变化的,因而,距离近则接收光强,距离远则接收光弱。
由上述的分析知,如果能够干净清新的空气环境,稳定的温度下,无其它电磁干扰,阻挡的物体,能够获得较高的测量精度。
参考文献
[1]张明峰,《PIC单片机入门与实战》,北京航空航天大学出版社
[2]窦振中,《PIC单片机应用设计与实例》,北京航空航天大学出版社
[3]谢自美,电子线路综合设计,华中科技大学出版社,2006-6
[4]康华光,《电子技术基础:
模拟部分(第五版)》,高等教育出版社,2006
[5]潘永雄,沙河.电子线路CAD实用教程[M].西安:
西安电子科技大学出版社:
2007.
[6]51单片机C程序设计100例.
[7]康华光主编.电子技术基础[M].第四版.北京:
高等教育出版社,1999
[8]《单片机原理与应用》实验.武汉大学珞珈学院
[9]《一种红外线测距技术的探讨》
[10]《红外测距传感器的原理与设计最终版》
[11]刘坤,《51单片机典型应用开发范例大全》中国铁道出版社
[12]彭伟,《单片机C语言程序设计实训—基于8051+Proteus仿真》电子工业出版社
[13]薛小玲、刘志群、贾俊荣编著《单片机接口模块应用于开发实例详解》北京航空航天大学出版社2010
[14]谭浩强,著《C程序设计》(第三版)清华大学出版社2005
[15]何桥、段清明、邱春玲编著《单片机原理及应用》中国铁道出版社2004
[16]曲波肖圣兵吕建平编著《工业常用传感器选型指南》清华大学出版社2002
[17]陈鸿茂编著《常用电子器件简明手册》中南矿业大学出版社2001
附录
附录一程序
#include<
REGX52.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineADC_POWER0x80
#defineADC_FLAG0x10
#defineADC_START0x08
#defineADC_SPEEDLL0x00
#defineADC_SPEEDL0x20
#defineADC_SPEEDH0x40
#defineADC_SPEEDHH0x60
ucharcodetable[]="
0123456789"
;
ucharcodetable1[]="
L1="
ucharcodetable3[]="
L2="
ucharcodetable2[]="
SET:
"
sbitdeng=P3^3;
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbityin=P2^4;
sbitdula=P2^7;
sbitkey1=P2^0;
sbitkey2=P2^1;
sbitkey3=P2^2;
sbitkey4=P2^3;
sfrADC_CONTR=0xBC;
sfrADC_RES=0xBD;
sfrADC_LOW2=0xBE;
sfrPLASF=0x9D;
intdistance_danger=30;
inta;
intc;
inte;
intbai,shi,ge;
intAD_result=0;
intAD_result2=0;
intcount=0;
intbeep_count=0;
intdistance=0,distance2=0;
voiddelay(uintz)
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=110;
y>
y--);
}
voidwrite_com(ucharcom)
lcdrs=0;
P0=com;
delay(5);
lcden=1;
lcden=0;
voidwrite_data(uchardate)
lcdrs=1;
P0=date;
voidinit()
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
voidxianshi(intnumber,intadress)
{
write_com(0x80+adress);
//84
if(number>
999||number<
=0)
{
bai=0;
shi=0;
ge=0;
write_data(table[bai]);
delay(5);
write_data(table[shi]);
write_data(table[ge]);
}
elseif(number>
99)
{
bai=number/100;
shi=number%100/10;
ge=number%100%10;
9)
shi=number/10;
ge=number%10;
else
ge=number;
}//write_com(0x80+0x42);
voidkeyone()
if(key1==0&
&
key2==1&
key3==1&
a==0)
distance_danger++;
a=1;
elseif(key1==1)
a=0;
voidkeytwo()
if(key2==0&
key1==1&
c==0)
distance_danger--;
c=1;
elseif(key2==1)
c=0;
voidkeythree()
if(key3==0&
e==0)
distance_danger=30;
e=1;
elseif(key3==1)
e=0;
voidInitADC()
PLASF=0xff;
ADC_RES=0;
//ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
delay
(2);
intAD_caculate(charch)
intresult=0;
ADC_CONTR&
=!
ADC_FLAG;
result=ADC_RES;
//ch=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
returnresult;
intpinjun(charch)
inti;
floatsum1=0;
inthe[30];
for(i=0;
i<
20;
i++)
he[i]=AD_caculate(ch);
sum1+=he[i];
sum1=sum1/20;
returnAD_caculate(ch);
voidbeep_time(intx)
beep_count++;
if(beep_count>
x)
beep_count=0;
dula=~dula;
yin=~yin;
intAD_cal(intAD)
floaty;
if(AD>
=98&
AD<
140)
y=-0.0045*AD*AD+0.715*AD+3.1;
else//if(AD>
=71&
=98)
y=0.0344*AD*AD-6.554*AD+341.9;
}
if(y>
60)
y=60;
returny;
}/**/
voidbeep_warning(intxg,intyg)
if(yg<
=distance_danger)
beep_time(yg*3);
deng=1;
elseif(xg<
beep_time(xg*3);
//yin=~yin;
else
dula=0;
yin=1;
deng=0;
}
voidmain()
intaa=0;
init();
InitADC();
//IE=0xa0;
write_com(0x80+0x40);
//显示"
for(aa=0;
aa<
3;
aa++)
write_data(table1[aa]);
write_com(0x80+0x48);
write_data(table3[aa]);
write_com(0x80);
//显示"
SET="
4;
write_data(table2[aa]);
a=0;
c=0;
e=0;
yin=1;
deng=0;
while
(1)
count++;
keyone();
keytwo();
keythree();
AD_result=pinjun(0);
AD_result2=pinjun
(1);
distance=AD_cal(AD_result);
//
distance2=AD_cal(AD_result2);
beep_warning(distance,distance2);
if(count>
150)
{
delay(5);
xianshi(distance_danger,0x04);
xianshi(distance,0x43);
xianshi(distance2,0x4b);
count=0;
}
附录二使用元器件一览表
序号
名称
型号
规格
数量
备注
1
单片机芯片
STC型
STC1