<pre name="code" class="vb"><pre name="code" class="objc"><pre name="code" class="csharp"><h3 style="padding: 0px; margin: 0px 0px 2px; font-size: 10pt; font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun;"><pre name="code" class="cpp"><span style="font-weight: normal;"><span style="font-family: 'Microsoft YaHei', Verdana, sans-serif, SimSun; font-size: 14px;">//可以用来测量环境温湿度,当超过一定温度后会自动报警。</span>

#include <AT89X52.h>
#include <intrins.h>
<span style="color:#009900;">//#include"1602.h"
//#include<dh11.h></span>
unsigned char temp[]    ="SET H:00% T:   C\0";  //设置 的湿度值显示
unsigned char temp_s[]  ="RH:00% TEMP:00  \0";  //实时湿度显示
<span style="color:#009900;">//DHT11
//传感器接受和发送信息,然后将接收来的信息作出相应的判断和处理,然后反馈到显示器。
 
//----------------------------------------------//
//----------------IO口定义区--------------------//
//----------------------------------------------//</span>
sbit  DQ    = P3^7 ; 
<span style="color:#009900;">//----------------LCD1602-----------------------//</span>
sbit LcdRs  = P2^4;
sbit LcdRw  = P2^5;
sbit LcdEn  = P2^6;
<span style="color:#009900;">//sfr  DBPort   = 0x80;    //端口定义,LcdRs就代表P1^0口,以下同.
//----------------------------------------------//
//----------------定义区--------------------//
//----------------------------------------------//</span>
unsigned char  FLAG,k;
unsigned char  tempre;
unsigned char  T_data_H,T_data_L,RH_data_H,RH_data_L,checkdata;
unsigned char  T_data_H_temp,T_data_L_temp,RH_data_H_temp,RH_data_L_temp,checkdata_temp;
unsigned char  comdata;
unsigned char  outdata[5];  //定义发送的字节数     
unsigned char  indata[5];
unsigned int   temp1,temp2;
<span style="color:#009900;">//以上为变量的定义.</span>
sbit sw3=P3^4; //按键定义
sbit sw1=P3^2;
sbit sw2=P3^3;
sbit baojing=P2^0;
<span style="color:#009900;">//sbit led=P3^5;</span>
unsigned char setn;                 //变量定义
unsigned char num1,num2;
unsigned char getdata=55;
unsigned char H_shangxian=80;       //湿度上限值  初值
unsigned char T_shangxian=35;       //温度上限值  初值
unsigned char temp_h,temp_t;
void key();
void kongzhi();
void delay(unsigned int);                   //延时程序
void LCD_Initial();                 //LCD1602初始化
 
<span style="color:#009900;">
//DHT11/
</span>
void  COM(void);
void Delay2(unsigned int j)  //延时函数
{      
    unsigned char i;
    for(;j>0;j--)
    {   
        for(i=0;i<27;i++);
    }
}
 
void  Delay_10us(void)  //延时10us的延时函数.
{
    unsigned char i;
    i--;
    i--;
    i--;
    i--;  
    i--;
    i--;
}
 
void  COM(void)
{
    unsigned char i;
    for(i=0;i<8;i++)    
    {
        FLAG=2; 
        while((!DQ)&&FLAG++);
        Delay_10us();
        Delay_10us();
        Delay_10us();
        tempre=0;
        if(DQ)tempre=1;
        FLAG=2;
        while((DQ)&&FLAG++);
        //超时则跳出for循环          
        if(FLAG==1)break;
        //判断数据位是0还是1     
        // 如果高电平高过预定0高电平值则数据位为 1 
        comdata<<=1;  //左移1位
        comdata|=tempre;        //comdata与tempre相或,结果保存在comdata中.
    }
}
<span style="color:#009900;">//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
 
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM(); 
//--------------------------------</span>
void RH(void)
{
    <span style="color:#009900;">//主机拉低18ms </span>
    DQ=0;
    Delay2(180);
    DQ=1;
   <span style="color:#009900;"> //总线由上拉电阻拉高 主机延时20us</span>
    Delay_10us();
    Delay_10us();
    Delay_10us();
    Delay_10us();
   <span style="color:#009900;"> //主机设为输入 判断从机响应信号</span> 
    DQ=1;
    <span style="color:#009900;">//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行 </span>     
    if(!DQ)      <span style="color:#009900;">//T !   </span> 
    {
        FLAG=2;
<span style="color:#009900;">        //判断从机是否发出 80us 的低电平响应信号是否结束     
</span>        while((!DQ)&&FLAG++);
        FLAG=2;
<span style="color:#009900;">        //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
</span>        while((DQ)&&FLAG++);
<span style="color:#009900;">        //数据接收状态         
</span>        COM();    //调用COM函数
        RH_data_H_temp=comdata; 
        COM();      
        RH_data_L_temp=comdata;
        COM();
        T_data_H_temp=comdata;
        COM();
        T_data_L_temp=comdata;
        COM();
        checkdata_temp=comdata;
        DQ=1;
<span style="color:#009900;">        //数据校验 
</span>        tempre=(T_data_H_temp+T_data_L_temp+RH_data_H_temp+RH_data_L_temp);
        if(tempre==checkdata_temp)
        {
            RH_data_H=RH_data_H_temp;
            RH_data_L=RH_data_L_temp;
            T_data_H=T_data_H_temp;
            T_data_L=T_data_L_temp;
            checkdata=checkdata_temp;
        }<span style="color:#009900;">//对数据作出相应的处理与运算.</span>
    }
}
 
 
 
