数字光强度检测模块设计讲诉.docx
《数字光强度检测模块设计讲诉.docx》由会员分享,可在线阅读,更多相关《数字光强度检测模块设计讲诉.docx(31页珍藏版)》请在冰豆网上搜索。
数字光强度检测模块设计讲诉
1前言
1.1设计选题
设计选题一:
数字光强度检测模块设计
1.2任务及要求
1.2.1设计选题的任务
结合单片机最小电路和光敏电阻电路共同设计一个基于单片机的数字光强度检测系统,用数码管显示光照强度。
还可以设置多个不同方向的光敏电阻,通过计算它们的光照强度运用比较器以确定当前的光照方向。
(1)、实现单片机最小系统设计。
(2)、焊接调试光敏电阻网络。
(3)、焊接调试AD电路,标定光照强度基本单位。
(4)、编写单片机程序,将获得的电信号转换成光照强度单位下的数值,并用数管显示。
(5)、通过比较不同方向测得的光强数值判断光照方向,在数码管上显示其方向。
1.2.2设计选题的要求
(1)、无光照时数码管显示为零。
(2)、用数码管显示光照强度,误差范围为5~10LUX(以白天中午室内日光灯的光照强度为标准定义为100LUX)。
(3)、两个小数点具体显示光强方位(两个小数点分别单独亮和均不亮代表三个方位)。
2总体方案设计
2.1设计方案的提出与论证
2.1.1设计方案一
采用光敏电阻、二极管和555定时器构成多谐振荡电路,利用多谐振荡电路的两个暂稳态输出由此产生矩形波脉冲信号。
而光敏电阻阻值会随着光照强度的变化而发生变化,进而使得多谐振荡电路的周期变化,其输出波形频率也随之改变。
将其输出模拟信号波形输入到一个简易数字式频率计通过两位数码管显示出来,数字式频率计主要由时基电路、闸门电路计数器、锁存器、译码显示电路和逻辑控制电路组成。
具体实现框图如下图2.1所示:
简易数字频率计
逻辑控制电路
图2.1设计方案一原理框图
本方案采用性能稳定且便宜的光敏电阻作为光照传感器,通过光敏电阻值变化影响多谐振荡电路的周期而检测光强,性能较稳定一些,灵敏度也较高,但是电路结构比较复杂,所用元器件种类较多,实现和调试工作会比较困难,造价也较高,虽然能满足稳定性和灵敏度的要求,但不宜采用。
2.1.2设计方案二
本方案采用光电二极管,利用其产生的电流随光照增强的线性特性输出模拟采样电压,并联三条光敏二极管和电阻支路,将这三路电压通过选通器循环输入到模数转换器ADC0804将模拟信号转换为数字信号,将数字信号通过通信模块输送给STC89C51单片机,通过比较后得出最大值,将最大值输出并利用两位数码管显示出来。
具体框图如下图2.2所示:
模数转换
ADC
图2.2设计方案二原理框图
对于本方案,采用线性好,响应速度快的光敏二极管作为光照传感器,故电路响应速度快,灵敏度高。
缺点是单独使用输出电流(或电压)很小,需要加放大电路将采样电压进一步放大,而加入运放环节会由于运放的零漂和易受温度影响使得电路稳定性降低,误差增大。
另外限于实验元器件的供给,实验中也不采用本方案。
2.1.3设计方案三
采用三路光敏电阻支路并联检测光照强度,通过每一路可以得到一个模拟采样电压,将这三路电压通过CD4051单8通道数字控制模拟电子开关循环输入到模数转换器ADC0804将模拟信号转换为数字信号,将数字信号通过通信模块输送给STC89C51单片机,通过比较后得出最大值,将最大值输出并利用两位数码管显示出来。
对于光强的方位,则通过控制两位数码管的两个小数点的关断与否来显示出来,具体是两个小数点分别单独亮时对应两个方位,而两个小数点均不亮时对应另外一个方位。
至此,可以将光照的强度以及光照的方位通过两位数码管显示出来,完成了本设计选题的任务及要求。
具体框图如下图2.3所示:
两位数码
管显示
图2.3设计方案三原理框图
本方案采用性能稳定且便宜的光敏电阻作为光照传感器,STC89C51单片机作为主控制器。
性能稳定,抗干扰能力强,不易受外界环境温度等因素影响,灵敏度也较高,但是由于光照传感器采用光敏电阻且为三条支路并联采集模拟电压信号,会存在一定的误差。
总体上来说,本方案电路结构简单、所用元器件供给充足、成本造价低、性能稳定且误差范围也在设计选题的要求之内,能在简单低成本的基础上很好的完成设计选题的任务,故实验中采用本方案。
2.2方案选择
通过以上三种方案的设计,方案一采用光敏电阻作为光照传感器,稳定性和灵敏度虽然都能满足设计选题的要求,但是电路结构过于复杂,实现和调试都比较困难,在实验中不采用;方案二采用光敏二极管作为光照传感器,线性度好,响应速度快,但是需要额外添加运放环节,对系统稳定性和误差都会带来不利影响,另外限于元器件的供应,本实验中也不采用:
而方案三采用光敏电阻作为光照传感器,进行模拟电压采样,通过ADC数模转换器将模拟信号转换为数字信号传送到51单片机中,进而控制两位数码管显示具体数值和方位,简单可行,成本造价低,故在实验中采用本方案。
3单元模块设计
3.1个单元模块功能介绍及电路设计
3.1.1光照强度检测电路的设计
对于最终采用的方案三,其光照强度检测电路如下图3.1所示:
图3.1设计方案光强检测电路
如上图所示,采用三路光敏电阻支路并联,其中一路串联固定电阻,而另外两组分别串联一个电位器,均接在VCC和GND之间,采样电压为三个光敏电阻两端所加电压U1、U2、U3,对于这三路电压值比较后把最大值输送给ADC0804转化为数字信号,通过数码管显示出来。
其中两个电位器的作用是在后期的调试过程中,使得在外界给予三个方向的光敏电阻同样强度的光照时,通过调节电位器使得数码管显示光强数值相同。
对于与两个采样电位器和采样固定电阻的选取,由数字式万用电表对光敏电阻在无光照和正常光照时进行测量,对应阻值在2.1k欧姆—11.2k欧姆之间变化,故固定电阻R1选取5k欧姆左右,综合实验室的电阻元器件供给,本实验中选取4.7k欧姆;两个电位器则选择0-20k欧姆规格的灵敏电位器。
3.1.2电压输出选择电路设计
输出选择模块采用CD4051芯片如下图3.2所示:
图3.2设计方案输出模块CD4051芯片电路结构图
CD4051相当于一个单刀八掷开关,控制X0-X7八个通道的开通和关断,开关接通哪一通道,由输入的3位地址码ABC来决定。
本设计方案中将三路模拟采样电压U1—U3分别接到X0-X2上,由单片机程序控制ABC管脚进行循环采样,进而控制采样电压的输出,通过X输出端传送给数模转换器ADC0804芯片。
3.1.3数模转换模块电路设计
本方案中采用ADC0804芯片进行数模转换,其电路结构图如下图3.3所示。
ADC0804模数转换器是用CMOS集成工艺制成的逐次比较型摸数转换芯片。
分辨率8位,转换时间100μs,输入电压范围为0~5V,增加某些外部电路后,输入模拟电压可为5V。
该芯片内有输出数据锁存器,当与计算机连接时,转换电路的输出可以直接连接在CPU数据总线上,无须附加逻辑接口电路。
图3.3设计方案一数模转换模块电路结构图
在实验方案中,将CD4051循环输出的模拟电压接到ADC0804的6管脚输入,通过它转换为数值信号,通过八个管脚DB0—DB7通过通信模块传送给单片机,对单片机进行编程进而控制两位数码管的显示。
其外接电阻的阻值已经标注在电路结构图中。
对于ADC0804其接口时序及接口信号图如下图3.4所示:
图3.4设计方案ADC0804接口时序及接口信号图
3.1.4单片机最小系统的电路设计
图3.5设计方案单片机最小系统电路结构图
STC89C51功能强大、速度快、寿命长、价格低,目前在市场上已经是主流,其外型有40个引脚,双列直插DIP-40。
STC89C51可以完成ISP在线编程功能,而AT89C51则不能。
将AT89C51中的程序直接烧录到STC89C51中后,STC89C51就可以代替AT89C51直接工作(一般都不需要做任何改动即可正常工作)。
因此本实验中采用STC89C51单片机作为主控制器,其电路结构如上图3.5所示。
对于电路中注意单片机要使用P0端口,必须外加上拉电阻,本实验方案中采用10K欧姆排阻。
电路中P10—P17管脚分别接到模数转换电路ADC0804电路的DB0—DB7管脚。
另外其对应的通信系统电路图如下图3.6所示:
图3.6设计方案通信模块电路结构图
3.1.5数码管显示电路的设计
用一个两位数码管来具体显示光照强度的数值,两位数码管的两个小数点对应显示光强方位,主要由编程控制。
数码管电路结构图具体如下图3.7所示:
图3.7设计方案数码管显示电路结构图
3.1.6系统其它部分
整个板子的电源由直流稳压电源供电,加5V电压,由一六角自锁开关来控制通断;单片机程序编译软件由KeiluVision2完成,单片机复位由一个小按键来实现;单片机下载程序软件则为STC-ISPV29Beta5来完成。
3.2电路参数的计算及元器件的选择
表1元器件清单表
元器件名称型号
数量
万用板
单片机STC89C51
DIP40
六角自锁开关
四角按键
30pf电容
12M晶振
Max232芯片
DIP16插座
104电容
串口头
ADC0804
DIP20插座
电位器
LM358
DIP8插座
CD4051
两位数码管
三极管8550
光敏电阻
150pf电容
1
1
1
1
1
2
1
1
2
5
1
1
1
2
1
1
1
1
2
3
1
3.3光照传感器及敏感元件概述
光照传感器是基于光电效应、将光信号转换为电信号的传感器,其敏感元件是光电器件。
光照传感器主要由光敏元件组成。
目前光敏元件发展迅速、品种繁多、应用广泛。
主要有光敏电阻器、光电二极管、光电三极管、光电耦合器和光电池。
3.3.1光敏电阻器
1、光敏电阻原理
光敏电阻器由能透光的半导体光电晶体构成,因半导体光电晶体成分不同,又分为可见光光敏电阻(硫化镉晶体)、红外光光敏电阻(砷化镓晶体)、和紫外光光敏电阻(硫化锌晶体)。
当敏感波长的光照半导体光电晶体表面,晶体内载流子增加,使其电导率增加(即电阻减小)。
光敏电阻器是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器;入射光强,电阻减小,入射光弱,电阻增大。
光敏电阻器一般用于光的测量、光的控制和光电转换(将光的变化转换为电的变化)。
2、光敏电阻的应用
光敏电阻器广泛应用于各种自动控制电路(如自动照明灯控制电路、自动报警电路等)、家用电器(如电视机中的亮度自动调节,照相机中的自动曝光控制等)及各种测量仪器中。
3.3.2光敏二极管
光敏二极管是一种将光能变换为电能的器件,它利用了半导体的光生伏特效应的原理。
光敏二极管的优点是线性好,响应速度快,对宽范围波长的光具有较高的灵敏度,噪声低;缺点是单独使用输出电流(或电压)很小,需要加放大电路。
4软件设计
4.1说明软件设计原理及设计所用工具
本设计主要使用Protel以及ISIS软件,通过它可以进行原理图的绘制以及仿真。
下面介绍一些前面板对象共用属性的用法。
1)Visible选项:
选中该项表示开启栅格的功能。
当开启栅格显示功能的时候,原理图的图纸背景中会出现网格。
该选项后面的编辑框用于输入显示栅格的大小,单位为mil。
2)LibRef编辑框:
表示所要放置的元器件在元件库中的名称。
Protel99SE就是根据这一名称在当前元件库中进行搜索,在用户确定之后再将其从库中调到工作区中的。
3)Designator编辑框:
表示所要放置的元器件在原理图中的元器件序号,每一个元器件都有一个唯一的元器件序号,它是元器件的唯一标识符。
4)PartType编辑框:
表示元器件的类型。
默认情况下,它与LibRef的内容相同,也就是说,该元件的类型就是它在相应的元件库中的名称。
4.2画出软件设计结构图、说明其功能
本设计主要使用Protel及ISIS软件,来设计步进电机驱动控制系统。
本次设计数字光照强度检测模块设计必须有五个部分,即:
1)照强度检测电路;2)电压输出选择电路;3)数模转换模块电路;4)单片机最小系统的电路;5)数码管显示电路。
各部分功能分别为:
1)在后期的调试过程中,使得在外界给予三个方向的光敏电阻同样强度的光照时,通过调节电位器使得数码管显示光强数值相同;2)控制采样电压的输出,通过X输出端传送给数模转换器ADC0804芯片;3)将CD4051循环输出的模拟电压接到ADC0804的6管脚输入,通过它转换为数值信号,通过八个管脚DB0—DB7通过通信模块传送给单片机,对单片机进行编程进而控制两位数码管的显示;4)作为主控制器;5)用一个两位数码管来具体显示光照强度的数值,两位数码管的两个小数点对应显示光强方位。
5系统调试
5.1电路板硬件焊接及调试
硬件的焊接工作是软件编程调试的基础,硬件焊接的质量对于一个系统的性能、稳定性都有重要影响。
5.1.1准备工作
在进行焊接之前,我首先对拿到手的所有元器件进行测试以检查其是否还能正常工作。
对于三个光敏电阻、普通电阻、两个三极管逐一测试,发现其中一个光敏电阻阻值基本不随光照强度变化而变化,又进行了调换。
所有元器件基本测试完毕后,对其管脚进行镀锡,以保证电路可靠性和焊接质量。
紧接着在焊之前对元器件的分布做一个大致的布局,在布局清晰的基础上开始硬件的焊接。
5.1.2焊接工作
在焊接过程中,应遵循以下原则:
1)、元器件的装插焊接应遵循先小后大,先轻后重,先低后高,先里后外的原则;在瓷介电容、电解电容等元件立式安装时,引线不能太长,否则降低元器件的稳定性;但也不能过短,以免焊接时因过热损坏元器件;
2)、各元器件焊接在电路板上,焊盘上的元器件引脚不高出电路板面2mm,高出的部分用斜口钳或其它剪切工具剪下。
焊点大小均匀整洁,焊锡适量,剪切高度一致,元器件摆放位置合适、整齐;
3)、对于集成电路的焊接:
在焊接时,首先要弄清引线脚的排列顺序,并与线路板上的焊盘引脚对准,核对无误后在焊接,然后再重复检查,确认后再焊接其余脚位。
由于集成电路引线脚较密,焊接完后要检查有无虚焊,连焊等现象,确保焊接质量。
在实验过程中,我在遵循上述原则的基础上,同时对电路分块进行焊接。
在分块焊接的过程中首先对电路中的插座进行了统一的焊接,再对电阻电容等小元器件进行焊接,所有元器件焊完后,把每一块内部需要连接在一起的连接起来。
这样在各大块完成的基础上,再将块与块之间的连线焊上。
至此,所有硬件基本焊接完毕。
接下来对电路板的直流供电进行焊接,将所有需要接到VCC端的点连接到一起,再加上六角自锁开关。
最后将程序下载所需的串口焊接上,把过长的引线剪断并擦拭干净,至此硬件焊接工作基本完毕。
5.1.3静态测试
将集成电路元器件对准方向装上后,进行硬件电路的检查,加上5V直流电源,在确保所有元器件没有过热的前提下,利用数字式万用表直流电压档检测各节点(包括芯片的电源管脚,地管脚等)进行电压测量,都符合条件。
最后检测光敏电阻支路节点电压是否随光照强度变化而变化,检测结果为:
当无光照时电压在0.15V左右;而白天室内正常光照时,检测电压约为3.5V左右。
静态测试符合要求,接下来进行下一步,即程序的调试。
5.2数码管显示电路及程序调试
在进行数码管显示电路的过程中,首先遇到了硬件上的问题,在程序下载完毕后,数码管没有任何反应,根本不亮,在经过检查后,发现可能是两个三极管的问题,将三极管拆下来进行测试,发现已经损坏,再经过调换重新焊接后,硬件电路恢复正常了,数码管开始亮起来,但数字一直在闪和跳变,同时小数点也在跳变。
具体思考造成数码管闪动和数字跳变的原因,再经过老师答疑,认为是程序中对数据采样没有通过在一段时间内采样进而求平均值的方法来采集数据,致使显示数据随着外界的小干扰一直在跳变。
而数码管在闪动则是因为延迟时间设置过长,超出了人的视觉暂留范围,使人感觉到数字在闪动。
在明白了原因的基础上,对程序进一步修改和调试,最后数码管很稳定且灵敏度很高地显示出了检测到的光强值,且小数点与各个方位的对应关系也是正确的。
至此,软件调试工作基本完毕,调试后的最终程序如下所示。
最终程序:
#include//单片机51头文件,存放着单片机的寄存器
#include//为了使用空指令加载的头文件
sbitsmg2=P2^5;//数码管位addata选
sbitsmg3=P2^4;//数码管位选
#defineucharunsignedchar
#defineuintunsignedint
unsignedcharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//数码管段选显示0--9
unsignedcharcontrl;//小数点控制标志
sbitcs=P3^3;
sbitwr=P3^5;
sbitrd=P3^4;//AD控制管脚定义
sbita=P2^0;
sbitb=P2^1;
sbitc=P2^2;//CD4051通道选择
sbitLP=P2^3;//左边小数点
sbitRP=P2^6;//右边小数点
voiddelay(uintcount)//delay
{
uinti;
while(count)
{
i=5;
while(i>0)
i--;
count--;
}
}
voiddelay_n(uintcount)//delay
{
uinti;
while(count)
{
i=1;
while(i>0)
i--;
count--;
}
}
/*************读AD0804子程序*******************************/
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;//读数完毕
addata=addata/2;
return(addata);//返回最后读出的数据
}
voiddisplay(inttemp)
{smg3=1;
P0=table[temp/10];//显示十位
smg2=0;
delay(25);
smg2=1;
/****************************************************/
smg2=1;
P0=table[temp%10];//显示个位
smg3=0;
delay(25);
smg3=1;
/****************************************************/
}
unsignedcharselect(void)//判断三个光照强度,输出最大的
{
unsignedcharright,mid,left,max;
/**************************************************/
a=0;
b=0;
c=0;
delay
(2);
right=adc0804();
delay(6);
/**************************************************/
a=1;
b=0;
c=0;
delay
(2);
mid=adc0804();
delay(6);
/**************************************************/
a=0;
b=1;
c=0;
delay
(2);
left=adc0804();
delay(6);
/******************************************************/
if(right>=mid)
{
if(right>=left)
{
max=right;
contrl=1;
}
else
{
max=left;
contrl=3;
}
}
else
{
if(mid>=left)
{
max=mid;
contrl=2;
}
else
{
max=left;
contrl=3;
}
}
return(max);
}
unsignedcharFilter(void)
{
unsignedchari;
unsignedcharvalue,sum1;
unsignedintsum;
sum=0;
for(i=0;i<3;i++)
{
sum1=select();
sum+=sum1;
delay_n
(1);
}
value=sum/3;
if(value<15)
{
value=0;
contrl=4;
}
return(value);
}
voidmain()
{
uchartt=0;
ucharxx=0;
while
(1)
{
xx=Filter();
for(tt=0;tt<10;tt++)
{display(xx);
delay(100);
}
switch(contrl)
{
case1:
LP=1;RP=0;break;
case2:
LP=1;RP=1;break;
case3:
LP=0;RP=1;break;
case4:
LP=1;RP=1;break;
default:
LP=1;RP=1;break;
}
for(tt=0;tt<5;tt++)
{
display(xx);
delay(100);
}
}
}
6系统功能、指标参数
6.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;/