89C52RC DHT11湿度温度显示到数码管 源代码

记录一下 用到的软件

1 Keil uVision5 (把源代码编译成HEX文件)

2 stc-isp-15xx-v6.85.exe (把HEX文件写入单片机)


下面是源代码

//****************************************************************//

//   STC89C52RC  DHT11 温度湿度

// 功能  :单片机通过 DHT11 获取温湿度  显示到8位数码管 

//硬件连接:DHT11有3根线 DATA连接P2.0  VCC连接VCC GND连接GND

// 测试通过: wx:  yaolifang1987

//****************************************************************//

#include

#include

//

typedef unsigned char  U8;      /* defined for unsigned 8-bits integer variable          无符号8位整型变量  */

typedef signed  char  S8;      /* defined for signed 8-bits integer variable                  有符号8位整型变量  */

typedef unsigned int  U16;      /* defined for unsigned 16-bits integer variable          无符号16位整型变量 */

typedef signed  int  S16;      /* defined for signed 16-bits integer variable          有符号16位整型变量 */

typedef unsigned long  U32;      /* defined for unsigned 32-bits integer variable          无符号32位整型变量 */

typedef signed  long  S32;      /* defined for signed 32-bits integer variable          有符号32位整型变量 */

typedef float          F32;      /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */

typedef double        F64;      /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */

//

#define uchar unsigned char

#define uint unsigned int

#define  Data_0_time    4

//----------------------------------------------//

//----------------IO口定义区--------------------//

//----------------------------------------------//

sbit FM=P2^3; // 蜂鸣器的接口

sbit  P2_0 = P2^0;

sbit  dula=P2^6;

sbit  wela=P2^7;

//----------------------------------------------//

//----------------定义区--------------------//

//----------------------------------------------//

U8  U8FLAG,k;

U8  U8count,U8temp;

U8  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;

U8  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

U8  U8comdata;

U8  outdata[5];  //定义发送的字节数         

U8  indata[5];

U8  count, count_r=0;

U8  str[5];

U16 U16temp1,U16temp2;