<span style="color:#009900;">LCD1602
//1602将接受来的信息进过字符转换,反馈到了液晶屏上面///
//同时我们可以根据需要加减所学要的预设湿度值。/
///</span>
void delay(unsigned int z)  //延时函数
{
   unsigned int a,b;
   for(a=z;a>0;a--)
     for(b=120;b>0;b--);
}
 
 
<span style="color:#009900;">//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
</span>void LCD_Wait(void)   //内部等待函数,LCD的显示需要一定的延迟时间.
{
    LcdRs=0;
    LcdRw=1;    _nop_();
    LcdEn=1;    _nop_();                     
    LcdEn=0;
<span style="color:#009900;">//  return DBPort;      
</span>}
 
<span style="color:#009900;">//向LCD写入命令或数据
</span>#define LCD_COMMAND  0      <span style="color:#009900;">// Command</span>
#define LCD_DATA     1      <span style="color:#009900;">// Data</span>
#define LCD_CLEAR_SCREEN    0x01      <span style="color:#009900;">// 清屏</span>
#define LCD_HOMING          0x02      <span style="color:#009900;">// 光标返回原点</span>
<span style="color:#009900;">//以上4行为宏定义,以后出现LCD_HOMING的地方就可以用0x02来代替.
</span>void LCD_Write(bit style, unsigned char input)  <span style="color:#009900;">//LCD写入子函数,形参为数据类型和无符号字符型输入.</span>
{
    LcdEn=0;
    LcdRs=style;   <span style="color:#009900;">//数据类型传递给LcdRS</span>
    LcdRw=0;        _nop_();
    P0=input;       _nop_();//写入的数据传递给DBPort
    LcdEn=1;        _nop_();//注意顺序
    LcdEn=0;        _nop_();
<span style="color:#009900;">//  LCD_Wait();   //调用内部等待函数.
</span>}
<span style="color:#009900;">//设置显示模式
//************************************************************</span>
 
#define LCD_SHOW            0x04    //显示开
#define LCD_HIDE            0x00    //显示关     
#define LCD_CURSOR          0x02    //显示光标
#define LCD_NO_CURSOR       0x00    //无光标            
#define LCD_FLASH           0x01    //光标闪动
#define LCD_NO_FLASH        0x00    //光标不闪动
 
void LCD_SetDisplay(unsigned char DisplayMode) //LCD显示设置子函数
{
    LCD_Write(LCD_COMMAND, 0x08|DisplayMode);   
}
 
<span style="color:#009900;">//设置输入模式</span>
<span style="color:#009900;">//************************************************************
</span>#define LCD_AC_UP           0x02
#define LCD_AC_DOWN         0x00      // default
#define LCD_MOVE            0x01      // 画面可平移
#define LCD_NO_MOVE         0x00      //default
 
void LCD_SetInput(unsigned char InputMode)
{
    LCD_Write(LCD_COMMAND, 0x04|InputMode);
}
 
