标题: 求基于单片机AT89C51的SHT11湿度程序 [打印本页]

作者: ffy2018    时间: 2017-12-17 22:31
标题: 求基于单片机AT89C51的SHT11湿度程序
要求一:共阴数码管显示
要求二:设定湿度范围,超过或低于会驱动吹风机和加湿器(没有也可以)
有仿真更好

作者: HC6800-ES-V2.0    时间: 2017-12-18 08:08
我有一个,你看看。
/****************************************************************
//           DHT21使用范例
//单片机 AT89S52 或 STC89C52RC
//功能   数码管显示温度、湿度数据
//硬件   P1.0口为通讯口连接DHT11,DHT11的电源和地连接单片机的电源和地,单片机串口加MAX232连接电脑
//公司  雁凌电子   
****************************************************************/

#include <reg51.h>
#include <intrins.h>

#define GPIO_DIG P0
sbit  P1_0  = P1^0 ;//温湿度传感器的数据接口

sbit LSA = P2^2;//138译码器的控制输出
sbit LSB = P2^3;
sbit LSC = P2^4;

unsigned char ly_disdate[8]={0,0,0,0,0,0,0,0};
unsigned char  U8FLAG;
unsigned char  U8temp;
unsigned char  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
unsigned char  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
unsigned char  U8comdata;

code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
                                                        0x7c,0x39,0x5e,0x79,0x71};        //共阳数码管段值表 0-9 a-f

void Delay(unsigned int j)//延时888.1725us
{
        unsigned char i;
        for(j;j>0;j--)
        {        
                for(i=0;i<27;i++);
        }
}

void  Delay_10us(void)
{
        unsigned char i;
        i--;
        i--;
        i--;
        i--;
        i--;
        i--;
}
       
void COM (void)//读数据
{
        unsigned char i;
        for(i=0;i<8;i++)          
        {
                U8FLAG=2;       
                while((!P1_0)&&U8FLAG++);
                Delay_10us();
                Delay_10us();                               
                Delay_10us();
                U8temp=0;
                if(P1_0)U8temp=1;
                U8FLAG=2;
                while((P1_0)&&U8FLAG++);
                   //超时则跳出for循环                  
                if(U8FLAG==1)break;
                U8comdata<<=1;
                U8comdata|=U8temp;  
        }
}

void RH (void)//温湿度读取子程序
{       
        P1_0=0;
        Delay(200);
        P1_0=1;
        Delay_10us();
        Delay_10us();
        Delay_10us();
        Delay_10us();
        P1_0=1;
        if(!P1_0)
        {
                U8FLAG=2;
                while((!P1_0)&&U8FLAG++);
                U8FLAG=2;
                while((P1_0)&&U8FLAG++);
                COM();
                U8RH_data_H_temp=U8comdata;
                COM();
                U8RH_data_L_temp=U8comdata;
                COM();
                U8T_data_H_temp=U8comdata;
                COM();
                U8T_data_L_temp=U8comdata;
                COM();
                U8checkdata_temp=U8comdata;
                P1_0=1;
                U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
                if(U8temp==U8checkdata_temp)
                {
                        U8RH_data_H=U8RH_data_H_temp;//湿度高8位
                        U8RH_data_L=U8RH_data_L_temp;//湿度低8位
                        U8T_data_H=U8T_data_H_temp;//温度高8位
                        U8T_data_L=U8T_data_L_temp;//温度低8位
                        U8checkdata=U8checkdata_temp;//校验8位
                }
        }
}

void display()//显示函数
{
        unsigned char i,j;
        for(i=0;i<8;i++)//只有8个数码管
        {
                switch(i)         //位选,选择点亮的数码管,
                {
                        case(0):
                                LSC=0;LSB=0;LSA=0; break;//显示第0位
                        case(1):
                                LSC=0;LSB=0;LSA=1; break;//显示第1位
                        case(2):
                                LSC=0;LSB=1;LSA=0; break;//显示第2位
                        case(3):
                                LSC=0;LSB=1;LSA=1; break;//显示第3位
                        case(4):
                                LSC=1;LSB=0;LSA=0; break;//显示第4位
                        case(5):
                                LSC=1;LSB=0;LSA=1; break;//显示第5位
                        case(6):
                                LSC=1;LSB=1;LSA=0; break;//显示第6位
                        case(7):
                                LSC=1;LSB=1;LSA=1; break;//显示第7位       
                }
                if ((i==2)||(i==6))
                {
                        GPIO_DIG=table[ly_disdate[i]]+0x80;//发送段码
                }
                else
                {
                        GPIO_DIG=table[ly_disdate[i]];//发送段码
                }
                j=10;                                                 //扫描间隔时间设定
                while(j--);       
                GPIO_DIG=0x00;//消隐
        }
}

void main()
{       
        unsigned int i=20000;
        while(1)
        {  
                RH();
                i=5000;
                while (i)
                {
                        ly_disdate[7]=U8RH_data_H/10;
                        ly_disdate[6]=U8RH_data_H%10;
                        ly_disdate[5]=U8RH_data_L/10;
                        ly_disdate[4]=U8RH_data_L%10;
                        ly_disdate[3]=U8T_data_H/10;
                        ly_disdate[2]=U8T_data_H%10;
                        ly_disdate[1]=U8T_data_L/10;
                        ly_disdate[0]=U8T_data_L%10;
                        i--;
                        display();
                }
        }
}


作者: iude2006    时间: 2017-12-18 15:33
简单,给我邮箱给你发一个
作者: ffy2018    时间: 2017-12-18 20:57
iude2006 发表于 2017-12-18 15:33
简单,给我邮箱给你发一个

好啊   ffy2018@123.com




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1