光照强度检测装置要点文档格式.docx
《光照强度检测装置要点文档格式.docx》由会员分享,可在线阅读,更多相关《光照强度检测装置要点文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
2.当光强太弱或者太强的时候,系统报警。
操控简易实用
2.光照检测装置硬件电路设计
2.1总体方案设计
总体设计方框图
设计原理
光敏电阻在不同光照下的不同阻值通过数模转换和单片机处理用数字表示出光照强弱的区别,当光照过强或者过弱时会触发警报。
总体上来说,本方案电路结构简单、所用元器件供给充足、成本造价低、性能稳定且误差范围也在设计选题的要求之内,能在简单低成本的基础上很好的完成设计选题的任务,故实验中采用本方案。
2.2单片机的选择
本次课设选用的是STC89C52单片机,它是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
STC89C52具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
STC89C52单片机引脚图
2.3单元电路的设计
2.3.1光敏电阻电路
光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。
这些制作材料具有在特定波长的光照射下,其阻值迅速减小的特性。
这是由于光照产生的载流子都参及导电,在外加电场的作用下作漂移运动,电子奔向电源的正极,空穴奔向电源的负极,从而使光敏电阻器的阻值迅速下降。
光敏电阻的工作原理是基于内光电效应。
在半导体光敏材料两端装上电极引线,将其封装在带有透明窗的管壳里就构成光敏电阻,为了增加灵敏度,两电极常做成梳状。
在光敏电阻两端的金属电极之间加上电压,其中便有电流通过,受到适当波长的光线照射时,电流就会随光强的增加而变大,从而实现光电转换。
光敏电阻的入射光强,电阻减小;
入射光弱,电阻增大。
2.3.2晶振电路和复位电路
单片机需要一个时间基准来为各种操作提供秩序,此电路叫时钟电路,采用不同的接线方式可以获得不同时钟电路,有内部时钟电路和外部时钟电路,外部时钟电路会使电路复杂,故采用的是内部时钟电路。
时钟电路在单片机的外部通过两个引脚跨接晶体振荡器和微调电容,构成稳定的自激振荡器。
复位电路和晶振电路
2.3.3数模转换电路
A/D转换器就是模拟/数字转换器是将输入的模拟信号转换成为数字信号。
本实验中利用模数转换将模拟电压值转换为离散的数字量再送入单片机进行数据处理。
制作中选用芯片PCF8591为8位CMOS逐次比较型模数转换器。
模数转换包括采样、保持、量化和编码四个过程。
在某些特定的时刻对这种模拟信号进行测量叫做采样,量化噪声及接收机噪声等因素的影响,采样速率一般取。
通常采样脉冲的宽度是很短的,故采样输出是断续的窄脉冲。
要把一个采样输出信号数字化,需要将采样输出所得的瞬时模拟信号保持一段时间,这就是保持过程。
量化是将连续幅度的抽样信号转换成离散时间、离散幅度的数字信号,量化的主要问题就是量化误差。
假设噪声信号在量化电平中是均匀分布的,则量化噪声均方值及量化间隔和模数转换器的输入阻抗值有关。
编码是将量化后的信号编码成二进制代码输出。
这些过程有些是合并进行的,例如,采样和保持就利用一个电路连续完成,量化和编码也是在转换过程中同时实现的,且所用时间又是保持时间的一部分。
2.3.4报警电路
一般所指的蜂鸣器是以压电陶瓷为主要元件的。
压电陶瓷是一类有将压力及电流相互转换能力的特殊陶瓷。
这种能力缘于其特殊的晶体结构。
当压电陶瓷在一定方向上受到一个压力使其晶体结构发生形变时,它就会在内部产生一个电流,并且电流的变化及压力的变化密切相关。
反之亦然。
所以利用这一特性,在压电陶瓷上通过一定频率的电流,就会引起压电陶瓷微小形变,这一形变带动空气发生振动,如果频率适当,就可以被人耳所听见,也就是产生了蜂鸣声。
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。
当光照强度过高或过弱时,蜂鸣器会开始报警。
2.3.5显示电路
显示电路采用的是1602液晶
1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。
它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
液晶显示内容有光照的强度:
“LightText:
xxx”;
亮度等级:
“NoLight!
!
”(无光)、“LowLight”(低光照)”、“MiddleLight”(中等光照)、“HighLight”(高亮度)、“SoHigh!
”(太高)四个等级。
由于本系统采用的是8位AD芯片。
所以显示亮度的数值范围是0~256,即最低亮度检测显示为0,最高亮度检测显示为256。
测试图如上
可以看出当数字显示过小时表明光照过低,系统发出警报。
3.光照检测装置软件设计
3.1软件主程序
主程序流程图
否
是
3.2显示程序
while
(1)
{
LCD_Write_String(0,0,"
LightTest:
"
);
num=255-ReadADC(0);
//值取差值,用于显示光强越小,数值越小
aaa=(num/100);
bbb=(num%100)/10;
ccc=(num%100)%10;
LCD_Write_Char(12,0,0x30+aaa);
LCD_Write_Char(13,0,0x30+bbb);
LCD_Write_Char(14,0,0x30+ccc);
DelayMs(500);
if(num<
30)
{LCD_Write_String(1,1,"
NoLight!
"
warn();
}
elseif(num>
=30&
&
num<
80)
LCD_Write_String(1,1,"
LowLight"
elseif(num>
=80&
130)
MiddleLight"
=130&
180)
HighLight"
else
{
SoHigh!
}
}
3.3报警程序
#include<
reg52.h>
#include"
spk.h"
voidDelayUs2x(unsignedchart);
//函数声明
voidDelayMs(unsignedchart);
voidwarn(void)
{
unsignedinti;
//while
(1)
//{
for(i=0;
i<
200;
i++)
DelayUs2x(200);
spk=!
spk;
spk=0;
//防止一直给喇叭通电造成损坏
DelayMs
(1);
}
//}
4.电路仿真调试
5.总结及心得
本设计主要完成了以下内容:
数字式光照强度检测系统的工作原理及应用、基本方案的选择、单片机系统的硬件设计、单片机系统的软件设计、系统各个模块的设计以及系统的仿真调试。
设计的要求是检测光照强度,光敏电阻在光照下电阻两端电压改变电压式模拟量需要转换成数字量这样单片机才能采集到信号因而选择A/D模数转换。
在设计过程中设计的前一部分也就是系统的硬件设计比较顺利,但到了系统仿真调试的时候出现了一定困难,包括软件绘图方面以及软件编程方面。
经过不懈努力还是完成了老师要求的内容,通过这次课程设计认识到了自己的不足,我会努力完善自己的知识基础和实践能力,相信以后会更好。
感谢我的队友王轶超,感谢老师对我们课程设计中的指导,我会更加努力,在专业上取得更大进步!
附录
参考文献
[1]阎石.数字电子技术基础(第四版)[M].高等教育出版社.1998.11
[2]张毅刚等.MCS-51单片机应用设计.哈尔滨工业电子出版社,1996
[3]何立民.单片机应用技术选编.北京航空航天大学出版社,2000
[4]张友德等.单片微型机原理应用及实验,复旦大学出版社,1996
源程序
#include<
//包含单片机寄存器的头文件
intrins.h>
//包含_nop_()函数定义的头文件
sbitCS=P3^4;
//将CS位定义为P3.4引脚
sbitCLK=P1^0;
//将CLK位定义为P1.0引脚
sbitDIO=P1^1;
//将DIO位定义为P1.1引脚
unsignedcharcodedigit[10]={"
0123456789"
};
//定义字符数组显示数字
unsignedcharcodeStr1[]={"
Volt=.V"
//说明显示的是电压
unsignedcharcodeStr2[]={"
SLGILOVEYOU"
/*********************************************************************
以下是对液晶模块的操作程序
*********************************************************/
sbitRS=P2^0;
//定义端口
sbitRW=P2^1;
sbitE=P2^2;
//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;
//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms(3j+2)*i=(3×
33+2)×
10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;
10;
i++)
for(j=0;
j<
33;
j++);
}
延时若干毫秒
入口参数:
n
voiddelaynms(unsignedcharn)
unsignedchari;
n;
delay1ms();
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;
result=0,不忙
bitBusyTest(void)
bitresult;
RS=0;
//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;
//E=1,才允许读写
_nop_();
//空操作
//空操作四个机器周期,给硬件反应时间
result=BF;
//将忙碌标志电平赋给result
E=0;
//将E恢复低电平
return0;
将模式设置指令或显示地址写入液晶模块
dictate
voidWriteInstruction(unsignedchardictate)
while(BusyTest()==1);
//如果忙就等待
//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"
0"
//空操作两个机器周期,给硬件反应时间
P0=dictate;
//将数据送入P0口,即写入指令或地址
//E置高电平
//当E由高电平跳变成低电平时,液晶模块开始执行命令
指定字符显示的实际地址
x
voidWriteAddress(unsignedcharx)
WriteInstruction(x|0x80);
//显示位置的确定方法规定为"
80H+地址码x"
将数据(字符的标准ASCII码)写入液晶模块
y(为字符常量)
voidWriteData(unsignedchary)
RS=1;
//RS为高电平,RW为低电平时,可以写入数据
P0=y;
//将数据送入P0口,即将数据写入液晶模块
对LCD的显示模式进行初始化设置
voidLcdInitiate(void)
delaynms(15);
//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);
//显示模式设置:
16×
2显示,5×
7点阵,8位数据接口
delaynms(5);
//延时5ms,给硬件一点反应时间
//连续三次,确保初始化成功
WriteInstruction(0x0c);
显示开,无光标,光标不闪烁
WriteInstruction(0x06);
光标右移,字符不移
WriteInstruction(0x01);
//清屏幕指令,将以前的显示内容清除
以下是电压显示的说明
*******************************************/
显示电压符号
voiddisplay_volt(void)
WriteAddress(0x01);
//写显示地址,将在第2行第1列开始显示
i=0;
//从第一个字符开始显示
while(Str1[i]!
='
\0'
)//只要没有写到结束标志,就继续写
WriteData(Str1[i]);
//将字符常量写入LCD
i++;
//指向下一个字符
voiddisplay3(void)
WriteAddress(0x80+0x41);
while(Str2[i]!
WriteData(Str2[i]);
显示电压的小数点
voiddisplay_dot(void)
WriteAddress(0x0d);
//写显示地址,将在第1行第10列开始显示
WriteData('
.'
//将小数点的字符常量写入LCD
显示电压的单位(V)
voiddisplay_V(void)
WriteAddress(0x0e);
//写显示地址,将在第2行第13列开始显示
V'
显示电压的整数部分
voiddisplay1(unsignedcharx)
WriteAddress(0x08);
//写显示地址,将在第2行第7列开始显示
WriteData(digit[x]);
//将百位数字的字符常量写入LCD
显示电压的小数数部分
*****************************************