久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1331|回復: 0
打印 上一主題 下一主題
收起左側

這是我這幾天用51單片機做的溫濕計 在附件配套代碼和仿真電路圖

[復制鏈接]
跳轉到指定樓層
樓主
其中用到的元器件有at89c52,dht11,18b20,1602,三極管,蜂鳴器
我讓dht11的濕度和18b20的濕度在1602顯示屏上顯示
第一行是dht11的濕度
第二行是18b20的溫度
因為dht11溫度不敏感,所以沒有使用
并且在程序中我讓溫度超過50度或者濕度達到50%時蜂鳴器會發出聲響,恢復正常值時,停止發出聲響.



代碼如下
#include"reg51.h"
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char  U8;

sbit DQ=P1^6;        //溫度數據口   DS18B20
sbit dian=P2^6;                                //繼電器

sbit dht11=P3^3;
sbit lcden=P1^1;
sbit lcdrs=P1^3;
sbit lcdrw=P1^2;
sbit beep=P3^5;



U8 FLAG,temp3,comdata;
U8 T_H,T_L,RH_H,RH_L,jiaoyan;
U8 T_H_temp,T_L_temp,RH_H_temp,RH_L_temp,jiaoyan_temp;
U8 wendu,shidu;
U8 wendu_shi,wendu_ge,shidu_shi,shidu_ge,wendu_dian,wendu_q;
uchar code table2[]=" HUMI=   %";
uchar code table1[]="TEMP=   C";


unsigned int  temp,temp1,temp2, xs,num,att,flag2,attt,setup=30,mode=0,setup1=0,setup2=0,MM,NN,BB;

/******延時程序*******/
void delay1(unsigned int m)
    {
      unsigned int i,j;
      for(i=m;i>0;i--)
       for(j=110;j>0;j--);

         }
void Delay2(uint j)
{      
        U8 i;
        for(;j>0;j--)
        {         
                for(i=0;i<27;i++);
        }
}


void  Delay_10us(void)
{
        U8 i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}



void delay(unsigned int m)     //溫度延時程序
    {
      while(m--);
         }

void Init_DS18B20()  
{
unsigned char x=0;
DQ = 1;          //DQ復位 ds18b20通信端口
delay(8); //稍做延時
DQ = 0;          //單片機將DQ拉低
delay(80); //精確延時 大于 480us
DQ = 1;          //拉高總線   
delay(4);
x=DQ;            //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay(20);
}




/***********ds18b20讀一個字節**************/
uchar ReadOneChar()
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
    DQ = 0; // 高電平拉成低電平時讀周期開始
    dat>>=1;
    DQ = 1; // 給脈沖信號
    if(DQ)
    dat|=0x80;   //
    delay(4);
}
   return(dat);
}





