DHT11实现温度湿度的数码管显示

来源:互联网 发布:linux c base64 解码 编辑:程序博客网 时间:2024/04/27 14:30

DHT11温湿度传感器:

温湿度只能精确到个位,主机发送一次开始信号,DTH11连续发送五个字节。

第一个字节,湿度的高位;

第二个字节,湿度的低位;

第三个字节,温度的高位;

第四个字节,温度的低位。


整个工程下载链接:http://download.csdn.net/detail/c1194758555/9580077


整个工程用到的全部头文件:


########################################################DHT11.h#define  DAT P25#define  uchar unsigned char#define  uint unsigned intextern  char WD_H;    /*温度的高位*/extern  char WD_L;    /*温度的低位*/extern  char SD_H;    /*湿度的高位*/extern  char SD_L;    /*湿度的地位*/extern  char Erron;   /*出错*/void init_in_DHT(void);void init_out_DHT(void);uchar Read(uchar *a);void READ(void);#########################################################interrupt_time.hvoid display_ms(uint time);/*ms秒级*/void display_us(uint time);/*us级定时*/###########################################################led.h                        /*数码管的动态显示*/#define SCLK P00             #define RCLK P01#define DIO  P02extern const unsigned char table[10];void led_on(unsigned char led_num);void led_one(unsigned char LEDNO, unsigned char NO);#############################################################


DHT11的数据传输及数据处理代码:

#include <STC15W4K58S4.h>#include "interrupt_time.h"#include "DHT11.h"char WD_H = 0;    /*温度的高位*/char WD_L = 0;    /*温度的低位*/char SD_H = 0;    /*湿度的高位*/char SD_L = 0;    /*温度的低位*/char Erron;       /*出错标志*/void init_in_DHT(void){DAT = 1;}void init_out_DHT(void){DAT = 0;}uchar check(char *a)             /*校验函数*/{if((a[4] & 0xf) == ((a[0] + a[1] + a[2] + a[3]) & 0xf))return 1;return 0;}char Readbit()            /*读取一个bit*/{uchar i;uchar time;uchar temp = 0;uchar dat = 0;for(i = 0; i < 8; i++){time = 60;while(!DAT && --time)  {  display_us(1);            /*延时4us*/  }if(!time)   return 0xfe;display_us(30);            /*延时30us*/temp = DAT ? 1 : 0;dat = dat << 1;dat |= temp;time = 50;while(DAT && --time)  {  display_us(1);         /*延时4us*/  }if(!time)   return 0xfe;}return dat;}uchar Read(uchar *a)               /*读去一次,五个字节*/{uchar time;init_out_DHT();display_ms(20);           /*延时20ms*/init_in_DHT();time = 50;while(DAT && time-- )     /*拉高等待20-40us*/{  display_us(1); }if(!time)return 0;time = 100;while(!DAT && --time)      /*DHT响应拉低80us*/{   display_us(1);            }if(!time)return 0;time = 100;while(DAT && --time)      /*DHT响应拉高80us*/{  display_us(1);           }if(!time)return 0;a[0] = Readbit();       /*读取输入值*/a[1] = Readbit();a[2] = Readbit();a[3] = Readbit();a[4] = Readbit();init_in_DHT();if(a[0] == 0xfe || a[1] == 0xfe || a[2] == 0xfe || a[3] == 0xfe) /*是否读出错误*/return 0;return check(a);}void READ(void)              /*对读出的数据进行处理*/{uchar a[4];int A,B;Erron = Read(a);A = a[0];B = a[2];  SD_H = (A / 10) % 10;  SD_L = A % 10;  WD_H = (B / 10) % 10;  WD_L = B % 10;}


LED动态显示源码:

#include <STC15W4K58S4.h>#include "led.h"const unsigned char table[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  /*段码*/void S_CLK(){ SCLK = 0; SCLK = 1;}void R_CLK(){RCLK = 0;RCLK = 1;}void led_on(unsigned char led_num) /{unsigned char i ;for(i = 0; i < 8; i++){ if(led_num & 0x80) DIO = 1; else DIO = 0; led_num <<= 1; S_CLK();}}void led_one(unsigned char LEDNO, unsigned char NO){  led_on(LEDNO);  led_on(NO);  R_CLK();}


延时:

#include <STC15W4K58S4.h>#include "DHT11.h"#include "led.h"void display_us(uint time)/*us级延时*/{while(time--);}void display_ms(uint time)/*ms级延时*/{time = 12 * time * 1000;while(time  --);}

使用12MZH时钟,STC15W4K58S4的速度是传统单片机的12倍。


主函数

/*  ********************************************************************************************  *                                                                                          *  * 程序功能:DHT11温湿度测量并用数码管显示                                                  *  * 最后更改时间:2016-7-19                                                                  *  * 问        题:读取数据时有必须的延时,<span style="font-family: Arial, Helvetica, sans-serif;">所以刷新时会出现数码管的轻微闪烁                                      *</span>  [cpp] view plain copy 在CODE上查看代码片派生到我的代码片********************************************************************************************  */      #include <STC15W4K58S4.h>  #include "interrupt_time.h"  #include "led.h"  #include "DHT11.h"    int main()  {      uint time = 2000;      display_ms(time); /*延时两秒*/    READ();           /*读取数据*/            while(1)      {             time = 3000000*12;           while(time--)      /*每隔3秒读取一次*/          {              led_one(table[WD_H], 2);          led_one(table[WD_L], 1);          led_one(table[SD_H], 8);          led_one(table[SD_L], 4);          }          READ();      }          }         


效果:




注:前两位为湿度,后两位位温度。



0 0
原创粉丝点击