微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC15F2K60S2读取DHT11温湿度串口显示实例

STC15F2K60S2读取DHT11温湿度串口显示实例

时间:10-02 整理:3721RD 点击:
//**************************
//程序说明:stc15f2k60s2采集dht11温湿度传感器数据,并从串口输出,另附加该程序工程文件下载地址:download.csdn.net/detail/liyu3519/9873073
//采用的是22.1184M晶振
//**************************
#include<stc15fxxxx.h>        //调用stc15f系列头文件,下载地址:  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);
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top