|
本帖最后由 xiaoxuesheng 于 2021-11-7 13:21 编辑
DHT11.C
- #include "DHT11.H"
- //温湿度定义
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- DHT11VALUE DHT11Value;
- void DHT11_Start(void) //向传感器发送启动信号
- {
- DATA_PIN=0; //dht11低电平
- delay_ms(20); //延时大于18MS
- DATA_PIN=1; //dht11高电平
- Delay_10us(); //延时40us
- Delay_10us();
- Delay_10us();
- Delay_10us();
- }
- /******************************************************************************
- * 描 述 : 温湿度传感写操作:写入1个字节
- * 入 参 : 无
- * 返回值 : 无
- *****************************************************************************/
- unsigned char DHT11_rec_byte()
- {
- unsigned char i,dat=0;
- for(i=0;i<8;i++) //
- {
- while(!DATA_PIN); //等待50us低电平过去
- Delay_10us(); //延时30us
- Delay_10us();
- Delay_10us();
- dat<<=1; //移位接收8位数据 数据为零时直接移位
- if(DATA_PIN)
- dat+=1;
- while(DATA_PIN);
- }
- return dat;
- }
- /******************************************************************************
- * 描 述 : DHT11写操作:写入1个字节
- * 入 参 : 无
- * 返回值 : 无
- *****************************************************************************/
- void DHT11_receive() //接收数据
- {
- DHT11_Start(); //发送dht11启动信号
- if(!DATA_PIN) //等待dht11低电平
- {
- while(!DATA_PIN);
- while(DATA_PIN);
- R_H=DHT11_rec_byte(); //接收湿度高八位
- R_L=DHT11_rec_byte(); //接收湿度低八位
- T_H=DHT11_rec_byte(); //接收温度高八位
- T_L=DHT11_rec_byte(); //接收温度低八位
- revise=DHT11_rec_byte(); //接收校验
- DATA_PIN=1;
- if((R_H+R_L+T_H+T_L)==revise) //校正 判断温湿度高八位和低八位相加和校验是否相同
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- DHT11Value.tempH = TH/10; //数值转换
- DHT11Value.tempL = TH%10;//数值转换
-
- DHT11Value.humyH = RH/10; //数值转换
- DHT11Value.humyL = RH%10; //数值转换
- }
- }
- void dis() //lcd1602显示温湿度
- {
- LCD_ShowString(1,1,"T:");
- LCD_ShowNum(1,3,TH,2);
- LCD_ShowChar(1,5,0X43);
- LCD_ShowString(1,7,"H:");
- LCD_ShowNum(1,9,RH,2);
- LCD_ShowChar(1,11,0X25);
-
- }
复制代码 DHT11.H
- #ifndef __DHT11_H__
- #define __DHT11_H__
- #include "delay.h"
- #include "lcd1602.h"
- /**********************
- 引脚别名定义
- ***********************/
- sbit DATA_PIN=P4^1; //DHT11数据引脚,该引脚必须接上拉电阻
- typedef struct DHT11_VALUE
- {
- uint tempH; //温度高字节(十位)
- uchar tempL; //温度低位节(个位)
- uchar humyH; //湿度高字节(十位)
- uchar humyL; //湿度高字节(个位)
- }DHT11VALUE;
- extern DHT11VALUE DHT11Value;
- void DHT11_Start(void); //向传感器发送启动信号
- unsigned char DHT11_rec_byte();
- void DHT11_receive(); //接收数据
- void dis();
- #endif
复制代码 delay.c
- #include "delay.h"
- //========================================================================
- // 函数: void delay_ms(unsigned char ms)
- // 描述: 延时函数。
- // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
- // 返回: none.
- // 版本: VER1.0
- // 日期: 2013-4-1
- // 备注:
- //========================================================================
- void delay_ms(unsigned char ms)
- {
- unsigned int i;
- do
- {
- i = MAIN_Fosc / 13000;
- while(--i) ; //14T per loop
- }
- while(--ms);
- }
- void delay_2000ms(void)
- {
- unsigned char i;
- for(i=0;i<10;i++)
- {
- delay_ms(200);
- }
- }
- /******************************************************************************
- * 描 述 : 10 us延时
- * 入 参 : 无
- * 返回值 : 无
- *****************************************************************************/
- void Delay_10us()
- {
- uint j,i;
- for(j=0;j<2;j++)
- {
- for(i=0;i<7;i++);
- }
- }
复制代码 delay.h
- #ifndef __DELAY_H
- #define __DELAY_H
- #define MAIN_Fosc 11059200L //定义主时钟
- #include "STC8.H"
- #define uchar unsigned char
- #define uint unsigned int
-
- void delay_ms(unsigned char ms);
- void delay_2000ms(void);
- void Delay_10us();
- #endif
复制代码 自学,代码属于拼凑型,以上测试可以运行, |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|