环境温度光照检测报警系统设计文档格式.docx
《环境温度光照检测报警系统设计文档格式.docx》由会员分享,可在线阅读,更多相关《环境温度光照检测报警系统设计文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
![环境温度光照检测报警系统设计文档格式.docx](https://file1.bdocx.com/fileroot1/2022-12/18/0a57baa2-f39c-4618-b30c-dceba4c9fc29/0a57baa2-f39c-4618-b30c-dceba4c9fc291.gif)
并对采集的数据进行分析处理和按键预设值比较,从而实现对环境中温度和光强的控制并对超标数据进行报警。
关键词:
DS18B20;
光敏传感器;
PCF8591模数转换模块;
OLED显示屏;
STC89C52
本次的课程设计为环境温度和光照检测报警系统,该装置基于STC89C52单片机,对温度传感器DS18B20和光敏传感器采集的温度和光强信息进行相关处理,然后送到人机接口界面液晶显示模块OLED显示屏进行显示。
并对采集的数据进行分析处理和预设值比较,从而实现对环境中温度和光强的控制并对超标数据进行报警。
1绪论
1.1课题的具体功能与要求
(1)检测显示当前的环境温度和光线强度;
(2)键盘设置温度和光强的上限与下限值,如果温度与光强超出界限值,则蜂鸣器发出警报。
同时液晶显示警报的类型。
1.2课题研究的情况
温度、光照度是工业农业生产不可缺少的因素,但传统的方法是用温度表、双金属式测量计、人对光照的感觉、观测植物的生长情况等手段,通过人工进行检测,对不符合温度、光照度要求的环境进行通风、降温、采光等工作。
这种人工测试方法费时费力、效率低,且测试的误差大,随机性大。
含有微型计算机或微处理器的测量仪器,由于它拥有对数据存储,运算逻辑判断及自动化的功能,有着智能作用。
随着生产的发展,一个低成本和具有较高精度的环境测量仪在许多领域会代替人工操作,自动控制各种仪器调整环境温度湿度光照度。
1.3课题研究的意义
目前市场上普遍存在的环境检测仪器大都是单点测量,而且温度、光照强度信息传递不及时,精度达不到要求,不利于控制者根据温度、光照强度变化及时做出决定,为此,本设计开发了一种能够同时测量多点,并实时性高、精度高,能够综合处理多点温度、光照强度信息的检测产品。
总之,环境温湿度与光照强度的检测的设计和开发具有非常大的市场前景和实用价值。
1.4本章小结
2方案论证
本系统主要由主控芯片STC89C52、温度传感器模块、光强检测模块、显示模块、PCF8591AD转换模块组成。
以下是针对这几部分的选材论证。
2.1总系统方案的选择
STC89C52单片机作为核心控制板,该单片机具有高可靠、超低价、低功耗,无法解密等优点。
该单片机属于双列直插式封装的PDI40口管脚。
具有4个输入输出端口,分别为PORT0,PORT1,PORT2,PORT3,其中P0口是一组8位漏极开路型双向IO口,校验时,要求接上拉电阻。
其他三个内部有30K的电阻,所以不用再外接电阻。
2.2各单元模块的比较
2.2.1温度传感器模块
方案一:
DS18B20是数字式温度传感器,采用单总线通信协议。
DS8B20具有体积小,硬件开销低,抗干扰能力强就,精度高等特点。
适合各种弄个狭小空间内设备的数字测温和控制。
同时单线可挂接多个元件,因为每个元件都有唯一的一个光刻ROM编码,家族码为28H,可以单个操作。
方案二:
选用DHT11传感器作为温度传感器。
DHT11是一款有已校准数字信号输出的温湿度传感器。
其精度湿度+-5%RH,温度+-2℃,量程湿度20-90%RH,温度0~50℃。
它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。
传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。
综合比较,方案一的DS18B20具有更高的精度能够满足要求,且技术抗干扰能力强,价格低廉。
故选用方案一的DS18B20作为温度传感器模块。
2.2.2光照传感器模块选择
光强监测部分采用的是光敏电阻。
光敏电阻是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器,表面还涂有防潮树脂,具有光电导效应。
光敏电阻器一般用于光的测量、控制和光电转换(将光的变化转换为电的变化)。
该装置采用的是CDS光敏电阻MJ5606,其亮电阻为4~7KΩ,暗电阻为0.5MΩ。
本设计就是利用了这一特点,把其接为分压电路,再对分到的电压进行AD转换后送给CPU处理显示。
2.2.3AD转换模块选择
在本装置中AD转换用的是AD转换芯片PCF8591。
PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。
PCF8591具有4个模拟输入、1个模拟输出和1个串行I²
C总线接口。
PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。
在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
2.3本章小结
本章主要针对系统总体设计方案的论证,最终确定使用DS18B20为温度检测模块,光敏电阻5606为光照检测模块,PCF851为AD转换模块。
3硬件系统
3.1硬件系统的工作原理
图1整体电路图
整体电路图如下图所示。
3.2各单元模块的设计与原理
3.2.151单片机最小系统
单片机又称单片微控制器,是在一块芯片中集成了CPU(中央处理器)、RAM(数据存储器)、ROM(程序存储器)、定时器/计数器和多种功能的I/O(输入/输出)接口等一台计算机所需要的基本功能部件,从而可以完成复杂的运算、逻辑控制、通信等功能。
在这里,我们没必要去找到明确的概念来解析什么是单片机,特别在使用C语言编写程序的时,不用太多的去了解单片机的内部结构以及运行原理等。
从应用的角度来说,通过从简单的程序入手,慢慢的熟悉然后逐步深入精通单片机。
图2单片机最小系统图
MCS-51单片机是一种集成的电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
3.2.2按键模块设计
独立按键式直接用I/O口线构成的单个按键电路,其特点式每个按键单独占用一根I/O口线,每个按键的工作不会影响其他I/O口线的状态。
独立按键的典型应用如图所示。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一个I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
独立按键部分的设计如图3所示
图3独立按键输入
3.2.3显示模块设计
OLED有机电致发光显示,相较于目前市场上流行的液晶显示器(LCD)有明显的优势,主要表现为:
自主发光,无视角问题,重量轻,厚度薄,亮度高,发光效率高,响应速度快,动态画面质量高,温度范围广,低功耗,抗震能力强,制造成本低,可柔性显示。
与各方面已经发展成熟的LCD相比,OLED的发展还处于初级阶段,但随着以上这些优势的逐步实现,OLED将极有可能取代LCD在市场上的地位,OLED是被业界公认为最具发展前景的下一代显示器。
OLED采用标准6脚接口。
3.2.4温度的采集
本文采用的是美国DALLAS半导体公司生产的可组网数字式温度传感器DS18B20,测温范围-55C-+125C,在-10C-+85C范围内精度为10.5C。
其全部传感元件及转换电路集成在形如一只三极管的集成电路内,与传统温度传感器相比,DS18B20具有单总线接口方式,DS18B20在与微处理器连接时仅需要一根线即可实现微处理器与DS18B20的双向通讯,而无需外加其它电路,同时DS18B20支持多点组网功能,多个DS18B20可以并联在一根总线上实现多点测温;
其测量结果以9位数字量方式串行传送,便于与中央处理器进行数据通信,而且内部有寄存器,有自身指令系统,可识别CPU发出的操作指令。
3.3本章小结
本章对各硬件模块进行了工作原理的介绍,使整体设计思路更加清晰明了。
4软件系统
4.1软件系统流程
STC89C52单片机主控上电时首先对各模块进行初始化,包括对DS18B20单总线初始化、PCF8591的I2C初始化和OLED的SPI初始化。
初始化完成后,通过主程序的while循环,不断通过单总线协议获取DS18B20的温度数据和通过I2C获取PCF8591的光照ADC转换数值,并将温度和光照值显示在OLED上。
与此同时,在while循环里不断检测温度上下限按键是否按下,当按下时,根据相应的按键配置温度和光照各自的报警上下限值,一旦当前值超出上下限范围,蜂鸣器响起报警,且在OLED显示是温度还是光照超过上下限。
4.2各单元的软件流程
4.2.1STC89C52主控单片机
通过C语言编程,实现对各外设的初始化、数据采集、处理和显示等功能。
软件流程是,首先对各模块初始化,然后分别通过对DS18B20单总线写入获取温度值的地址指令、对PCF8591的I2C总线写入获取光照ADC转换值的地址指令,从而分别得到温度值和光照值。
同时在主循环不断刷新OLED的数值显示。
按键检测部分同样通过主循环不断检测,当有按键按下时,设置对应温度或光照值的上下限,设置完毕后主程序不断判断,当某个值超出上下限后,通过蜂鸣器报警。
4.2.2DS18B20模块
采用单总线传输协议,上电后等待主控传来的初始化地址配置信息,当完成初始化后,等待主控发送获取温度的地址指令。
一旦有获取温度的地址指令发来,DS18B20将通过单总线返回当前时刻的温度值。
4.2.3PCF8591
通过I2C协议与主控通讯,当上电后,等待主控从I2C总线传来初始化地址指令。
完成初始化后,等待主控发送查询指令,一旦有指令发来,PCF8591将返回对应通道的ADC数值。
4.2.4OLED模块
通过SPI协议与主控连接,上电后通过SPI传输相应地址配置信息实现初始化工作。
之后有数值需要显示或更新时,只需要在主控调用相应写函数,即可实现对OLED的数值显示和更新工作。
4.3本章小结
软件是本系统的灵魂,只有软件程序编写合理,才可以实现各模块的协调工作,因此软件也是此次课程设计花时间最多的一部分。
在设计期间,出现过多个BUG,其中最严重的是光照值的获取,在开始调试时,返回的数据一直固定不变,没有达到随环境光照改变而改变的功能,最终发现是获取指令的时序问题。
在多次解决类似BUG后,最终才完成本次课程设计。
5系统调试
5.1硬件的检测
整体硬件的检测主要是检测电路板的线路问题。
因为是手工焊接洞洞板,所以难免出现了一些虚焊或短接的问题,通过万用表多次检测后,最终保证了整个电路线路的正常联通。
5.2单元模块的调试
5.2.1主控STC89C52的调试
STC89C52主要是代码程序的逻辑检查,每当出现问题时,首先需要检查的就是逻辑是否错乱,或者时序是否出错。
通过不断观察各外设的现象,反馈回相应的信息,确定主控是否出现问题。
虚焊或短接的问题,通过万用表多次检测后,最终保证了整个电路线路的正常联通。
5.2.2DS18B20模块
DS18B20的问题主要在于单总线的时序。
调试时,将获取的温度返回值通过串口打印,来验证返回的值是否正确,从而判断总线的时序是否正确。
5.2.3PCF8591模块
PCF8591的问题主要在I2C协议的传输上。
当主控程序写完后,调试时将获取的光照值通过串口发送至电脑端的串口调试助手,然后判断值的变化是否正常,如果值一直没有发生变化,可判断是I2C发送的地址指令或时序有问题,然后需要做出相应的修改。
5.2.4OLED模块
OLED的调试问题主要在显示范围的确定。
因为OLED模块使用经验比较丰富,所以没有在初始化或者写寄存器部分出现问题。
主要要做的工作就是通过不断测试各个显示数值的显示位置,从而确定最终的显示界面。
5.2.5系统运行调试
整个工程的代码写完后,首先对各模块进行单独测试,检查各部分的时序和返回数据是否正常,各模块都正常后才进入整体联调。
联调时,将各数值均显示在OLED上,并以此判断数值是否正确,如果不正确,则对相应的单元进行修改和调整。
当所有部分稳定正常后,可判断本作品没问题。
5.3本章小结
测试是做作品非常关键的一环,有可能在写程序时觉得一切正常,觉得理所应当可以工作,但测试时就是出现问题,这时候就需要耐下心来慢慢对各部分调试。
通过本次课程设计调试过程的学习,懂得了要先单独测试再整体联调的道理,只有这样才能保证出现的问题最少,而且能最快解决问题。
同时学会了要懂得借助工具进行调试,比如串口调试助手,这样才能提高调试效率。
6总结与展望
本次课程设计过程中,我的设计题目为“环境温度、光照检测报警系统设计”
在这次的单片机课程设计中,完整地体验了整个设计的流程,从设计的功能设计、材料选择、仿真、焊接电路、上电实验、调试参数一步一步完成设计的功能,感觉良好。
在这个过程中,涉及到很多需要问题超出平时的学习内容,这时候就考验我们收集材料的能力。
在网上看到了很多具体的例子,通过学习他们的编程思路,以此来学习本设计会涉及到的问题,在遇到问题的时候,能够与周围的同学一起讨论,收获颇多。
在编写程序的时候,发现有部分C语言语法掌握不够熟悉,时常需要通过查找以前课程书籍的内容,这也加深了我对C语言的理解。
在硬件焊接的时候,我吸取了其他同学“烧板”的惨痛经历,每次焊接时候都格外注意正负极的焊接和走向,焊接完成后马上用电表测试有无短路的情况发生,再进入通电调试。
在实物的调试阶段,因为屏幕的大小限制,导致能够显示的内容不多,所以在测试之后我将原本位数较多的数据进行除数的处理,将数据压缩为两位,并保证其能够灵敏地反映出参数的变化,最终拥有较为简洁的界面。
按键的设置部分因为一开始没有加上消抖功能并且没有加上按键的松手判断,导致按键的功能出现了问题。
通过向同学的讨教过程中,我学习到了消抖的原理以及松手判断的原因,最终完成了整个作品的设计
通过本次课程设计,我对单片机有了更进一步的认识,也对C语言的内容有了更深层次的理解,这对于日后的学习和工作都是大有帮助的。
参考文献
[1]张丽娜,刘美玲,姜新华.51单片机系统开发与实践[M].北京:
北京航空大学出版社,2013.
[2]代金龙.基于单片机的液晶计算器设计[J].清华大学教育研究,2000.
附录
作品实物图
核心程序
#include<
reg52.h>
I2C.H>
oled.h>
temp.h>
#defineucharunsignedchar
#definePCF85910x90//PCF8591
#defineMAIN_Fosc11059200UL
main()
{
ucharnum=0,limit=0;
u32i;
u32Tem_L=0,Tem_H=210,Lig_L=810,Lig_H=950;
ucharL,M;
OLED_Init();
OLED_Clear();
while
(1)
{
write_byte(0xbe);
L=read_byte();
M=read_byte();
i=M;
i<
<
=8;
i|=L;
i=i*0.0625*10+0.5;
if((i<
Tem_L)||(i>
Tem_H)||((1000-D[0])<
Lig_L)||((1000-D[0])>
Lig_H))
{
BEEP=0;
if(((1000-D[0])<
Lig_H))
{
BEEP=0;
}
}
delay_ms(5);
if(num==1)
if(key_s2==0)
delay_ms(5);
if(key_s2==0)
{
limit++;
}
while(!
key_s2);
}
if(limit==1)
if(key_s3==0)
delay_ms(10);
while(!
key_s3);
elseif(key_s4==0)
if(key_s4==0)
Tem_L++;
if(Tem_L>
Tem_H)
Tem_L=0;
}
elseif(limit==2)
if(key_s3==0)
if(key_s4==0)
delay_ms(5);
key_s4);
elseif(limit==3)
limit=1;
}
elseif(num==2)
OLED_ShowChar(40,5,'
H'
);
if(key_s4==0)
{
Lig_H++;
OLED_ShowNum(60,5,Lig_L/100,3,5);
if(Lig_L>
Lig_H)
Lig_H=100;
}
}}}}}