光强仪的设计与制作项目报告.docx
《光强仪的设计与制作项目报告.docx》由会员分享,可在线阅读,更多相关《光强仪的设计与制作项目报告.docx(16页珍藏版)》请在冰豆网上搜索。
光强仪的设计与制作项目报告
光强仪的设计与制作
1项目简介
利用硅光电池为信号输入电路,以STC89C52单片机芯片设计控制电路,制作一个简易照度计,可以通过LCD1602显示屏显示照度值。
2设计原理
2.1基本理论
硅光电池是一种能将光能直接转换成电能的半导体器件,硅光电池是一个大面积的光电二极管,它被设计用于把入射到它表面的光能转化为电能,因此,可用作光电探测器和光电池,被广泛用于太空和野外便携式仪器等的能源。
光电池的基本结构如图2-2,当半导体PN结处于零偏或反偏时,在它们的结合面耗尽区存在一内电场,当有光照时,入射光子将把处于介带中的束缚电子激发到导带,激发出的电子空穴对在内电场作用下分别飘移到N型区和P型区,当在PN结两端加负载时就有一光生电流流过负载。
流过PN结两端的电流可由式1确定
式
(1)中Is为饱和电流,V为PN结两端电压,T为绝对温度,Ip为产生的光电流。
从式中可以看到,当光电池处于零偏时,V=0,流过PN结的电流I=Ip;当光电池处于反偏时(在本实验中取V=-5V),流过PN结的电流I=Ip-Is,因此,当光电池用作光电转换器时,光电池必须处于零偏或反偏状态。
光电池处于零偏或反偏状态时,产生的光电流Ip与输入光功率Pi有以下关系:
=R
(2)
利用AT89C51芯片实现控制电路,用ADC0809模数转换器实现模拟信号和数字信号的转换。
当光电池接入负载,将输出的信号通过三极管放大,通过模数转换器ADC0809转换为数字信号,通过单片机控制电路将信号输入LCD显示屏,在显示屏上显示当前的照度值。
2.2系统框图
系统框图如下:
图1照度计设计系统框图
2.3程序设计流程图
程序流程图如下:
图2程序设计流程图
3实现方案
3.1硬件电路图
图3照度计硬件原理图
3.2原理图说明
3.2.1光电前置放大电路
由于硅光采集得到电流信号线性关系更好,故利用op07运放的放大作用将带负载的光电池电路输出的电流通过电阻转换成的电压进行放大。
经过测量,电压放大的范围大概为0.5V到4.5V。
3.2.2AD转换电路
采用ADC0809模数转换芯片和AT89C51单片机,将光电池接收的光信号转换后放大的电压模拟信号转换为数字信号,然后通过单片机的控制电路将数字信号送到LCD显示屏。
3.2.2显示电路
此处显示电路采用了LCD1602液晶显示模块。
当光直射光电池时,放大的电压信号通过运放电路的输出送入AD转换器的IN0端口。
因为AD的ADDA、ADDB、ADDC都接地,所以ADC0809就采集IN0端口的信号。
模拟信号经过转换后向OUT-1~OUT8传送数字信号。
数字信号经过总线传送到AT89C51的P1口,并读入累加器A,经过AT89C51计算后通过P0端口输出,然后控制LCD显示屏的输出。
3.3硬件程序
#include"reg51.h"
#include"1602.h"
#include"adc0809.h"
#defineucharunsignedchar
#defineuintunsignedint
uintgetdata;
uintdatout;
voidzhuanhua(uintdatin);//数据转化
voidmain()
{
init_1602();
delay
(2);
for(num=0;num<16;num++)
{
lcd_write_command(0x80+num);
lcd_write_data(tab1[num]);
}
while
(1)
{
delay(5);
run_adc0809();//启动adc0809
delay(5);
while(!
eoc);//等待转换完毕的信号,eoc=1是转换完毕;
oe=1;//输出三态门打开,将转换的结果输出到数据总线上
getdata=P1;//获取AD转换后的数据
delay(0.1);
oe=0;
zhuanhua(getdata);//数据换算
display(datout);//数据显示
delay(100);
}
}
voidzhuanhua(uintdatin)
{
//(datin*0.01953*256/5+0.5)
if(datin<=50)
datout=(datin*0.01953*256/5+0.5)*15;
elseif(datin<=100)
datout=(datin*0.01953*256/5+0.5)*17;
elseif(datin<=190)
datout=(datin*0.01953*256/5+0.5)*13;
else
datout=(datin*0.01953*256/5+0.5)*930-176530;
}
//********************************************************************//
//1602.h
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
sbitoe=P3^1;
sbiteoc=P3^2;
sbitst=P3^0;
sbitale=P2^5;
sbitclk=P3^3;
sbitlcd_rs=P2^0;
sbitlcd_rw=P2^1;
sbitlcd_e=P2^2;
uchartab0[]={0,0,0};//暂存数据
ucharcodetab1[]={"Theillustionis"};
ucharcodetab2[]={"Lux"};
ucharcodetab3[]={"*10Lux"};
ucharcodetab4[]={"*100Lux"};
ucharnum=0;
ucharbai,shi,ge;
voiddelay(uintx)
{
uinta,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
voidinit_interrupt()//初始化定时计数器
{
TMOD=0x02;
TH0=0xfb;
TL0=0xfb;
EA=1;
ET0=1;
TR0=1;
}
voidtimer_T0()interrupt1//定时器0中断函数,产生100KHz时钟频率
{
clk=~clk;
}
voidlcd_write_command(ucharcommand)//写指令
{
lcd_rs=0;
lcd_rw=0;
P0=command;
lcd_e=1;
delay(10);
lcd_e=0;
delay(10);
}
voidlcd_write_data(uchardat)//写数据
{
lcd_rs=1;
lcd_rw=0;
P0=dat;
lcd_e=1;
delay(10);
lcd_e=0;
delay(10);
}
voidinit_1602()//初始化1602
{
lcd_write_command(0x38);
lcd_write_command(0x0e);
lcd_write_command(0x06);
lcd_write_command(0x01);
}
voiddisplay(uintgetdata)
{
if(getdata<10000&&getdata>=1000)
{
getdata=getdata/10;
bai=getdata/100;
shi=getdata%100/10;
ge=getdata%10;
tab0[0]=0x30+bai;
tab0[1]=0x30+shi;
tab0[2]=0x30+ge;
for(num=0;num<3;num++)
{
lcd_write_command(0x80+0x42+num);
lcd_write_data(tab0[num]);
}
for(num=0;num<8;num++)
{
lcd_write_command(0x80+0x47+num);
lcd_write_data(tab3[num]);
}
}
elseif(getdata>10000)
{
getdata=getdata/100;
bai=getdata/100;
shi=getdata%100/10;
ge=getdata%10;
tab0[0]=0x30+bai;
tab0[1]=0x30+shi;
tab0[2]=0x30+ge;
for(num=0;num<3;num++)
{
lcd_write_command(0x80+0x42+num);
lcd_write_data(tab0[num]);
}
for(num=0;num<8;num++)
{
lcd_write_command(0x80+0x47+num);
lcd_write_data(tab4[num]);
}
}
else
{
bai=getdata/100;
shi=getdata%100/10;
ge=getdata%10;
tab0[0]=0x30+bai;
tab0[1]=0x30+shi;
tab0[2]=0x30+ge;
for(num=0;num<3;num++)
{
lcd_write_command(0x80+0x42+num);
lcd_write_data(tab0[num]);
}
for(num=0;num<8;num++)
{
lcd_write_command(0x80+0x47+num);
lcd_write_data(tab2[num]);
}
}
}
//********************************************************************//
//adc0809.h
#include"reg51.h"
#defineucharunsignedchar
#defineuintunsignedint
voidrun_adc0809()
{
init_interrupt();
delay
(2);
st=0;
ale=1;
oe=0;
st=0;//此三条为启动程序
st=1;
delay
(2);
st=0;
delay(0.1);
}
4结论
在Proteus软件中仿真成功,并按电路原理图焊接好电路,将程序烧录到STC89C52芯片中进行调试,LCD显示屏最终可以显示照度值,实验成功。
图1:
焊接好的电路
图2:
日光灯下的光强显示与标准光强仪的对比
图3:
*10档显示
图4:
*100档显示
图5:
遮光显示
5心得体会
本次STITP项目是对以前学过的相关知识的一次综合的运用,是把课本知识转化为生活实际的一次实践性的实验,很大程度上锻炼了我们的思考问题解决问题的能力,实验的内容简单却不乏创新,并且贴近生活实际,使我们可以用自己所学的知识解决实际问题。
为我们即将学习的专业课程奠定了良好的基础。
项目初期,我们对知识系统而全面进行了学习,遇到难处先是自己查找资料解决无法解决时再寻求老师的帮助,终于熟练掌握了基本理论知识,并且学会了如何思考问题,找到了设计的灵感。
总的来说本次STITP项目相对比较顺利,基本完成项目之初的目标。
通过本次设计使我们对于将要学习的专业知识有了更好的理解,激发了我们对于电路设计的兴趣。
另外还发现自身的不足。
首先,是对很多学过的知识还不够熟练不能用到实际问题中。
其次,还存在设计条理不清晰,思考问题不全面问题等。
设计虽然比较成功,但是实验还有很多需要改进和扩展的地方,我们要求设计的是比较简单的电路,在实际生活中的设计与应用要远比这次的STITP项目设计复杂,在以后的项目中还要继续学习其他知识,以解决真正的实际问题,真正达到学以致用。
6参考文献
[1]郭天祥.51单片机C语言教程——入门、提高、开发、拓展全攻略[M].北京:
电子工业出版社,2009
[2]杜洋.爱上单片机[M].北京:
人民邮电出版社,2010
[3]谭浩强.C程序设计[M].北京:
清华大学出版社,1991