void write_com(uchar com)
{           

        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
void lcd_init()
{  
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
        
write_com(0x80);
                for(att=0;att<10;att++)
        {
                write_data(table2[att]);
                delay(10);
        }

        write_com(0x80+0x40);
        for(num=0;num<9;num++)
        {
                write_data(table1[num]);
                delay(10);
        }
}
void write_sfm1(unsigned char add,unsigned char date)
{
  write_com(0x80+0x40+add);
  write_data(0x30+date);
//  write_data(0x30+ge);

}
void write_sfm(unsigned char add,unsigned char date)
{
  write_com(0x80+add);
  write_data(0x30+date);
//  write_data(0x30+ge);

}
/*************ds18b20寫一個字節****************/
void WriteOneChar(unsigned char dat)
{
   unsigned char i=0;
   for (i=8; i>0; i--)
   {
   DQ = 0; //從高電平拉至低電平時,寫周期的開始
    DQ = dat&0x01;   //數據的最低位先寫入
    delay(5); //60us到120us延時
    DQ = 1;        
    dat>>=1; //從最低位到最高位傳入
}
}



/**************讀取ds18b20當前溫度************/
void ReadTemperature()
  {
    unsigned char a=0;
    unsigned  b=0;
    unsigned  t=0;

    Init_DS18B20();
    WriteOneChar(0xCC);    // 跳過讀序號列號的操作/
    WriteOneChar(0x44); // 啟動溫度轉換
    delay(5);       // this message is wery important
    Init_DS18B20();
    WriteOneChar(0xCC); //跳過讀序號列號的操作
    WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度/
    delay(5);
    a=ReadOneChar();    //讀取溫度值低位  /
    b=ReadOneChar();      //讀取溫度值高位    /
    temp1=b<<4;            //高8位中后三位數的值
    temp1+=(a&0xf0)>>4;      //低8位中的高4位值加上高8位中后三位數的值   temp1室溫整數值
    temp2=a&0x0f;             //小數的值
    temp=((b*256+a)>>4);    //當前采集溫度值除16得 實際溫度值    zhenshu   
    xs=temp2*0.0625*10; //小數位,若為0.5則算為5來顯示   xs小數    xiaoshu
   }







/*******************  DHT11函數區  **********************************/

void  COM(void)
{
        uint i;
        for(i=0;i<8;i++)           
        {
                FLAG=2;        
                while((!dht11)&&FLAG++);
                Delay_10us();
                Delay_10us();
                Delay_10us();
                temp3=0;
                if(dht11)temp3=1;
                FLAG=2;
                while((dht11)&&FLAG++);                        
                //超時則跳出for循環                  
                if(FLAG==1)break;
                //判斷數據位是0還是1         
                // 如果高電平高過預定0高電平值則數據位為 1
                comdata<<=1;
                comdata|=temp3;
        }           
}

void RH(void)
        {
          //主機拉低18ms
       dht11=0;
           Delay2(180);
           dht11=1;
         //總線由上拉電阻拉高 主機延時20us
           Delay_10us();
           Delay_10us();
           Delay_10us();
           Delay_10us();
         //主機設為輸入 判斷從機響應信號
           dht11=1;
         //判斷從機是否有低電平響應信號 如不響應則跳出,響應則向下運行         
           if(!dht11)               
           {
           FLAG=2;
         //判斷從機是否發出 80us 的低電平響應信號是否結束         
           while((!dht11)&&FLAG++);
           FLAG=2;
         //判斷從機是否發出 80us 的高電平,如發出則進入數據接收狀態
           while((dht11)&&FLAG++);
         //數據接收狀態                 
           COM();
           RH_H_temp=comdata;
           COM();
           RH_L_temp=comdata;
           COM();
           T_H_temp=comdata;
           COM();
           T_L_temp=comdata;
           COM();
           jiaoyan_temp=comdata;
           dht11=1;
         //數據校驗
         
      temp3=(T_H_temp+T_L_temp+RH_H_temp+RH_L_temp);
           if(temp3==jiaoyan_temp)
           {
                     RH_H=RH_H_temp;
                     RH_L=RH_L_temp;
              T_H=T_H_temp;
                     T_L=T_L_temp;
                     jiaoyan=jiaoyan_temp;
           }
           }

        }
void wenshidu()
{
         RH();
           shidu=RH_H+RH_L/1000;
           wendu=(T_H+T_L)*10;
           shidu_shi=shidu%100/10;
           shidu_ge=shidu%10;
           wendu_shi=wendu%1000/100;
           wendu_ge=wendu%1000%100/10;
           wendu_dian=wendu%1000%100%10;
}
void main(void)
{
                          lcd_init();
                        while(1)   {

                                 
                                   wenshidu();
                              write_sfm1(6,temp/10);
                                          write_sfm1(7,temp%10);
                                         
                                
                                   write_sfm(6,shidu_shi);
                                         write_sfm(7,shidu_ge);
                                       

                                                ReadTemperature();
                                if(shidu>0x32)
               beep=0;
         else
               beep=1;
                                 
                                 if(temp>0X32)
                                         beep=0;
         else
               beep=1;
                        }


}

仿真圖.7z

19.83 KB, 下載次數: 2, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中国黄色在线视频 | 在线观看精品视频网站 | 精品久久久久久久 | 精品欧美一区二区精品久久久 | 久久tv在线观看 | 91精品国模一区二区三区 | 精品国产欧美一区二区三区不卡 | 国产精品久久久久久久久久久久冷 | 91欧美精品成人综合在线观看 | 日本一区二区三区视频在线 | 亚洲免费在线 | 99精品国自产在线 | 在线播放国产一区二区三区 | 国产高清在线精品一区二区三区 | 国产精品成av人在线视午夜片 | 欧美一区二区三区视频 | 国产在线一区二区 | 蜜桃在线视频 | 国产一区免费视频 | 黄在线免费观看 | 亚洲精品黄 | 国产精品一区二区av | 成人网av | 日韩中文字幕在线视频 | 精品国产欧美一区二区三区成人 | 91视在线国内在线播放酒店 | 99热精品在线 | 国产精品视频久久 | 精品视频一区二区三区在线观看 | www.日本精品 | 一区二区三区视频在线观看 | 久久精品99国产精品 | 天天干免费视频 | 伊人国产精品 | 国产精品免费在线 | 日韩在线精品 | 日韩一区二区三区在线 | 色999视频 | 欧美激情区 | 91久久久久久久久 | 国产精品69毛片高清亚洲 |