国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

jkm99的個人空間 http://www.qingdxww.cn/space-uid-71395.html [收藏] [復制] [RSS]

博客

溫濕度傳感器DHT11

已有 2189 次閱讀2013-6-8 19:56 |個人分類:單片機| DHT11

/********************DHT11.h********************/
#ifndef DHT11_H
#define DHT11_H
#include <reg52.h>
#include "common.h"
//溫濕度傳感器DHT11數據接口
sbit DHT11Dout = P2^0;
uchar DHT11ReceiveByte(void);
void DHT11ReadData(void);
#endif
 
/********************DHT11.c********************/
#include "DHT11.h"
#include "system.h"
/*uchar DHT11Data[6]
用來保存當前的溫度、濕度
[0:1]濕度整數部分  
[2]濕度小數部分           
[3:4]溫度整數部分            
[5]溫度小數部分
*/
uchar DHT11Data[6]={0, 0, 0, 0, 0, 0}; 
static void delay_25ms(void)   //誤差 0us
{
    unsigned char a,b,c;
    for(c=7;c>0;c--)
        for(b=16;b>0;b--)
            for(a=110;a>0;a--);
}
static void delay_30us(void)   //誤差 0us
{
    unsigned char a,b;
    for(b=3;b>0;b--)
        for(a=3;a>0;a--);
}
uchar DHT11ReceiveByte(void)
{
 uchar i;
 uchar com_data, temp;
        
 for(i=0; i<=7; i++)
 {
  while(!DHT11Dout);
  delay_30us();
  temp = 0;
  if(DHT11Dout){temp = 1;}   
  while(DHT11Dout);  
  com_data <<= 1;                 
  com_data |= temp; 
 }           
 return com_data; 
}
void DHT11ReadData(void)
{  
 uint untemp=0;
 uint TH_data=0, TL_data=0, RH_data=0, RL_data=0, CK_data=0; 
 uint TH_temp=0, TL_temp=0, RH_temp=0, RL_temp=0, CK_temp=0; 
 
 while(1){
  //主機拉低必須大于18ms    
  DHT11Dout = 0;
  delay_25ms();
  DHT11Dout = 1;
  //DATA總線由上拉電阻拉高主機延時30us          
  delay_30us();                   
  //判斷DHT11是否有低電平響應信號如不響應則跳出,響應則向下運行              
  if(!DHT11Dout){
   //判斷DHT11發出 80us 的低電平響應信號是否結束 
   while(!DHT11Dout);
   //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態                  
   while(DHT11Dout); 
   //數據接收狀態                    
   
   RH_temp = DHT11ReceiveByte(); //8bit溫度整數數據                
   RL_temp = DHT11ReceiveByte(); //8bit溫度小數數據
   TH_temp = DHT11ReceiveByte(); //8bit濕度整數數據
   TL_temp = DHT11ReceiveByte(); //8bit濕度小數數據
   CK_temp = DHT11ReceiveByte(); //8bit校驗位
   delay_30us();
   delay_30us();
   DHT11Dout = 1;  
   //數據校驗                  
   untemp = RH_temp + RL_temp + TH_temp + TL_temp;                 
   if(untemp==CK_temp){
    RH_data = RH_temp;
    RL_data = RL_temp;
    TH_data = TH_temp;
    TL_data = TL_temp;
    CK_data = CK_temp;
    break;//跳出while循環
   }
  } 
 }  
 //濕度整數部分 
 DHT11Data[0] = RH_data/10;           
 DHT11Data[1] = RH_data%10;  
 //濕度小數部分 不做處理          
 DHT11Data[2] = RL_data ;//轉為小數時除以256即可
 //溫度整數部分           
 DHT11Data[3] = TH_data/10;         
 DHT11Data[4] = TH_data%10;   
 //溫度小數部分  不做處理           
 DHT11Data[5] = TL_data; //轉為小數時除以256即可
}
 
/*************************system.h*****************************/
#ifndef SYSTEM_H
#define SYSTEM_H
#include "common.h"
//蜂鳴器、LED報警接口
sbit AlarmBuzzer = P2^4; //響:聲報警
sbit LED4 = P3^5;   //亮:光報警
//工作情況指示燈:
sbit LED3 = P3^6; //亮:啟動制冷
sbit LED2 = P3^7; //亮:啟動抽濕