U8  table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

        void delayms(U16 xms)

  {

  U16 i,j;

  for(i=xms;i>0;i--)

  {

  for(j=110;j>0;j--);

  }

  }

    void Delay(U16 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  COM(void)

      {

                U8 i;

      for(i=0;i<8;i++)         

            {


                      U8FLAG=2;       

                  while((!P2_0)&&U8FLAG++);

                        Delay_10us();

                    Delay_10us();

                        Delay_10us();

                          U8temp=0;

            if(P2_0)U8temp=1;

                    U8FLAG=2;

                while((P2_0)&&U8FLAG++);

                  //超时则跳出for循环                 

                    if(U8FLAG==1)break;

                  //判断数据位是0还是1       


                // 如果高电平高过预定0高电平值则数据位为 1


                  U8comdata<<=1;

                      U8comdata|=U8temp;        //0

            }//rof


        }

        //--------------------------------

        //-----湿度读取子程序 ------------

        //--------------------------------

        //----以下变量均为全局变量--------

        //----温度高8位== U8T_data_H------

        //----温度低8位== U8T_data_L------

        //----湿度高8位== U8RH_data_H-----

        //----湿度低8位== U8RH_data_L-----

        //----校验 8位 == U8checkdata-----

        //----调用相关子程序如下----------

        //---- Delay();, Delay_10us();,COM();

        //--------------------------------

        void RH(void)

        {

          //主机拉低18ms

      P2_0=0;

          Delay(180);

          P2_0=1;

        //总线由上拉电阻拉高 主机延时20us

          Delay_10us();

          Delay_10us();

          Delay_10us();

          Delay_10us();

        //主机设为输入 判断从机响应信号

          P2_0=1;

        //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行         

          if(!P2_0)                //T !         

          {

          U8FLAG=2;

        //判断从机是否发出 80us 的低电平响应信号是否结束       

          while((!P2_0)&&U8FLAG++);

          U8FLAG=2;

        //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态

          while((P2_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;

          P2_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;

                    U8RH_data_L=U8RH_data_L_temp;

                  U8T_data_H=U8T_data_H_temp;

                    U8T_data_L=U8T_data_L_temp;

                    U8checkdata=U8checkdata_temp;

          }//fi

          }//fi

        }


//----------------------------------------------

//main()功能描述:  AT89C51  11.0592MHz       

void main()

{

        U8  i,j;

        unsigned int ikk;

        //uchar str[6]={"RS232"};

        /* 系统初始化 */

        Delay(1);        //延时100US(12M晶振)

FM=0;Delay(2000);           //蜂鸣器报警

FM=1;Delay(2000);    //延迟

FM=0;Delay(2000);           //蜂鸣器报警

FM=1;Delay(2000);    //延迟

FM=0;Delay(2000);           //蜂鸣器报警

FM=1;

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;Delay(1000);    //延迟

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;Delay(1000);    //延迟

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;Delay(1000);

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;Delay(1000);

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;

  Delay(1000);

        while(1)

        { 

          //------------------------

          //调用温湿度读取子程序

          RH();

          //串口显示程序

          //--------------------------

          str[0]=U8RH_data_H; //  把湿度整数给予SRT0.(直接使用即可)

          str[1]=U8RH_data_L; //  把湿度小数给予SRT1.==0(为零,不用)

          str[2]=U8T_data_H;  //  把温度整数给予SRT2.(直接使用即可)

          str[3]=U8T_data_L;  //  把温度小数给予SRT3.==0(为零,不用)

          str[4]=U8checkdata; //  校验位(不用)

// unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 

// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  


  // dula=1;

          // P0=table[str[2]/10];

          // dula=0;

          // P0=0xff;

          // wela=1;

          // P0=0xfe;

          // wela=0;

          // delayms(300);


    // FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;Delay(2000);    //延迟

// FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;Delay(2000);    //延迟

// FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);    //延迟

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);    //延迟

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;

  // Delay(1000);




  ikk=0;

  // for(ikk=0;ikk<500;ikk++)

  for(ikk=0;ikk<500;ikk++)

  {

  // 温度 第一位

          dula=1;

          P0=table[str[2]/10];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfe;

          wela=0;

          delayms(1);

// 温度 第二位

          dula=1;

          P0=table[str[2]%10];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfd;

          wela=0;

          delayms(1);

  // 温度 C

          dula=1;

          P0=table[12];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xfb;

          wela=0;

          delayms(1);


// unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; 

// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

// unsigned char code wei[]={0xfe,0xfd,0xfb,0xf7,  0xef,0xdf,0xbf,0x7f};


  // 湿度 第一位 str[0]

  dula=1;

          P0=table[str[0]/10];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xef;

          wela=0;

          delayms(1);

  // 湿度 第二位 str[0]

  dula=1;

          P0=table[str[0]%10];

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xdf;

          wela=0;

          delayms(1);

  // 湿度 符号

  dula=1;

          // P0=table[13];

          P0=0x76;

          dula=0;

          P0=0xff;

          wela=1;

          P0=0xbf;

          wela=0;

          delayms(1);





  }





// FM=0;           //蜂鸣器报警

// Delay(3000);    //延迟

// FM=1;

// Delay(3000); 

// FM=0;           //蜂鸣器报警

// Delay(3000);    //延迟

// FM=1;

// Delay(1000);

// Delay(10000);

  // FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;Delay(2000);    //延迟

// FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;Delay(2000);    //延迟

// FM=0;Delay(2000);           //蜂鸣器报警

// FM=1;

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);    //延迟

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);    //延迟

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;Delay(1000);

// FM=0;Delay(1000);           //蜂鸣器报警

// FM=1;

  // Delay(1000);

      //延迟

Delay(18000);

FM=0;Delay(1000);           //蜂鸣器报警

FM=1;Delay(1000);


          //读取模块数据周期不易小于 2S

          // Delay(10000);

        }//elihw


}// main

你可能感兴趣的:(89C52RC DHT11湿度温度显示到数码管 源代码)