STC15F2K60S2读取DHT11温湿度串口显示

为了方便大家调试,另附程序工程共大家下载
STC15F2K60S2读取DHT11温湿度下载地址

//**************************
//程序说明:stc15f2k60s2采集dht11温湿度传感器数据,并从串口输出
//采用的是22.1184M晶振
//**************************

#include<stc15fxxxx.h>  //调用stc15f系列头文件,下载地址:  http://pan.baidu.com/s/1eRUbjLS

//IO口声明

#define dht11_io P20   //P2.0口作为数据读取接口

//常量声明

#define MAIN_Fosc       22118400L       //主时钟
#define baud_rate       115200L         //波特率
#define Timer1_Reload   (65536UL -(MAIN_Fosc / 4 / baud_rate))      //Timer1重装值

//变量定义

u16 U8FLAG;
u8  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  datas=0;


//函数声明

void  Delay30us();                              //22.1184M晶振精确延时30微秒
void  Delay40us();                              //22.1184M晶振精确延时40微秒
void  Delay18ms();                              //22.1184M晶振精确延时30毫秒
void    Delay1000ms();                          //22.1184M晶振精确延时1000毫秒

void  read_byte();                              //读取一字节的数据,并赋值给U8comdata
u8    read_temp();                              //读取温度,返回温度值
u8    read_humi();                              //读取湿度,返回湿度值

void    serial_init();                          //串口初始化
void    serial_send_byte(u8 dat);       //串口发送一个字节的数据
void    serial_send_string(u8 *dat);//串口发送字符串

//主函数
void main()
{
    Delay1000ms();
    serial_init();//串口初始化
    dht11_io = 1;
    while(1)
    {
        datas=read_temp();
        serial_send_string("温度:");
        serial_send_byte(datas%100/10+'0');//十位
        serial_send_byte(datas%10+'0');      //个位
        serial_send_byte(' ');
        datas=read_humi();
        serial_send_string("湿度:");
        serial_send_byte(datas%100/10+'0');//十位
        serial_send_byte(datas%10+'0');      //个位
        serial_send_string("\r\n");
        Delay1000ms();
    }


}

//读取一个字节数据
void read_byte()
{
    u8 i;
    for(i=0;i<8;i++)
    {
        U8FLAG=2;
        while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
        Delay30us();
        U8temp=0;
        if(dht11_io)U8temp=1;
        U8FLAG=2;
        while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
        if(U8FLAG==1)break;
        U8comdata<<=1;
      U8comdata|=U8temp;
    }
}

//读取温度,返回温度值
u8 read_temp()
{
    dht11_io=0;
    Delay18ms();
    dht11_io=1;
    Delay40us();
    dht11_io=1;
    if(!dht11_io)
    {
        U8FLAG=2;
        while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
        U8FLAG=2;
        while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
        read_byte();
      U8RH_data_H_temp=U8comdata;
      read_byte();
      U8RH_data_L_temp=U8comdata;
      read_byte();
      U8T_data_H_temp=U8comdata;
      read_byte();
      U8T_data_L_temp=U8comdata;
      read_byte();
      U8checkdata_temp=U8comdata;
      dht11_io=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;
      }
    }
    return U8T_data_H;
}

//读取湿度,返回湿度值
u8 read_humi()
{
    dht11_io=0;
    Delay18ms();
    dht11_io=1;
    Delay40us();
    dht11_io=1;
    if(!dht11_io)
    {
        U8FLAG=2;
        while((!dht11_io)&&U8FLAG++);//超时3毫秒跳出
        U8FLAG=2;
        while((dht11_io)&&U8FLAG++);//超时3毫秒跳出
        read_byte();
      U8RH_data_H_temp=U8comdata;
      read_byte();
      U8RH_data_L_temp=U8comdata;
      read_byte();
      U8T_data_H_temp=U8comdata;
      read_byte();
      U8T_data_L_temp=U8comdata;
      read_byte();
      U8checkdata_temp=U8comdata;
      dht11_io=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;
      }
    }
    return U8RH_data_H;
}

//串口初始化
void serial_init()
{
    S1_8bit();              //8位数据
    S1_USE_P30P31();        //UART1 使用P30 P31口  默认
    TR1 = 0;
    AUXR &= ~0x01;     //S1 BRT Use Timer1;
    TMOD &= ~(1<<6);   //Timer1 set As Timer
    TMOD &= ~0x30;     //Timer1_16bitAutoReload;2
    AUXR |=  (1<<6);    //Timer1 set as 1T mode
    TH1 = (u8)(Timer1_Reload >> 8);
    TL1 = (u8)Timer1_Reload;
    TR1  = 1;
    PS = 1; //高优先级中断
    REN = 1;    //允许接收
    ES  = 1;    //允许中断

    EA = 1;     //允许全局中断
}

//串口发送一个字节数据
void serial_send_byte(u8 dat)
{
    SBUF=dat;
    while(!TI);
    TI=0;
}

//串口发送字符串
void serial_send_string(u8 *dat)
{
    while(*dat)
    {
        serial_send_byte(*dat++);
    }
}

/********************* 串口1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
    if(RI)
    {
        RI = 0;
    }

    if(TI)
    {
    }
}

void Delay30us()        //@22.1184MHz精确延时30微秒
{
    unsigned char i, j;

    i = 1;
    j = 162;
    do
    {
        while (--j);
    } while (--i);
}

void Delay40us()        //@22.1184MHz精确延时40微秒
{
    unsigned char i, j;

    _nop_();
    i = 1;
    j = 217;
    do
    {
        while (--j);
    } while (--i);
}

void Delay18ms()        //@22.1184MHz精确延时18毫秒
{
    unsigned char i, j, k;

    _nop_();
    i = 2;
    j = 132;
    k = 67;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void Delay1000ms()      //@22.1184MHz
{
    unsigned char i, j, k;

    _nop_();
    _nop_();
    i = 85;
    j = 12;
    k = 155;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}


猜你喜欢

转载自blog.csdn.net/liyu3519/article/details/73436775