void SystemInit(void);
void SystemControl(void);
void SystemSet(void);
void SystemInformationDisplay(void);
#endif
/***********************system.c************************/
#include "system.h"
#include "lcd1602.h"
#include "DHT11.h"
#include "key.h"
#include "eeprom.h"
uchar TemperatureLimit = 32; //溫度上限值
uchar GlobeTemperature = 30;//要設置的溫度
uchar TemperatureMin = 6; //溫度值下限值
uchar HumidityLimit = 80;  //濕度上限值
uchar GlobeHumidity = 66; //要設置的濕度
uchar HumidityMin = 10;  //濕度下限值
uchar SYSTEM_FLAGS = 0; //如果系統不是第一次啟動過,則設置為1,否為0
uchar flg = 0;//按鍵控制
extern uchar DHT11Data[6];
//系統初始化
void SystemInit(void)
{
 uchar *Project = "Granary Control";
 uchar *Designer = "Designer: HongDe";
 
 AlarmBuzzer = 1;
 LED4 = 0;
 LED3 = 0;
 LED2 = 0;
 
 LcdInit();  //初始化LCD   
 DelayMs(10);
 LcdSetPosition(1); //設置顯示位置
 while(*Project != '\0'){//在LCD1602第1行顯示“Granary Control”
  LcdWriteData(*Project);
  Project++;
 }
 LcdSetPosition(0x40); //設置顯示位置
 while(*Designer != '\0'){//在LCD1602第1行顯示“Granary Control”
  LcdWriteData(*Designer);
  Designer++;
 }
 SYSTEM_FLAGS = eepromReadByte(0x2016);//從第一扇區讀系統啟動參數
 if(SYSTEM_FLAGS==1){//如果系統不是第一次啟動過,則讀取先前存儲的參數值
  GlobeTemperature = eepromReadByte(0x2000);//讀取存放在eeprom中的溫度節點值
  TemperatureLimit = eepromReadByte(0x2004); //讀取存放在eeprom中的溫度安全節點值
  GlobeHumidity = eepromReadByte(0x2008); //讀取存放在eeprom中的濕度節點值
  HumidityLimit = eepromReadByte(0x2012); //讀取存放在eeprom中的濕度安全節點值
 }
}

void SystemControl(void)
{
 uchar temp=0;
 uchar rh=0;
 
 DHT11ReadData();//獲取溫度、濕度
 temp = DHT11Data[3]*10 + DHT11Data[4]; //溫度整數部分
 rh = DHT11Data[0]*10 + DHT11Data[1];//濕度整數部分,小數部分未處理
 if((rh>HumidityLimit)||(temp>TemperatureLimit)){//當前溫度高于安全點溫度或者當前濕度高于安全點濕度
  while(1){
   //更新當前環境溫度
   DHT11ReadData();//獲取溫度、濕度
   rh= DHT11Data[0]*10 + DHT11Data[1];//濕度整數部分,小數部分未處理
   temp = DHT11Data[3]*10+DHT11Data[4];
   
   if(temp>TemperatureLimit)LED3 = 1; //啟動制冷 
   if(rh>HumidityLimit)LED2 = 1; //啟動抽濕
   LED4 = ~LED4; //燈亮閃爍報警
   AlarmBuzzer = ~AlarmBuzzer; //蜂鳴器鳴叫
   DelayMs(5);
   
   if((temp<TemperatureLimit)&&(temp<GlobeTemperature)){LED3 = 0; LED4 = 0; AlarmBuzzer = 1;}//停止制冷
   if((rh<HumidityLimit)&&(rh<GlobeHumidity)){LED2 = 0; LED4 = 0; AlarmBuzzer = 1;}//停止抽濕
   if((rh<HumidityLimit)&&(temp<TemperatureLimit)){LED4 = 0; break;}//停止報警
   SystemSet();//設置
   SystemInformationDisplay();//溫濕度顯示
  }
 }
 if(temp>GlobeTemperature){
  LED3 = 1; //啟動制冷
 }else{LED3 = 0;}//關閉制冷
 
 if(rh>GlobeHumidity){
  LED2 = 1; //啟動抽濕
 }else{LED2 = 0;}//停止抽濕
 AlarmBuzzer = 1;
}

