自测可用
单片机源程序如下:
- #include "stm32f10x.h"
- #include "DHT11.h"
- #include "Delay.h"
- #include "bsp_usart.h"
- #include "oled.h"
- DHT11_Data DHT11;
- void DHT11_GPIO_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置浮空输入
- GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
- }
- /********************************************************
- 函数:DHT11_GPIO_OUT
- 描述:设置GPIO口为输出状态
- 参数:无
- 返回:无
- ********************************************************/
- void DHT11_GPIO_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
-
- GPIO_InitStructure.GPIO_Pin = DHT11_PIN;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置推挽输出
- GPIO_Init(DHT11_PORT,&GPIO_InitStructure);
- }
- /********************************************************
- 函数:DHT11WriteStart
- 描述:发起开始信号
- 参数:无
- 返回:无
- ********************************************************/
- void DHT11WriteStart(void)//开始标志
- {
- DHT11_GPIO_OUT(); //设置io为输出模式
- DHT11_DATA_OUT(1); //拉高
- DHT11_DATA_OUT(0); //拉低
- Delay_Ms(20); //主机拉低总线必须大于18ms
- DHT11_DATA_OUT(1); //拉高
- Delay_Us(30); //主机发送开始信号结束后延时等待20-40us
- DHT11_GPIO_IN(); //启动信号开始后,为如数据将io设置设置为输入模式
- }
- /********************************************************
- 函数:DHT11ReadByte
- 描述:从DHT11中读取一位数据
- 参数:无
- 返回:返回读出来的数据
- ********************************************************/
- u8 DHT11ReadByte(void)
- {
- u8 temp=0,i;
- for(i=0;i<8;i++)//读取8位数据
- {
- while(DHT11_DATA_IN()==0);//等待变高电平[DHT在单片机采集DATA引脚输出低电平时,从低功耗模式转至高速模式,等待DATA引脚变为高电平]
- /*DHT11 以26us~28us的高电平表示“0”,以70us的高电平表示“1”
- 每一bit数据都以50us低电平时隙开始,当检测到60us后的电平区别状态*/
- Delay_Us(60);//1.DHT输出 60us低电平 作为应答信号2.DHT输出 80us高电平 通知微处理器准备接受数据
- if(DHT11_DATA_IN()==1) //60us后还是高电平则是“1”
- {
- while(DHT11_DATA_IN()==1);
- temp|=(u8)(0x01<<(7-i));
- }
- else //否则是“0”
- {
- temp&=(u8)~(0x01<<(7-i));
- }
- }
- return temp;
- }
- /********************************************************
- 函数:DHT11Read
- 描述:采样当前温湿度值
- 参数:
- RH:湿度值的整数部分
- RL: 湿度值的小数部分
- TH: 温度值的整数部分
- TL: 温度值的小数部分
- 返回:
- ********************************************************/
- char a[5];
- int temp;
- void DHT11Read(void)
- {
- DHT11WriteStart(); //发起开始信号
- if(DHT11_DATA_IN()==0)
- {
- while(DHT11_DATA_IN()==0);
- while(DHT11_DATA_IN()==1);
- DHT11.RH= DHT11ReadByte(); //湿度高8位
- DHT11.RL= DHT11ReadByte(); //湿度低8位
- DHT11.TH= DHT11ReadByte(); //温度高8位
- DHT11.TL= DHT11ReadByte(); //温度低8位
- DHT11.sum= DHT11ReadByte(); //校验和
- DHT11_GPIO_OUT(); //采样结束后设置io口为输出,等待下一次开始信号
- DHT11_DATA_OUT(1); //设置总线空闲状态为高电平
- }
- if(DHT11.sum== DHT11.RH+DHT11.RL+DHT11.TH+DHT11.TL) //校验和与计算出的数据相等
- {
- // OLED_ShowString(6,6,"c");
- // printf("当前环境湿度为%d.%d﹪,当前环境温度为%d.%d℃\r\n",DHT11.RH,DHT11.RL,DHT11.TH,DHT11.TL);
- // DHT11.TL=2;
-
- OLED_16x16CNStr(0,0,"23");
- OLED_ShowChar(32,0,':');
-
- temp=(int)DHT11.RH;
- sprintf(a,"%d",temp);
- OLED_ShowString(48,0,a);
-
- OLED_ShowChar(64,0,'.');
-
- temp=(int)DHT11.RL;
- sprintf(a,"%d",temp);
- OLED_ShowString(72,0,a);
- OLED_ShowChar(80,0,'%');
-
- OLED_16x16CNStr(0,2,"45");
- OLED_ShowChar(32,2,':');
-
- temp=(int)DHT11.TH;
- sprintf(a,"%d",temp);
- OLED_ShowString(48,2,a);
-
- OLED_ShowChar(64,2,'.');
-
- temp=(int)DHT11.TL;
- sprintf(a,"%d",temp);
- OLED_ShowString(72,2,a);
- OLED_16x16CNStr(80,2,"6");
-
- }
- }
复制代码
所有资料51hei提供下载:
DHT11.rar
(47.18 KB, 下载次数: 46)
|