zoukankan      html  css  js  c++  java
  • STC15系列通用-STC15F2K60S2/STCW4K32S4读取DHT11温湿度传感器数据串口输出代码实例工程免费下载

    //为了方便大家调试,另附程序工程共大家下载,下载地址:https://www.90pan.com/b1908750

    //**************************
    
    //程序说明: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("
    ");
    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);
    }
  • 相关阅读:
    Beyond Compare设置
    lt29配置
    [Windows] 常用的快捷命令
    【C&C++】数组初始化的思考
    【Windows批处理】常用命令解析
    Linux下将网站数据自动备份到Dropbox
    CentOS下iRedMail安装配置
    Python 大数据思维导图
    libxml2编程基础
    xml文件的解析
  • 原文地址:https://www.cnblogs.com/liyu3519/p/13041536.html
Copyright © 2011-2022 走看看