void SystemSet(void)
{
 uchar key;
 uchar eepromFlags = 0;
 
 key = ScanKey();
 if(key==SW2){//按下按鍵SW2
  flg++;
  if(flg==5){flg = 1;}
 }
 switch(flg){
  case 1:{//溫度節點調節(即溫度節點)
   if(key==SW1){ --GlobeTemperature; eepromFlags = 1;}//減操作
   if(key==SW3){ ++GlobeTemperature; eepromFlags = 1;}//加操作
   
   if(GlobeTemperature==TemperatureMin-1)GlobeTemperature = TemperatureLimit;
   if(GlobeTemperature==TemperatureLimit+1)GlobeTemperature = TemperatureMin;
   break;
  }
  
  case 2:{//溫度安全節點調節
   if(key==SW1){ --TemperatureLimit; eepromFlags = 1;}//減操作
   if(key==SW3){ ++TemperatureLimit; eepromFlags = 1;}//加操作
   break;
  }
  case 3:{//濕度節點調節
   if(key==SW1){ --GlobeHumidity; eepromFlags = 1;}//減操作
   if(key==SW3){ ++GlobeHumidity; eepromFlags = 1;}//加操作
   
   if(GlobeHumidity==HumidityMin-1)GlobeHumidity = HumidityLimit;
   if(GlobeHumidity==HumidityLimit+1)GlobeHumidity = HumidityMin;
   break;
  }
  case 4:{ //濕度安全節點調節
   if(key==SW1){--HumidityLimit; eepromFlags = 1;}//減操作
   if(key==SW3){++HumidityLimit; eepromFlags = 1;}//加操作
   break;
  }
  default: eepromFlags = 0; break;
 }
 if(eepromFlags){//系統工作參數有變動,參數存eeprom
  eepromErase(0x2000);//擦除第一個扇區
  eepromWriteByte(0x2000, GlobeTemperature);//存放溫度節點值
  eepromWriteByte(0x2004, TemperatureLimit); //存放溫度安全節點值
  eepromWriteByte(0x2008, GlobeHumidity); //存放濕度節點值
  eepromWriteByte(0x2012, HumidityLimit); //存放濕度安全節點值
  SYSTEM_FLAGS = 1;
  eepromWriteByte(0x2016, SYSTEM_FLAGS); //存放系統啟動過的標志
 }
}
//顯示溫濕度信息
//顯示設置的溫濕度值,和當前環境的溫濕度值
void SystemInformationDisplay(void)
{
 char *TempStr = "t/tS/TH:";
 char *RHStr = "r/rS/RH:";
 uchar i=0;
 
 LCDClear();
 LcdSetPosition(0x40); //設置濕度顯示在中間位置,第2行
 while(*RHStr != '\0'){
  LcdWriteData(*RHStr);
  RHStr++;
 }
 LcdWriteData(DHT11Data[0]+'0');
 LcdWriteData(DHT11Data[1]+'0');
 LcdWriteData('/');
 LcdWriteData(GlobeHumidity/10+'0');
 LcdWriteData(GlobeHumidity%10+'0');
 LcdWriteData('/');
 LcdWriteData(HumidityLimit/10+'0');
 LcdWriteData(HumidityLimit%10+'0');
 LcdSetPosition(0x00); //設置溫度顯示在中間位置,第1行
 while(*TempStr != '\0'){
  LcdWriteData(*TempStr);
  TempStr++;
 }
 LcdWriteData(DHT11Data[3]+'0');
 LcdWriteData(DHT11Data[4]+'0');
 LcdWriteData('/');
 LcdWriteData(GlobeTemperature/10+'0');
 LcdWriteData(GlobeTemperature%10+'0');
 LcdWriteData('/');
 LcdWriteData(TemperatureLimit/10+'0');
 LcdWriteData(TemperatureLimit%10+'0');
}
 

路過

雞蛋

鮮花

握手

雷人

評論 (0 個評論)

facelist

您需要登錄后才可以評論 登錄 | 立即注冊

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
返回頂部
主站蜘蛛池模板: 欧美成人黄色片 | 在线观看国产免费高清不卡 | 高h全肉动漫在线观看免费 高h大街上羞耻露出调教 | 草逼的视频 | 97公开免费视频 | 国农村精品国产自线拍 | 成人免费一级毛片在线播放视频 | 亚洲大逼 | 在线观看视频一区二区 | 99热这里有免费国内精品 | 91资源在线观看 | 99视频精品全部在线播放 | 欧美肥| 国产亚洲精品97在线观看 | 日本久久精品 | 一区在线看 | 欧美大片无尺码在线观看 | 三级网址在线播放 | 黄片毛片免费观看 | 亚洲一区二区影视 | 中文字幕精品一区二区三区在线 | 老司机aⅴ在线精品导航 | 最近最新的日本免费 | 欧美精品 在线观看 | 人与动性欧美 | 精品久久久久久免费影院 | 久久这里只有精品久久 | 久久青春| 国产成人免费 | 麻豆入口视频在线观看 | 午夜资源网 | 99精品在免费线视频 | 午夜 dy888理论久久 | 美女国内精品自产拍在线播放 | 男人天堂2023| 国产三级网站 | 成人观看的视频三级 | 91精品国产免费网站 | 国产精品玖玖玖在线观看 | 中文字幕亚洲色图 | 亚洲逼院|