基于AT89C51单片机的小型气象站

目录

 小型气象站

问题咨询及项目源码下载请加群:

群名:IT项目交流群

群号:245022761

 

 

一、实验目的

1. 了解温湿度传感器工作原理

2. 了解大气压力传感器工作原理

3. 了解激光颗粒物传感器工作原理

4. 学会使用SHT11温湿度传感器检测环境温湿度

5. 学会使用BMP085气压传感器检测大气压力

6. 学会使用激光颗粒物传感器检测空气质量

7. 会使用1602液晶显示模块显示气象参数

二、系统连接图

 

 

基于AT89C51单片机的小型气象站_第1张图片

三、代码实现部分

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

邮箱:[email protected]

昵称:忘尘

 

世界不同角落共同努力,变成更优秀的我们。

 

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

 

你可能感兴趣的:(基于AT89C51单片机的小型气象站)