<span style="color:#009900;">//初始化
//LCD***********************************************************</span>
void LCD_Initial()  //初始化函数.
{
    LcdEn=0;
    LCD_Write(LCD_COMMAND,0x38);           //8位数据端口,2行显示,5*7点阵
    delay(5);
    LCD_Write(LCD_COMMAND,0x38);
    delay(5);
     
    LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);    //开启显示, 无光标
    delay(5);
    LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
    delay(5);
    LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);       //AC递增, 画面不动
    delay(5);
}
<span style="color:#009900;">//液晶字符输入的位置************************
</span>void GotoXY(unsigned char x, unsigned char y)
{
    if(y==0)
        LCD_Write(LCD_COMMAND,0x80|x);
    if(y==1)
        LCD_Write(LCD_COMMAND,0x80|(x-0x40));
}
<span style="color:#009900;">//将字符输出到液晶显示
</span>void Print(unsigned char *str)
{
    if(setn==1)
    {
        if(num2==0)
            temp[4]='H';
        if(num2==10)
            temp[4]=' ';
    }
 
    if(setn==2)
    {
        temp[4]='H';
        if(num2==0)
            temp[10]='T';
        if(num2==10)
            temp[10]=' ';
    }
 
    while(*str!='\0')
    {
        LCD_Write(LCD_DATA,*str);
        str++;  
        delay(1);
    }
}
 
 
void  key(void) //按键检测程序
{
    if(sw1==0)
    {
        baojing=0;
        delay(50);
        baojing=1;
        if(sw1==0)
        {
            setn++;
            if(3==setn)
            {
                setn=0;
                temp[4]='H';
                temp[10]='T';
            }
        }
        while(sw1==0);
    }
 
    if(setn!=0)//上限设置       
    {
 
        if(sw2==0)   //上限 减功能
        {
            baojing=0;
            delay(50);
            baojing=1;
            if(sw2==0)
            { 
                if(setn==1)
                {
                    if(H_shangxian<99)  
                        H_shangxian++;                      
                    else
                        H_shangxian=99;
                }
                if(setn==2)
                {
                    if(T_shangxian<99)  
                        T_shangxian++;                      
                    else
                        T_shangxian=99;
                }   
            }  
 
            while(sw2==0);
        }
        if(sw3==0)      //上限 加功能
        {
            baojing=0;
            delay(50);
            baojing=1;
            if(sw3==0)
            { 
                if(setn==1)
                {
                    if(H_shangxian>0)  
                        H_shangxian--;                      
                    else
                        H_shangxian=0;
                }
                if(setn==2)
                {
                    if(T_shangxian>0)  
                        T_shangxian--;                      
                    else
                        T_shangxian=0;
                }
            }
            while(sw3==0);
        }
    }
}
 
void  kongzhi() //控制报警
{
    if((temp_h>=H_shangxian)||(temp_t>=T_shangxian))  <span style="color:#009900;">//当温湿度任一值超过限度时</span>
    {
       <span style="color:#009900;"> //led=1;</span>
        num1++;
        if(num1>=20)
        {
            num1=0;     
            baojing=~baojing;
        }
    }
    else {baojing=1; }
}
 
void zhuanhuan()//扫描数据转换
{
    temp[6]=H_shangxian/10%10+0x30;
    temp[7]=H_shangxian%10+0x30;
    temp[12]=T_shangxian/10%10+0x30;
    temp[13]=T_shangxian%10+0x30;
    temp[14]=0xdf;
 
    temp_s[3]=temp_h/10%10+0x30;
    temp_s[4]=temp_h%10+0x30;
    temp_s[3]=temp_h/10%10+0x30;
    temp_s[4]=temp_h%10+0x30;
 
    temp_s[12]=temp_t/10%10+0x30;   
    temp_s[13]=temp_t%10+0x30; 
    temp_s[14]=0xdf;
    temp_s[15]='C';
}
 
<span style="color:#009900;">//------------------------------------------------------------
</span>main()
{ 
     
    baojing=0;
    delay(500);
    baojing=1;
    <span style="color:#009900;">// led=0;</span>
    LCD_Initial();    <span style="color:#009900;">//液晶初始化</span>
 
    while(1)
    { 
        RH();
        temp_t=T_data_H;
        temp_h=RH_data_H;
        zhuanhuan();
        key();<span style="color:#009900;">// 按键检测 </span>
        kongzhi();
        GotoXY(0,0);//显示起始位置   Y=0,第一行,Y=1 第二行//显示第一行
        Print(temp);// 内容 
        GotoXY(0,1);//显示起始位置   Y=0,第一行,Y=1 第二行  显示第二行
        Print(temp_s);// 内容 
        delay(1);
        <span style="color:#009900;">//getdate= GetADCResult(0)*3.9;</span>
        if(setn!=0)
        {
            num2++;
            if(num2==20)
            {
                num2=0;
            }
        }
    }
}</span>