• 大小: 24KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-06
  • 语言: 其他
  • 标签: DHT11  

资源简介

基于AT89S52的DHT11温湿度自动检测程序

资源截图

代码片段和文件信息

#include 
#include 
#include
#define  uchar unsigned char
#define  uint  unsigned int
sbit ds=P2^2;     //温度传感器信号线
sbit lcden=P1^6;
sbit rs=P1^0;
sbit wr=P1^5;
uint temp;
float f_temp;
void delay(uint z)//延时函数
{
uint xy;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void dsreset(void)    //18B20复位,初始化函数
{
  uint i;
  ds=0;
  i=103;
  while(i>0)i--;
  ds=1;
  i=4;
  while(i>0)i--;
}

bit tempreadbit(void)   //读1位函数
{
   uint i;
   bit dat;
   ds=0;i++;          //i++ 起延时作用
   ds=1;i++;i++;
   dat=ds;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tempread(void)   //读1个字节
{
  uchar ijdat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tempreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tempwritebyte(uchar dat)   //向18B20写一个字节数据
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //写 1
    {
      ds=0;
      i++;i++;
      ds=1;
      i=8;while(i>0)i--;
    }
    else
    {
      ds=0;       //写 0
      i=8;while(i>0)i--;
      ds=1;
      i++;i++;
    }

  }
}

void tempchange(void)  //DS18B20 开始获取温度并转换
{
  dsreset();
  delay(1);
  tempwritebyte(0xcc);  // 写跳过读ROM指令
  tempwritebyte(0x44);  // 写温度转换指令
}

uint get_temp()         //读取寄存器中存储的温度数据
{
  uchar ab;

  dsreset();
  delay(1);
  tempwritebyte(0xcc);
  tempwritebyte(0xbe);
  a=tempread();         //读低8位
  b=tempread();         //读高8位
  temp=b;
  temp<<=8;            //两个字节组合为1个字
  temp=temp|a;
  f_temp=temp*0.0625;      //温度在寄存器中为12位 分辨率位0.0625°
  temp=f_temp*10+0.5;    //乘以10表示小数点后面只取1位,加0.5是四舍五入
  f_temp=f_temp+0.05; 
  return temp;         //temp是整型
}
//液晶程序段
void delayms(unsigned int xms)
{
unsigned int ij;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}

void write_com(unsigned char com)//写命令
{
rs=0;
wr=0;
P0=com;
delayms(5);
lcden=0;
lcden=1;
delayms(10);
lcden=0;
}

void write_data(unsigned char dat)//写数据
{
rs=1;
wr=0;
P0=dat;
delayms(5);
lcden=0;
lcden=1;
delayms(10);
lcden=0;
}

void init_lcd()//液晶初始化
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}

void display(uint temp) //显示程序
{
uchar A1A2A2tA3ser;
ser=temp/10; //分离出三位要显示的数字
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
write_com(0x80+6);
write_data(0x30+A1);
write_data(0x30+A2);
write_data(‘.‘);
write_data(0x30+A3);

}

void main()
{
  init_lcd();
  while(1)
 {    
      tempchange();
  get_temp();
  display(temp);
 }
}

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2013-09-23 10:59  温湿度检测程序\
     文件       14114  2013-03-18 09:08  温湿度检测程序\DHT11
     文件        2823  2013-04-02 21:36  温湿度检测程序\DHT11.c
     文件          42  2013-03-18 09:08  温湿度检测程序\DHT11.lnp
     文件       18249  2013-03-18 09:08  温湿度检测程序\DHT11.LST
     文件       19254  2013-03-18 09:08  温湿度检测程序\DHT11.M51
     文件       16547  2013-03-18 09:08  温湿度检测程序\DHT11.OBJ
     文件        1158  2013-03-18 09:09  温湿度检测程序\DHT11.Opt
     文件         442  2013-03-18 09:09  温湿度检测程序\DHT11.plg
     文件        2104  2013-03-18 09:07  温湿度检测程序\DHT11.Uv2
     文件        1158  2013-03-18 09:07  温湿度检测程序\DHT11_Opt.Bak
     文件        2104  2013-03-16 15:51  温湿度检测程序\DHT11_Uv2.Bak

评论

共有 条评论