最近一直想做一个可以检测温湿度的,光照强度,还有气压检测的仪表。而且要精度高反应快的传感器,在网上找了一圈,看的眼花缭乱,符合要求的价格都不低,无意中看到某宝看到一个温湿度、气压、光照度三合一的传感模块,最重要的是模块上面集成的温湿度芯片是我首选的SHT20,还有光照强度传感器BH1750. ,都符合自己的要求,这2款芯片在大学的时候就有所了解,算是温度检测和光照检测领域里,精度高,体积非常小,性价比很高的一款。气压传感器一般都是采用BMP180或者BMP085,这2个芯片也差不多的,现在用BMP180的感觉要多一些。非常符合设计需要。 再加上这个模块是串口输出,直接就可以读取数据啦。哈哈哈,根本不需要自己去进行3个传感器的驱动代码编程,。(其实之前我也买个单独的模块回来,本来打算3个模块并联使用,,奈何程序花了好几天时间都没有调试通过,后来模块直接都不知道丢哪里去了。)。于是果断重新就此准备自己重新制作一个。 因为是模块,没有相关的显示屏,硬着头皮问卖家能不能拿送个显示屏................结果和预想的一样。需要单独购买。好吧,又买了一块单片机的板子,到手拼接后,开始查资料制作,于是出现了此贴。
从单片机板子和模块到手后 到制作完成总共花了1天时间!附实物图与相关程序,留给需要的人吧!其实还可以通过气压大小,有相应来计算出海拔高度。过段时间更新的时候我在上传上来。。。。3合1模块上的传感器:CMCU-01 SHT20+BMP180+BH1750FVI
各传感器的参数介绍:
================================================
SHT20是瑞士Sensirion 数字温湿度传感器。 SHT20数字温湿度传感器是众多温湿度传感器中一款性价比高的产品,配有4C 代CMOSens®芯片。除了配有电容式相对湿度传感器和能隙温度传感器外,该芯片还包含一个放大器、A/D 转换器、OTP 内存和数字处理单元。用量以百万计,且应用领域广泛。该类传感器适用于对成本极其敏感但又注重品质的大批量生产的行业。 同时具有很高的温度精度和湿度精度。 SHT20系列模块专为低功耗小体积应用设计,具有良好的品质、快的响应速度、抗干扰能力强、性价比高等优点、极低的功耗。懂行的人都知道它的优点。传感器重要参数: 湿度测量范围:0—100%RH
湿度精度范围(10%RH to 95%RH): ±3%RH温度测量范围: -40℃—125℃ (-40 - +257°F)温度精度范围:±0.3℃湿度迟滞:±1%RH测量时间:50ms年漂移量:-0.5%RH/year响应时间:5 s
=================================================
BMP180是一款高精度、小体积、超低能耗的压力传感器,可以应用在移动设备中
它的性能卓越,绝对精度最低可以达到0.03hPa,并且耗电极低,只有3μA,采用强大的8-pin陶瓷无引线芯片承载(LCC)超薄封装,可以通过I2C总线直接与各种微处理器相连
主要特点:
压力范围:300~1100hPa(海拔9000米~-500米),从这里可以看出来,该模块还可以通过公式计算海拔高度哦~
低功耗:5μA,在标准模式
高精度:低功耗模式下,分辨率为0.06hPa(0.5米)
高线性模式下,分辨率为0.03hPa(0.25米)
======================================================BH1750FVI
采用ROHM原装BH1750FVI芯片
光照度范围:0-65535 lx (有没有发现比光敏电阻强N倍?)
传感器内置16bitAD转换器
直接数字输出,省略复杂的计算,省略标定
不区分环境光源
接近于视觉灵敏度的分光特性
可对广泛的亮度进行1勒克斯的高精度测定
===============================================
单片机源程序如下:
- #include <reg52.h>
- #include <intrins.h>
- #include"LCD1602.h"
- #define uchar unsigned char // 以后unsigned char就可以用uchar代替
- #define uint unsigned int // 以后unsigned int 就可以用uint 代替
- uchar rxfalg=1;
- uchar Byte1,Byte2,Byte3,Byte4,Byte5,Byte6,Byte7,Byte8,Byte9,Byte10,Byte11,Byte12,Byte13,Byte14,Byte15,Byte15,Byte16;
- uint Light,Pressure,Temp; //定义的光照强度,气压,温度。
- uchar Humi; //湿度
- /*********************************************************/
- // 毫秒级的延时函数,time是要延时的毫秒数
- /*********************************************************/
- void DelayMs(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<112;j++);
- }
- /*********************************************************/
- // 串口初始化
- /*********************************************************/
- void UartInit()
- {
- SCON = 0x50; // 配置串口寄存器
- TMOD = 0x20; // 配置定时器寄存器
- TH1 = 0xfd; // 计算波特率的值为9600
- TL1 = 0xfd; // 计算波特率的值为9600
- EA = 1; // 打开总中断
- ES = 1; // 打开串口中断
- TR1 = 1; // 启动定时器
- }
- /*********************************************************/
- // 主函数
- /*********************************************************/
- void main(void)
- {
- LCDInt(); //液晶初始化
- UartInit(); // 串口初始化
- DelayMs(500);
- SetXY(0,0); // 光照
- LCDWriteDate('L');
- LCDWriteDate(':');
- SetXY(0,7);
- LCDWriteDate('L');
- LCDWriteDate('x');
-
- SetXY(1,0); // 气压
- LCDWriteDate('P');
- LCDWriteDate(':');
- SetXY(1,8);
- LCDWriteDate('K');
- LCDWriteDate('p');
-
-
- SetXY(0,10); // 温度
- LCDWriteDate('T');
- LCDWriteDate(':');
- // SetXY(0,15); //
- // LCDWriteDate(0XDF);
-
- SetXY(1,11); //湿度
- LCDWriteDate('H');
- LCDWriteDate(':');
- SetXY(1,15); //
- LCDWriteDate('%');
-
-
- while(1)
- {
-
-
- if(rxfalg==0)
- {
- rxfalg=1;
-
- //光照强度
- SetXY(0,2); //
- LCDWriteDate(Light/10000+0x30);
- LCDWriteDate(Light%10000/1000+0x30);
- LCDWriteDate(Light%1000/100+0x30);
- LCDWriteDate(Light%100/10+0x30);
- LCDWriteDate(Light%10+0x30);
-
- //气压强度
- SetXY(1,2); //
- LCDWriteDate(Pressure/10000+0x30);
- LCDWriteDate(Pressure%10000/1000+0x30);
- LCDWriteDate(Pressure%1000/100+0x30);
- LCDWriteDate('.');
- LCDWriteDate(Pressure%100/10+0x30);
- LCDWriteDate(Pressure%10+0x30);
-
- //温度
- SetXY(0,12); //
- LCDWriteDate(Temp/100+0x30);
- LCDWriteDate(Temp%100/10+0x30);
- LCDWriteDate('.');
- LCDWriteDate(Temp%10+0x30);
-
- //湿度
- SetXY(1,13); //
- LCDWriteDate(Humi/10+0x30);
- LCDWriteDate(Humi%10+0x30);
-
- }
-
- DelayMs(500);
- }
- }
- /*********************************************************/
- // 串口中断服务程序
- /*********************************************************/
- void UartInt(void) interrupt 4
- {
- ES = 0; //关串口中断,防止中断嵌套
- while(!RI); // 固定位0XAA
- Byte1=SBUF;
- RI=0;
- while(!RI); // Byte2 预留
- Byte2=SBUF;
- RI=0;
-
- while(!RI); // Byte3 预留
- Byte3=SBUF;
- RI=0;
-
- while(!RI); // Byte4 预留
- Byte4=SBUF;
- RI=0;
-
- while(!RI); // Byte5 预留
- Byte5=SBUF;
- RI=0;
-
- while(!RI); // Byte6 光照强度高8位
- Byte6=SBUF;
- RI=0;
-
- while(!RI); // Byte7 光照强度低8位
- Byte7=SBUF;
- RI=0;
-
- while(!RI); // Byte8 气压高8位
- Byte8=SBUF;
- RI=0;
-
- while(!RI); // Byte9 气压低8位
- Byte9=SBUF;
- RI=0;
-
- while(!RI); // Byte10 温度正负标志位
- Byte10=SBUF;
- RI=0;
-
- while(!RI); // Byte11 温度高8位
- Byte11=SBUF;
- RI=0;
-
- while(!RI); // Byte12 温度低8位
- Byte12=SBUF;
- RI=0;
-
- while(!RI); // Byte13 湿度
- Byte13=SBUF;
- RI=0;
-
- while(!RI); // Byte14 校验和 高8位
- Byte14=SBUF;
- RI=0;
-
- while(!RI); // Byte15 校验和 低8位
- Byte15=SBUF;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
程序,相关文档资料测试通过.zip
(3.78 MB, 下载次数: 337)
|