数字式光照强度检测仪的设计实现ppt.docx
《数字式光照强度检测仪的设计实现ppt.docx》由会员分享,可在线阅读,更多相关《数字式光照强度检测仪的设计实现ppt.docx(23页珍藏版)》请在冰豆网上搜索。
数字式光照强度检测仪的设计实现ppt
电子电路实验3
综合设计总结报告
题目:
数字式光照强度检测仪的设计实现
班级:
20080421
学号:
2008042117
姓名:
许相凯
日期:
2011.5.13
摘要
光照强度检测仪可以应用在需要某一特定光强范围的领域。
它的主体是光敏电阻,光敏电阻采用半导体材料制作,半导体吸收光子而产生的光电效应,使得光敏电阻阻值变小;光敏电阻的电极一般采用梳状,提高了光敏电阻的灵敏度;另外光敏电阻光谱特性好,光谱响应从紫外区一直到红外区,而且体积小、重量轻、性能稳定。
本实验采用的方案是:
用单片机控制模数转换芯片通过模拟开关采集三个方向光敏电阻与固定电阻的分压值,在单片机内部通过逻辑判断保留接收最强光强(即光照射方向)的采集结果,通过转换函数转换成对应的光照强度,并用数码管显示,同时通过已判断光照射方向,显示相应的小数点。
设计选题及设计任务要求
设计选题:
数字式光照强度检测仪的设计实现
任务要求:
1、设置三个方向的光照强度检测,通过模数转换等用两位数码管显示最强光照强度(即光照射方向的光照强度),要求在黑暗中显示00,在室内强光下显示99;
2、用小数点显示光照方向:
光从左侧入射亮高位小数点,光从右侧入射亮低位小数点,光从前方入射不亮小数点。
正文
1方案的设计与论证
方案一
逻辑判断后
选光照方向一侧信号采集
目的侧
模拟信号
方案二
控制模拟开关依次选择三侧
方案一是利用电压比较器LM358对任意两路电压进行比较,把比较结果送到单片机进行逻辑判断选择光照方向一侧的光敏电阻进行模数转换,把转换后数据送到单片机,经单片机程序转换成光照强度让数码管显示,并显示光照方向侧的小数点。
方案二是利用模拟开关在单片机的控制下依次选择三侧模拟信号,通过模数转换器采集数据分别存入三个变量,利用程序判断光照方向,将光照方向数字信号转换成光照强度通过数码管显示,并显示光照方向侧的小数点。
方案一采用先判断后采集的方式,每次只需采集一侧模拟信号,节省采集时间,适合采集频率较高的系统。
但该方案与方案二相比较电路复杂,并且判断后再采集可能有滞后影响高精度。
方案二具有电路结构简单、无采集滞后等优点,缺点是采集三侧模拟信号浪费时间,但本选题所用的光敏电阻光照特性非线性,本身不是精确测量,故采集频率高并不一定更精确。
鉴于方案二的上述优点故本选题实现方案选择方案二。
2理论计算
(1)单片机主模块
下图即为单片机最小系统,采用STC89C51单片机,外接复位电路,时钟电路,其中P2^0端口的LED是为了检验单片机实际电路是否正常连接。
(2)通信模块
用于下载程序到SYC89C51单片机。
(3)光敏输出模块
下图依次为左侧、前侧、右侧光敏电阻输出模块。
测得光敏电阻在室内光照射下电阻约为1.7k欧姆,黑暗中约为150k欧姆,选取的分压电阻不能太大,否则灵敏度太小,经试选5.1k欧姆合适;电位器的电阻在下载程序后测试调整,使得当同样的光照强度从另外两个方向入射时数码管显示的数不变。
5.1K
电位器
电位器
X1
X2
X0
(4)输出选择模块。
经10k电阻接ADC0804Vin+
P0^5
P0^4
P0^3
根据单片机发来的指令使CBA依次为000、001、002来选择X0、X1、X2三路中一路模拟开关,使模拟电压经X传送到ADC0804经行模数转换。
CD4051管脚图、管脚说明及真值表:
(5)ADC0804模块
用单片机控制CS、RD、WR完成ADC0804的驱动,将X传来的模拟信号转换成数字信号,再将数字信号传送到单片机。
P0^0
P0^1
P0^2
X
ADC0804的规格及引脚图:
时序图如下:
(6)数码管显示电路。
数码管为共阳极连接,P3^2、P3^3分别控制十位、个位的位选,P0^6、P0^7分别控制十位、个位小数点。
P0^6
P0^7
P3^3
P3^2
3测试方法与数据
(1)测试方法:
A、测试项目:
在无光情况下观察数码管是否显示为00;在室内用三个方向的光敏电阻依次对着光入射的方向观测数码管显示值是否相等,以及是否是光从左侧入射时显示高位小数点、光从前侧入射时不显示小数点、光从右侧入射时显示低位小数点。
B、如何测试:
用keil软件编程,程序说明如下:
【1】AD0804驱动子程序,根据ADC0804时序图编写;
unsignedcharadc0804(void)//读AD0804子程序
{unsignedcharaddata,i;
rd=1;wr=1;//int1=1;//读ADC0804前准备
P1=0xff;//P1全部置一准备
cs=0;wr=0;wr=1;//启动ADC0804开始测电压
rd=0;//开始读转换后数据
i=i;i=i;//无意义语句,用于延时
//等待ADC0804读数完毕
addata=P1;//读出的数据赋与addate
rd=1;cs=1;//读数完毕
return(addata);//返回最后读出的数据
}
【2】显示子程序,依次显示十位、个位;
voiddisplay(inttemp)//显示程序
{
ge=1;
delay
(2);
P2=table[temp/10];//显示十位
shi=0;
delay
(2);
shi=1;
shi=1;
P2=table[temp%10];//显示个位
ge=0;
delay
(2);
ge=1;
}
【3】转换子程序,将采集转换后的数字信号通过函数转换成显示数;
uintzhuan(uchartemp)
{
intx=255-temp;
inty;
if(x<=40)//当采集后数字数据小于
//40时认为无光
y=0;
if(x>=250)//当采集后数字数据大于
//250时认为最大光强显示99
y=99;
if(x>40&x<250)//根据上述两部分列出中间
//线性部分
y=(x-40)*10/21;
return(y);
}
【4】数据采集存储程序,分别采集三路数据,存入三个变量;
ucharDATA0,DATA1,DATA2;
a=0;
b=0;
c=0;
DATA0=adc0804();
delay
(2);
a=1;
b=0;
c=0;
DATA1=adc0804();
delay
(2);
a=0;
b=1;
c=0;
DATA2=adc0804();
delay
(2);
【5】判断光入射方向显示程序,显示光强及光照方向;
if(DATA0<=DATA1&DATA0<=DATA2)//判断哪路光最强
{
display(zhuan(DATA0));//左路
dp1=0;
dp2=1;
}
else
{
if(DATA1<=DATA0&DATA1<=DATA2)
{
display(zhuan(DATA1));//中路
dp1=1;
dp2=1;
}
else
{
display(zhuan(DATA2));//右路
dp1=1;
dp2=0;
}
}
用STC_ISP软件把程序下载到单片机。
遮住光读取数码管示数;用三个方向的光敏电阻依次对着光入射的方向观测数码管显示值,以及小数点亮灭情况。
(2)测试仪器:
无
(3)测试数据:
a、无光下数码管显示00;
b、室内左侧冲光照方向时显示90,左小数点亮;前侧冲光照方向时显示90,小数点不亮;右侧冲光照方向时显示90,右小数点亮。
4结果分析
数据处理:
无光下显示00;室内光照射方向显示均为90,小数点显示也符合要求。
结论:
实验成功。
5附录
总电路图:
见附页图
元件表:
见附页表
参考文献:
1、《实用电子系统设计基础》姜威,北京理工大学出版社。
2、《电子线路设计实验测试》罗杰、谢自美,电子工业出版社。
3、《单片机实验与应用系统设计》范蟠果,国防工业出版社。
附页1、程序代码:
#include//单片机51头文件,存放着单片机的寄存器
#include//为了使用空指令加载的头文件
sbitshi=P3^2;//数码管十位
sbitge=P3^3;//数码管个位
sbitdp1=P0^6;//十位小数点
sbitdp2=P0^7;//个位小数点
sbitcs=P0^0;
sbitrd=P0^1;
sbitwr=P0^2;//ad控制管脚定义
sbitc=P0^3;
sbitb=P0^4;
sbita=P0^5;//cd4051控制管脚定义
#defineucharunsignedchar
#defineuintunsignedint
Unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管段选显示0--9
/****************************************************/
voiddelay(uintcount)//delay
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
/****************************************************/
unsignedcharadc0804(void)//读AD0804子程序
{unsignedcharaddata,i;
rd=1;wr=1;//int1=1;//读ADC0804前准备
P1=0xff;//P1全部置一准备
cs=0;wr=0;wr=1;//启动ADC0804开始测电压
rd=0;//开始读转换后数据
i=i;i=i;//用于延时等待ADC0804读数完毕
addata=P1;//读出的数据赋与addate
rd=1;cs=1;//读数完毕
return(addata);//返回最后读出的数据
}
/****************************************************/
voiddisplay(inttemp)//显示程序
{
ge=1;
delay
(2);
P2=table[temp/10];//显示十位
shi=0;
delay
(2);
shi=1;
shi=1;
P2=table[temp%10];//显示个位
ge=0;
delay
(2);
ge=1;
}
/****************************************************/
uintzhuan(uchartemp)//转换程序,目的是让ad采集进来的
//数字信号转换成00~99的二位数显示
{
intx=255-temp;
inty;
if(x<=40)
y=0;
if(x>=250)
y=99;
if(x>40&x<250)
y=(x-40)*10/21;
return(y);
}
/****************************************************/
voidmain()//主程序
{
inti=0;//数码管检验,小数点全亮,数字从00~99依次显示一次
while(i<10)
{
shi=0;
dp1=0;
dp2=0;
ge=0;
P2=table[i];
i++;
delay(100);
}//检验完毕
while
(1)
{
ucharDATA0,DATA1,DATA2;
a=0;
b=0;
c=0;
DATA0=adc0804();
delay
(2);
a=1;
b=0;
c=0;
DATA1=adc0804();
delay
(2);
a=0;
b=1;
c=0;
DATA2=adc0804();
delay
(2);
if(DATA0<=DATA1&DATA0<=DATA2)//判断哪路光最强,便显示哪
//路及相应的小数点
{
display(zhuan(DATA0));//左路
dp1=0;
dp2=1;
}
else
{
if(DATA1<=DATA0&DATA1<=DATA2)
{
display(zhuan(DATA1));//中路
dp1=1;
dp2=1;
}
else
{
display(zhuan(DATA2));//右路
dp1=1;
dp2=0;
}
}
delay
(2);
}
}