目录
小型气象站
问题咨询及项目源码下载请加群:
群名:IT项目交流群
群号:245022761
一、实验目的
1. 了解温湿度传感器工作原理
2. 了解大气压力传感器工作原理
3. 了解激光颗粒物传感器工作原理
4. 学会使用SHT11温湿度传感器检测环境温湿度
5. 学会使用BMP085气压传感器检测大气压力
6. 学会使用激光颗粒物传感器检测空气质量
7. 会使用1602液晶显示模块显示气象参数
二、系统连接图
三、代码实现部分
1602代码段:
#include <1602.h>
sbit LCDEN=P3^4;
sbit RS=P3^5;
//RW直接接地,只允许写不允许读
sbit BF=P0^7;
//u8 DectectBusyBit(void)//状态判断函数(忙/闲?)
//{
// bit result;
// P0 = 0xff; //读状态前先置高电平,防止误判
// RS = 0;
// delay_ms(5);
// RW = 1;
// LCDEN = 1;
// delay_ms(5);
// result=BF; //若LCM忙,则反复测试,在此处原地踏步;当LCM闲时,才往下继续
// LCDEN = 0;
// return result;
//}
//u8 RdACAdr(void)//读当前光标地址
//{
// u8 result;
// P0 = 0xff; //读地址前先置高电平,防止误判
// RS = 0;
// delay_ms(5);
// RW = 1;
// LCDEN = 1;
// delay_ms(5);
// result=P0&0x7f; //去掉最高位忙闲标记,只保留低7位地址值
// LCDEN = 0;
// return result;
//}
void WrComLCD(u8 ComVal)//写命令函数
{
// while(DectectBusyBit()==1); //先检测LCM是否空闲
RS = 0;
delay_ms(1);
// RW = 0;
LCDEN = 1;
P0 = ComVal;
delay_ms(1);
LCDEN = 0;
}
void WrDatLCD(u8 DatVal)//写数据函数
{
// while(DectectBusyBit()==1);
RS = 1;
delay_ms(1);
// RW = 0;
LCDEN = 1;
P0 = DatVal;
delay_ms(1);
LCDEN = 0;
}
void LCD1602_Init(void)//1602初始化函数
{
WrComLCD(0x38); // 功能设定:16*2行、5*7点阵、8位数据接口
WrComLCD(0x38);
WrComLCD(0x38);
//多次重复设定功能指令,因为LCD启动后并不知道使用的是4位数据接口还是8位的,所以开始时总是默认为4位,这样刚开始写入功能设定指令时,低4位被忽略,为了可靠,最好多写几遍该指令
WrComLCD(0x01); // 清屏
WrComLCD(0x06); // 光标自增、屏幕不动
delay_ms(1); // 延时,等待上面的指令生效,下面再显示,防止出现乱码
WrComLCD(0x0C); // 开显示、关光标
delay_ms(5);
}
void LCD1602pos(u8 x,u8 y)//1602显示坐标定位函数:x为行标,0:第一行,1:第二行;y为列标,0-15
{
u8 t;
t=x?0x40:0x00;
WrComLCD(0x80+t+y);
}
void LCD1602_disstr(u8 *p,u8 x,u8 y)//从指定坐标开始显示英文字符串(长度不超过32)
{
u8 i=0;
LCD1602pos(x,y);
while(p[i]!='\0')
{
WrDatLCD(p[i]);
i++;
delay_ms(5);
if(y+i==16) {x=x^0x01;LCD1602pos(x,0);}//x=x^0x01;//如果第1行写完换行到第2行,如果第2行写完换行到第1行
}
}
void LCD1602_disch(u8 ch,u8 x,u8 y)//显示一个英文字符
{
LCD1602pos(x,y);
WrDatLCD(ch);
delay_ms(5);
}
void LCD1602_clear(void)//1602清屏函数
{
WrComLCD(0x01); // 清屏
}
void LCD1602_backspace(void)//向左删除一个字符
{
WrComLCD(0x10);//光标左移
WrDatLCD(' ');//输出空格
WrComLCD(0x10);//光标左移
}
压强传感器bmp0851代码实现:
#include
sbit SCL=P1^0; //IIC时钟引脚定义
sbit SDA=P1^1; //IIC数据引脚定义
#define BMP085_SlaveAddress 0xee //定义器件在IIC总线中的从地址
#define OSS 0 // Oversampling Setting (note: code is not set up to use other OSS values)
typedef u8 BYTE;
typedef unsigned short WORD;
//int dis_data; //变量
short ac1;
short ac2;
short ac3;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1;
short b2;
short mb;
short mc;
short md;
/*
void delay(unsigned int k);
void conversion(long temp_data);
void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data); //单个写入数据
uchar Single_Read(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read(uchar,uchar); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BMP085_Start();
void BMP085_Stop();
void BMP085_SendACK(bit ack);
bit BMP085_RecvACK();
void BMP085_SendByte(BYTE dat);
BYTE BMP085_RecvByte();
void BMP085_ReadPage();
void BMP085_WritePage(); */
//-----------------------------------
//*********************************************************
/*******************************/
void delay(u16 k)
{
u16 i,j;
for(i=0;i> 15;
x2 = ((long) mc << 11) / (x1 + md);
b5 = x1 + x2;
temperature = ((b5 + 8) >> 4);
b6 = b5 - 4000;
// Calculate B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;
// Calculate B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (u32)(x3 + 32768))>>15;
b7 = ((u32)(up - b3) * (50000>>OSS));
if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
pressure = p+((x1 + x2 + 3791)>>4);
return pressure;
}
温度传感器DHT11代码段:
#include
sbit Data=P0^0; //dht11数据线
void delay_us(u8 n)//微秒延时
{
while(--n);
}
void DHT11_start()//启动
{
Data=1;
delay_us(2);
Data=0;
delay_ms(20); //延时18ms以上
Data=1;
delay_us(30);
}
u8 DHT11_rec_byte() //接收一个字节
{
u8 i,dat=0;
for(i=0;i<8;i++) //从高到低依次接收8位数据
{
while(!Data); ////等待50us低电平过去
delay_us(8); //延时60us,如果还为高则数据为1,否则为0
dat<<=1; //移位使正确接收8位数据,数据为0时直接移位
if(Data==1) //数据为1时,使dat加1来接收数据1
dat+=1;
while(Data); //等待数据线拉低
}
return dat;
}
void DHT11_receive(u8 rec_dat[]) //接收40位的数据
{
u8 R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
DHT11_start();
if(Data==0)
{
while(Data==0); //等待拉高
delay_us(40); //拉高后延时80us
R_H=DHT11_rec_byte(); //接收湿度高八位
R_L=DHT11_rec_byte(); //接收湿度低八位
T_H=DHT11_rec_byte(); //接收温度高八位
T_L=DHT11_rec_byte(); //接收温度低八位
revise=DHT11_rec_byte(); //接收校正位
delay_us(25); //结束
if((R_H+R_L+T_H+T_L)==revise) //校正
{
RH=R_H;
RL=R_L;
TH=T_H;
TL=T_L;
}
/*数据处理,方便显示*/
rec_dat[0]='R';
rec_dat[1]='0'+(RH/10);
rec_dat[2]='0'+(RH%10);
rec_dat[3]=' ';
rec_dat[4]='C';
rec_dat[5]='0'+(TH/10);
rec_dat[6]='0'+(TH%10);
}
}
Main函数实现:
#include
//#include
//#include
#include
#include <1602.h>
#include
//#include
u8 print[9];//缓冲区
u8 print1[8];//缓冲区
u8 value[8];//缓冲区
//-------------------------------
u8 cal[7]={0};//pm2.5传感器数据存储
//cal[0]:起始位 0xAA
//cal[1]:Vout(H)
//cal[2]:Vout(L)
//cal[3]:Vref(H)
//cal[4]:Vref(L)
//cal[5]:检验位
//cal[6]:结束位 0xFF
u8 buf;
u8 sum;
int i=0;
float Vo;
u16 k;
long pressure;
//----------------------------------
void delay_ms(int x)//毫秒延时函数
{int i,j;
for(i=0;i
四、效果实现总结
思路是通过使用压强、sht11温度传感器、以及PM2.5传感器来监测环境中各项指标,通过传感器收集各类数据,发送给单片机实现了小型气象站的效果,学习传感器之路刚刚起步,还有很多不足,发布此文章仅希望广大码友互相学习。
附上本人在大学学习期间所有学习实现的demo,这些项目的实现都通过本人亲自测试运行,也是自己学习中知识的一点一点积累,整理不易,希望能帮到大家,不足之处大家多多交流。
QQ:1805523903
昵称:忘尘
世界不同角落共同努力,变成更优秀的我们。
1.51单片机学习整理
基于51单片机的智能光控路灯 :https://download.csdn.net/download/qq_37037348/11071869
基于51单片机超声波测距(内含源程序,原理图及PCB源文件):https://download.csdn.net/download/qq_37037348/11071866
基于51单片机的智能安防报警系统:https://download.csdn.net/download/qq_37037348/11071865
基于51单片机模块化编程模块 (红外、液晶显示屏、温湿度等传感器模块化)
:https://download.csdn.net/download/qq_37037348/11053222
基于51单片机pwm控制的呼吸灯程序
https://download.csdn.net/download/qq_37037348/11053195
51单片机与上位机串口通信实例包含详细讲解的完整代码
https://download.csdn.net/download/qq_37037348/11053164
基于51单片机的直交流电压表仿真 (详细代码实现,设计讲解)
https://download.csdn.net/download/qq_37037348/11053145
基于51单片机胸牌 详细代码实现,设计讲解)
https://download.csdn.net/download/qq_37037348/11053125
基于51单片机3x4按键拨号 (详细代码实现,设计讲解)
https://download.csdn.net/download/qq_37037348/11053093
基于51单片机拨号 (详细代码实现,设计讲解)
https://download.csdn.net/download/qq_37037348/11053090
基于51单片机警灯系统设计(详细代码实现,设计讲解)
https://download.csdn.net/download/qq_37037348/11053086
基于51单片机点亮一个小灯(详细代码实现,设计讲解,学习51基础实验)
https://download.csdn.net/download/qq_37037348/11053084
基于51单片机开发的排球计时器,附有详细注释讲解,为大家提供最真心的帮助
https://download.csdn.net/download/qq_37037348/11053024
基于51单片机的音乐播放器,源码详细注释
https://download.csdn.net/download/qq_37037348/11053022
2.Android 开发学习整理:
Android-serialport 手机App串口通信代码实现:
https://download.csdn.net/download/qq_37037348/11050521
Android-serialport 手机App网络通信实例代码实现:
https://download.csdn.net/download/qq_37037348/11050516
Android 第一个App详细教程、基础实验 :
https://download.csdn.net/download/qq_37037348/11050515
3.计算机视觉(深度学习、神经网络的学习)
feature extraction(深度学习,特征提取,神经网络:https://download.csdn.net/download/qq_37037348/11065968
feature extraction(深度学习,特征提取,神经网络多种训练模型详细实现):
https://download.csdn.net/download/qq_37037348/11065974
欢迎大家加入学习项目交流,为大家分享各类个人学习项目及学习资料,互相交流互相学习。
问题咨询及项目源码下载请加群:
群名:IT项目交流群
群号:245022761