【最新编排】基于51单片机的DHT11串口通讯
基于51单片机的DHT11温湿度系统(已调试成功,无需置疑)

/*系统名:基于51单片机的DHT11温湿度系统系统使用说明:通过无线蓝牙进行数据传输,上位机需通过蓝牙调试软件向系统发送命令获取信息,若要获取当前温度、湿度,则发送“?Z”即可。
系统将会自动回复当前温度和湿度。
注意事项:蓝牙需设置成主从模式(即通过AT命令设置蓝牙名和密码相同,再设置成主从模式)蓝牙灯同步闪烁代表蓝牙连接成功。
*/#include "reg51.h"# include <intrins.h>typedef unsigned char BYTE;typedef unsigned int WORD;#define uint unsigned int#define uchar unsigned char/************辅助全局变量块*****************/char t,buf[6],buf_cnt;bit sec,flag,send_flag;/*sec:秒信号;flag:串行口接收到命令标志;send_flag:回复数据标志*//************辅助全局变量块*****************//*************DHT11变量块*******************/sbit io=P3^2; //DHT11数据端接单片机的P3^2口typedef bit BOOL;//此声明一个布尔型变量即真或假uchar data_byte;uchar RH,RL,TH,TL; //TH保存温度,RH保存湿度/*************DHT11变量块*******************///*******************************延时函数*******************************************void delay(uchar ms){uchar i;while(ms--)for(i=0;i<100;i++);}void delay1()//一个for循环大概需要8个多机器周期 一个机器周期为1us 晶振为12MHz 也就是说本函数延时8us多 此延时函数必须德稍微精确一点{uchar i;for(i=0;i<1;i++);}void delay1ms(char t){int i,j;for(i=0;i<t;i++)for(j=0;j<1000;j++);}//***************************延时函数*****************************************//**************************DHT11模块***************************************** void start()//开始信号{io=1;delay1();io=0;delay(25);// 主机把总线拉低必须大于18ms 保证DHT11能检测到起始信号io=1; //发送开始信号结束后 拉高电平延时20-40usdelay1();//以下三个延时函数差不多为24us 符合要求delay1();delay1();}uchar receive_byte()//接收一个字节//{uchar i,temp;for(i=0;i<8;i++)//接收8bit的数据{while(!io);//等待50us的低电平开始信号结束delay1();//开始信号结束之后 延时26us-28us 以下三个延时函数delay1();delay1();temp=0;//时间为26us-28us 表示接收的为数据'0'if(io==1)temp=1; //如果26us-28us之后 还为高电平 则表示接收的数据为'1'while(io);//等待数据信号高电平 '0'为26us-28us '1'为70usdata_byte<<=1;//接收的数据为高位在前 右移data_byte|=temp;}return data_byte;}void receive()//接收数据{uchar T_H,T_L,R_H,R_L,check,num_check,i;start();//开始信号//io=1; //主机设为输入 判断从机 DHT11 响应信号if(!io)//判断从机是否有低电平响应信号//{while(!io);//判断从机发出 80us 的低电平响应信号是否结束//while(io);//判断从机发出 80us 的高电平是否结束 如结束则主机进入数据接收状态R_H=receive_byte();//湿度高位R_L=receive_byte();//湿度低位T_H=receive_byte();//温度高位T_L=receive_byte();//温度低位check=receive_byte();//校验位io=0; //当最后一bit数据接完毕后 从机拉低电平50us//for(i=0;i<7;i++)//差不多50us的延时delay1();io=1;//总线由上拉电阻拉高 进入空闲状态num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之和是否与校验位相同{RH=R_H;RL=R_L;TH=T_H;TL=T_L;check=num_check;}}}//***************************DHT11模块**********************************//**************************中断服务函数块*******************************void ComSer() interrupt 4 //串行口中断服务函数(串口数据接收){if(RI){t=SBUF;buf[buf_cnt++]=t;RI=0;if(t=='Z'){flag=1;buf_cnt=0;}}}//********************************中断服务函数********************************* //************************串行口字符(字符串)发送块************************** void putchar(unsigned char n){SBUF=n;while(!TI);TI=0;}void puts(unsigned char *q){while(*q)putchar(*q++);}void Enter() //换行函数{putchar(0x0d);putchar(0x0a);}void DispNum(unsigned char n){unsigned char t[8]={0};t[0]=n/10+'0';t[1]=n%10+'0';t[2]=0;puts(t);Enter();}//************************串行口字符(字符串)发送块*****************//********************************串行口请求判断块********************void Dill(){if(buf[0]=='?'){delay1ms(50);send_flag=1;}}//********************************串行口请求判断块**************************** //********************************初始化函数块***************************void init_com() //寄存器初始化函数{SCON=0x50; //串行口工作方式0,多机通信,允许接收IE|=0X90; //定时器T1和总中断允许PCON=0X80; //SMOD为1TMOD|=0X21; //T1工作在方式2,T0工作在方式1TH1=250; //T1高八位赋值TR1=1; //T1打开TR0=1; //T0关闭}//********************************初始化函数块*********************void main(){init_com();while(1){receive(); //读取温湿度if(send_flag)//接收到询问{send_flag=0;puts("Wendu:");DispNum(TH);puts("Shidu:");DispNum(RH);Enter();}if(flag){flag=0;ES=0;Dill();ES=1;}}}。
基于51DHT11驱动

1.传感器性能说明测湿范围:20%~90% 测温范围:0~50C 测温精度:±2C 测湿精度:±5%RH2.接口说明长度大于20m时采用5K上拉电阻3.电源引脚电源供电电压:3~5.5V ,电源引脚(VCC,GND)可增加一个100nF的电容用以去耦滤波4.串行接口单线双向,采取但总线方式,一次通信时间为4ms,数据格式如下:湿度整数部分+湿度小数部分+温度整数部分+温度小数部分+温湿度校验和5.数据读取时序分析图一单总线读取时序(完整过程)图2 单总线读取时序(初始部分)图三数据0 表示方法图四数据1 表示方法总线空闲状态为高电平,总线把电平拉低等待DHT11响应,拉低时间必须大于18ms。
DHT11接到主机起始信号后,等待主机信号结束,然后发送80us电平表示响应。
主机发送起始信号后延时30-40us,读取响应信号。
(主机发送起始信号后可切换为输入模式,高电平亦可)7.基于51驱动的源码分析/** 基于51单片机的DHT11驱动程序* 其中假定51单片机的时钟频率为12M,并且单指令单周期,可得每个机器周期的时间为1/12M ×12 = 1us**/#include "dht11.h"#include "reg52.h"#define size 5 //设置数组的大小#define NUMBLE_50us 25 //设置延时的计数值#define NUMBLE_40us 20#define NUMBLE_80us 40#define ERROR -1#define OK 0sbit DHT11 = P1^0; //DHT11的单总线unsigned int status; //DHT11的数据读取状态unsigned char humi_value,temp_value; //温湿度值unsigned char arry_value[size]; //定义存取数组static void delay_ms(int x) //ms延时函数{unsigned int i,j;for(i = 100*x;i > 0 ;i--){delay_10us();}return ;}static void delay_10us() //10us延时函数{{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();return ;}static unsigned char DHT11_readvalue(){char i;unsigned char value = 0,count;for(i = 0; i < 8;i ++){value<<=1;count = 0;status = OK;while(DHT11 == 0 && count ++ < NUMBLE_50us); //读取每一数据位初始低电平为50usif(count >= NUMBE_50us){status = ERROR;return 0;}delay_10us;delay_10us;delay_10us;if(DHT11 != 0){value ++;count = 0;while(DHT11 != 0 && count++ < NUMBLE_40us); //读取一数据位为1,高电平为(40 + 30)usif(count >= NUMBLE_40us){status = ERROR; //读取数据位失败return 0;}}}return value;}static int DHT11_Readhum_temp(void){unsigned char count = 0;unsigned char i;unsigned int checkvalue = 0;DHT11 = 1;DHT11 = 0;delayms(20); //主机拉低18ms设置起始信号DHT11 = 1;delay_10us; //主机拉高并延时等待delay_10us;delay_10us;delay_10us;if(DHT11 != 0){return ERROR;}else{while(DHT11 == 0 && count ++ < NUMBLE_80us); //从机拉高80us响应if(count >= NUMBLE_80us){return ERROR;}DHT11 = 1;count = 0;while(DHT11 !=0 && count ++ < NUMBLE_80us); //从机拉高延时准备输出if(count >= NUMBLE_80us){return ERROR;}for(i = 0; i < size -1 ; i ++) //读取温湿度值{arry_value[i] = DHT11_readvalue();if(i != size -1){checkvalue + = arry_value[i]; //计算校验和}}if(arry_value[size -1] != checkvalue) //比较读取结果{return ERROR;}else{humi_value = arry_value[0]*10 + arry_value[1]; //读取湿度值temp_value = arry_value[2]*10 + arry_value[3]; //读取温度值}}return 0;}。
DHT11温湿度传感器与单片机之间的通信

DHT11温湿度传感器与单片机之间的通信一DHT11的简介:1 接口说明建议连接线长度短于20米时用5K上拉电阻,大于20米时根据实际情况使用合适的上拉电阻2数据帧的描述DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:一次完整的数据传输为40bit,高位先出。
数据格式:8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据+8bit校验和数据传送正确时校验和数据等于“8bit湿度整数数据+8bit湿度小数数据+8bi温度整数数据+8bit温度小数数据”所得结果的末8位。
3时序描述用户MCU发送一次开始信号后,DHT11从低功耗模式转换到高速模式,等待主机开始信号结束后,DHT11发送响应信号,送出40bit的数据,并触发一次信号采集,用户可选择读取部分数据。
从模式下,DHT11接收到开始信号触发一次温湿度采集,如果没有接收到主机发送开始信号,DHT11不会主动进行温湿度采集.采集数据后转换到低速模式。
1。
通讯过程如图1所示图1总线空闲状态为高电平,主机把总线拉低等待DHT11响应,主机把总线拉低必须大于18毫秒,保证DHT11能检测到起始信号.DHT11接收到主机的开始信号后,等待主机开始信号结束,然后发送80us低电平响应信号.主机发送开始信号结束后,延时等待20-40us后, 读取DHT11的响应信号,主机发送开始信号后,可以切换到输入模式,或者输出高电平均可, 总线由上拉电阻拉高.图2总线为低电平,说明DHT11发送响应信号,DHT11发送响应信号后,再把总线拉高80us,准备发送数据,每一bit数据都以50us低电平时隙开始,高电平的长短定了数据位是0还是1。
格式见下面图示。
如果读取响应信号为高电平,则DHT11没有响应,请检查线路是否连接正常.当最后一bit 数据传送完毕后,DHT11拉低总线50us,随后总线由上拉电阻拉高进入空闲状态。
DHT11温湿度传感器驱动程序 C51单片机

/**************DHT11 简单应用显示在数码管上(我的数码管是两个74HC595 不懂的可以问我)*********************************建议显示在液晶上******************/#include<reg52.h>#include<intrins.h>char T_H1,T_L1,RH_H1,RH_L1,checkdata1;char T_H2,T_L2,RH_H2,RH_L2,checkdata2;char F16T,F16RH,tshi,tge,rhshi,rhge;sbit DHT11 = P2^1;uchar bdata output;uchar location,j,i,ge,shi;uint num=0,num1,num2;uchar code segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, /*共阴7段LED段码表*/0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};sbit srclk=P4^2;sbit rclk = P4^1;sbit ser = P4^4;sbit out_put= output^7;/*传感器接受数据的响应命令*/void delay(uint x);void Delay32us();void Delay22ms();void Delay500ms();void shumaguan(uchar wei,uchar duan){output = wei;for(j=0;j<8;j++) //位码{ser = out_put;srclk=0;srclk=1;srclk=0;output = _crol_(output,1);}output = duan; //段码for(j=0;j<8;j++){ser=out_put;srclk=0;srclk=1;srclk=0;output = output<<1;}rclk=0;rclk=1;rclk=0;}void shuru(){num=0;while(num<1000){shumaguan(0x01,~segment[tshi]);shumaguan(0x02,~segment[tge]);shumaguan(0x10,~segment[rhshi]);shumaguan(0x20,~segment[rhge]);shumaguan(0,~segment[19]);}}char COM(void){char i,temp,comdata;/**判断信号时0还是1**/for(i=0;i<8;i++){while(!DHT11);Delay32us();temp=0;if(DHT11){temp=1;}//当DHT11变为低电平时,开始下bit 的传送comdata = comdata<<1;comdata = comdata|temp;while(DHT11);}return comdata;}/***主机的开始信号和从机的响应信号***//***********DHT11的主函数*********************/void getDHT11(){DHT11=0;Delay22ms(); //主机拉低22msDHT11=1;Delay32us(); //总线由上拉电阻拉高主机延时20-40us //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!DHT11) //T !{//判断从机是否发出80us 的低电平响应信号是否结束while(!DHT11);//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while(DHT11);/*****接收数据的命令每次传送八位******/RH_H1 = COM();RH_L1 = COM();T_H1 = COM();T_L1 = COM();checkdata1 = COM();if(T_H1+T_L1+RH_H1+RH_L1==checkdata1){RH_H2 = RH_H1;RH_L2 = RH_L1;T_H2 = T_H1;T_L2 = T_L1;F16RH = RH_H2+RH_L2/1000;F16T = T_H2+T_L2/1000;tshi = F16T/10;tge = F16T%10;rhshi = F16RH/10;rhge = F16RH%10;}}}/************主函数*************/void main(){EA = 1 ;ET0= 1;TR0 = 1;TMOD = 0X01;TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;while(1){DHT11=0;getDHT11();shuru();}}/**********延时子程序************************/void time1() interrupt 1 //延时20微秒{TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;num=num+1;num1=num1+1;num2=num2+1;}void Delay32us() //@12.000MHz{unsigned char i;_nop_();_nop_();i = 93;while (--i);}void Delay22ms() //@12.000MHz{unsigned char i, j, k;_nop_();_nop_();i = 2;j = 1;k = 201;do{do{while (--k);} while (--j);} while (--i);}/*******************************/。
实验报告-物联网通信技术-+GPIO外设及DHT11传感器通信显示

实验内容概要:物联网通信技术- GPIO外设及DHT11传感器通信显示1.实现温湿度传感器初始化, 显示温湿度,温度大于30 开风扇,否则关风扇。
2.. 模拟报警:当温度大于30度,蜂鸣器响和一颗红灯闪烁,低于30度蜂鸣器和红灯关当湿度大于50,风扇自动开,低于50风扇自动关3. lcd实现菜单控制led0-3并且显示温湿度实现制冷。
(1)菜单要求:(参考lcd菜单实现-消抖相关代码)menu1 *menu2menu3menu4(2)初始化led0,led1,led2,led3(3)UP按键,DOWN按键(4)温湿度数据显示到lcd(5)温度超过30就开启风扇,否则风扇停止实习内容总结(代码+运行截图):代码#include "stm32f10x.h"#include "LQ12864.h"#include "adc.h"#include "dth11.h"#include <stdio.h>#define UP 1#define DOWN 2#define NONE 0void main_delay(int ms){ int i = 0; int j = 0; while(ms--){ for(i = 0; i < 5; i++){ for(j = 0; j < 512; j++){ } } }}//定义函数:风扇初始化void fun_init(){//定义引脚配置结构体变量 GPIO_InitTypeDef init; //给出GPIO组的工作时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置引脚 init.GPIO_Pin = GPIO_Pin_8; //配置引脚的速度GPIO_Speed_50MHz init.GPIO_Speed = GPIO_Speed_50MHz; //配置引脚的模式GPIO_Mode_Out_PP init.GPIO_Mode = GPIO_Mode_Out_PP; //引脚配置初始化 GPIO_Init(GPIOA, &init); //配置引脚的数据 GPIO_SetBits(GPIOA, GPIO_Pin_8);}int main(void){ //定义变量,存储温湿度数据 char temp = 0;//存储温度 char hum = 0;//存储湿度 //定义显示数据的缓冲区数据:温度显示 char buf_temp[30]={0}; //分配的空间是30字节(char) //数组元素的大小是30个,分别是buf_temp[0]、buf_temp[1]、 //{0}静态初始化,给数组里存储数据 //定义显示数据的缓冲区数据:温度显示 char buf_hum[30]={0}; delay_init(); //调用函数:屏幕初始化 LCD_Init(); //调用函数:温湿度传感器的初始化 DHT11_Init(); //调用函数:风扇初始化 fun_init(); //轮询 while(1) { //循环获得传感器的数据DHT11_Read_Data(&temp,&hum);//参数1类型是u8 指针变量取temp变量地址 &temp //参数2类型是u8 指针变量取hum变量地址 &hum //sprintf,功能是字符串拼接到缓冲区存储 //sprintf,格式sprintf(存储数据的数组名字,数据格式,数据); // 数据->数据格式组织->存储数据的数组 //"temp:12" sprintf(buf_temp, "temp:%d ", temp); //参数1:存储数据的数组名字buf_temp //参数2:数据的格式字符串,%d格式占位符号,要填充整数数据 //参数3:整数数据 //过程,temp内容是12,拼接的字符串是"temp:12" //"hum:50" sprintf(buf_hum, "hum:%d ", hum); //显示数据到lcd 上 LCD_P8x16Str(8, 0, buf_temp); //参数1:x轴坐标,像素单位 //参数2:y轴坐标,行为单位 //参数3:现实的数据的数组名字 //显示数据到lcd上 LCD_P8x16Str(8, 2, buf_hum); //判断温度数据 if(temp > 30){ GPIO_ResetBits(GPIOA, GPIO_Pin_8); }else{ GPIO_SetBits(GPIOA, GPIO_Pin_8); } main_delay(300); }}效果截图:代码:#include "stm32f10x.h"#include "LQ12864.h"#include "adc.h"#include "dth11.h"#include <stdio.h>#define UP 1#define DOWN 2#define NONE 0void main_delay(int ms){ int i = 0; int j = 0; while(ms--){ for(i = 0; i < 5; i++){ for(j = 0; j < 512; j++){ } } }}//定义函数:风扇初始化void fun_init(){ //定义引脚配置结构体变量 GPIO_InitTypeDef init; //给出GPIO组的工作时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置引脚 init.GPIO_Pin = GPIO_Pin_8;//配置引脚的速度GPIO_Speed_50MHz init.GPIO_Speed = GPIO_Speed_50MHz; //配置引脚的模式GPIO_Mode_Out_PP init.GPIO_Mode = GPIO_Mode_Out_PP; //引脚配置初始化GPIO_Init(GPIOA, &init); //配置引脚的数据 GPIO_SetBits(GPIOA, GPIO_Pin_8);}//定义函数:蜂鸣器初始化void buzzer_Init(){ //定义引脚配置结构体变量 GPIO_InitTypeDef init; //给出GPIO组的工作时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置引脚init.GPIO_Pin = GPIO_Pin_2; //配置引脚的速度GPIO_Speed_50MHz init.GPIO_Speed = GPIO_Speed_50MHz; //配置引脚的模式GPIO_Mode_Out_PP init.GPIO_Mode = GPIO_Mode_Out_PP; //引脚配置初始化 GPIO_Init(GPIOA, &init); //配置引脚的数据 GPIO_SetBits(GPIOA, GPIO_Pin_2); }//LED初始化void led_Init(){ //定义引脚配置结构体变量 GPIO_InitTypeDef init; //给GPIO组的工作时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //配置引脚编号 init.GPIO_Pin = GPIO_Pin_15; //配置引脚的速度GPIO_Speed_50MHz init.GPIO_Speed = GPIO_Speed_50MHz; //配置引脚模式GPIO_Mode_Out_PP init.GPIO_Mode = GPIO_Mode_Out_PP; //引脚配置初始化GPIO_Init(GPIOA, &init); //配置引脚数据 GPIO_SetBits(GPIOA, GPIO_Pin_15);}int main(void){ //定义变量,存储温湿度数据 char temp = 0;//存储温度 char hum = 0;//存储湿度 //定义显示数据的缓冲区数据:温度显示 char buf_temp[30]={0}; //分配的空间是30字节(char) //数组元素的大小是30个,分别是buf_temp[0]、buf_temp[1]、 //{0}静态初始化,给数组里存储数据 //定义显示数据的缓冲区数据:温度显示 char buf_hum[30]={0}; delay_init(); //调用函数:屏幕初始化 LCD_Init(); //调用函数:温湿度传感器的初始化 DHT11_Init(); //调用函数:风扇初始化 fun_init(); //函数调用:蜂鸣器初始化 buzzer_Init(); //调用函数:LED初始化 led_Init(); //调用函数:按键初始化 //轮询 while(1) { //循环获得传感器的数据 DHT11_Read_Data(&temp,&hum); //参数1类型是u8 指针变量取temp变量地址 &temp //参数2类型是u8 指针变量取hum变量地址&hum //sprintf,功能是字符串拼接到缓冲区存储 //sprintf,格式sprintf(存储数据的数组名字,数据格式,数据);// 数据->数据格式组织->存储数据的数组//"temp:12" sprintf(buf_temp, "temp:%d ", temp); //参数1:存储数据的数组名字buf_temp //参数2:数据的格式字符串,%d格式占位符号,要填充整数数据 //参数3:整数数据 //过程,temp 内容是12,拼接的字符串是"temp:12" //"hum:50" sprintf(buf_hum, "hum:%d ", hum); //显示数据到lcd上 LCD_P6x8Str(10, 1, buf_temp); //参数1:x轴坐标,像素单位 //参数2:y 轴坐标,行为单位 //参数3:现实的数据的数组名字 //显示数据到lcd上 LCD_P6x8Str(10, 3, buf_hum); //判断温度数据if(temp > 30){ GPIO_ResetBits(GPIOA, GPIO_Pin_2); GPIO_ResetBits(GPIOA, GPIO_Pin_15); }else{ GPIO_SetBits(GPIOA, GPIO_Pin_2); GPIO_SetBits(GPIOA, GPIO_Pin_15); } if(hum > 77){ GPIO_ResetBits(GPIOA, GPIO_Pin_8); }else{ GPIO_SetBits(GPIOA, GPIO_Pin_8); } main_delay(500); }}效果截图:代码#include "stm32f10x.h"#include "LQ12864.h"#include <stdio.h>#define NONE 0#define UP 1#define DOWN 2void main_delay(int ms){ int i = 0; int j = 0; while(ms--){ for(i = 0; i < 5; i++){ for(j = 0; j < 512; j++){ } } }}void key_init(){ GPIO_InitTypeDef init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); init.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_4; init.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &init);}int read_key(){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0){ main_delay(100); while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_2) == 0){ } return UP; } if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0){ main_delay(100); while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0){ } return DOWN; } return NONE;}void LED_GPIO_Config(void){ GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3 ; GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOB,&GPIO_InitStruct); //默认关闭所有灯 GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3); }void led_show(int flag){ //关闭所有灯 GPIO_SetBits(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 |GPIO_Pin_3); if(flag == 1){ GPIO_ResetBits(GPIOB, GPIO_Pin_0); } if(flag == 2){ GPIO_ResetBits(GPIOB, GPIO_Pin_1); } if(flag == 3){ GPIO_ResetBits(GPIOB, GPIO_Pin_2); } if(flag == 4){ GPIO_ResetBits(GPIOB, GPIO_Pin_3); }}void fanInit(){GPIO_InitTypeDef init; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//启动PB时钟init.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式init.GPIO_Pin = GPIO_Pin_4; init.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB,&init); //默认不转 GPIO_SetBits(GPIOB, GPIO_Pin_4);} int main(void){ char temp,hum; char buf_temp[30] = {0}; char buf_hum[30] = {0};int i = 0; int flag = 1; char *menu[4] = {"menu1", "menu2", "menu3", "menu4"}; int key = 0; delay_init(); LCD_Init(); DHT11_Init(); key_init(); //led初始化 LED_GPIO_Config(); //风扇初始化fanInit(); while(1) { for(i = 0; i < 4; i++){ LCD_P6x8Str(0, i + 1, menu[i]); } LCD_P6x8Str(32, flag, "*"); led_show(flag); key = read_key(); if(key == UP){ LCD_P6x8Str(32, flag, " "); flag = flag == 1 ? 4 : flag - 1; } if(key == DOWN){LCD_P6x8Str(32, flag, " "); flag = flag == 4 ? 1 : flag + 1; } DHT11_Read_Data(&temp, &hum); sprintf(buf_temp, "temp:%d", temp); sprintf(buf_hum, "hum:%d", hum); LCD_P6x8Str(0, 5, buf_temp); LCD_P6x8Str(0, 7, buf_hum); //temp > 30 if(temp >= 30){ //转风扇 GPIO_ResetBits(GPIOB, GPIO_Pin_4); }else{ GPIO_SetBits(GPIOB, GPIO_Pin_4); } main_delay(100); }}效果截图:技术问题总结:技术:DHT11 温湿度传感器传输方式问题解决方案:单总线传输方式只有一个DATA线一次传输数据 40bit(40位) 23.45 12.45 8bit(湿度整数部分)+8bit(湿度小数部分)+8bit(温度整数部分)+8bit(温度小数部分)+8bit(校验位) 单总线传输数据的时候容易丢失会使用校验位。
dht11使用手册

dht11使用手册
(原创版)
目录
1.DHT11 简介
2.DHT11 的功能
3.DHT11 的使用方法
4.DHT11 的优点和局限性
5.DHT11 的应用领域
正文
一、DHT11 简介
DHT11 是一款基于单片机技术的温湿度传感器,具有体积小、精度高、响应速度快等特点。
它可以实时监测环境温度和湿度,并将检测到的数据通过数字信号输出,便于后端处理。
二、DHT11 的功能
1.实时监测环境温度:DHT11 可以实时测量环境温度,并将温度值以数字信号输出。
2.实时监测环境湿度:DHT11 可以实时测量环境湿度,并将湿度值以数字信号输出。
3.数字信号输出:DHT11 采用数字信号输出,方便后端处理和分析数据。
三、DHT11 的使用方法
1.连接电路:根据电路图连接 DHT11 的 VCC、GND、DATA 等引脚。
2.上传程序:将编写好的程序上传至单片机,启动 DHT11 的温湿度检测功能。
3.数据接收与处理:通过单片机接收 DHT11 输出的数字信号,并进行数据处理和分析。
四、DHT11 的优点和局限性
1.优点:体积小、精度高、响应速度快、使用简便、成本低。
2.局限性:抗干扰能力较弱,受环境影响较大,不能应用于高温高湿环境。
五、DHT11 的应用领域
1.智能家居:实时监测室内温湿度,调节空调、加湿器等设备。
2.农业生产:监测温室大棚内温湿度,调节通风、灌溉等措施。
3.医疗保健:监测病房、手术室等场所的温湿度,为患者提供舒适的环境。
DHT11温湿度传感器驱动程序 C51单片机

/**************DHT11 简单应用显示在数码管上(我的数码管是两个74HC595 不懂的可以问我)*********************************建议显示在液晶上******************/#include<reg52.h>#include<intrins.h>char T_H1,T_L1,RH_H1,RH_L1,checkdata1;char T_H2,T_L2,RH_H2,RH_L2,checkdata2;char F16T,F16RH,tshi,tge,rhshi,rhge;sbit DHT11 = P2^1;uchar bdata output;uchar location,j,i,ge,shi;uint num=0,num1,num2;uchar code segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77, /*共阴7段LED段码表*/0x7c,0x39,0x5e,0x79,0x71,0x76,0x73,0x3e,0x00};sbit srclk=P4^2;sbit rclk = P4^1;sbit ser = P4^4;sbit out_put= output^7;/*传感器接受数据的响应命令*/void delay(uint x);void Delay32us();void Delay22ms();void Delay500ms();void shumaguan(uchar wei,uchar duan){output = wei;for(j=0;j<8;j++) //位码{ser = out_put;srclk=0;srclk=1;srclk=0;output = _crol_(output,1);}output = duan; //段码for(j=0;j<8;j++){ser=out_put;srclk=0;srclk=1;srclk=0;output = output<<1;}rclk=0;rclk=1;rclk=0;}void shuru(){num=0;while(num<1000){shumaguan(0x01,~segment[tshi]);shumaguan(0x02,~segment[tge]);shumaguan(0x10,~segment[rhshi]);shumaguan(0x20,~segment[rhge]);shumaguan(0,~segment[19]);}}char COM(void){char i,temp,comdata;/**判断信号时0还是1**/for(i=0;i<8;i++){while(!DHT11);Delay32us();temp=0;if(DHT11){temp=1;}//当DHT11变为低电平时,开始下bit 的传送comdata = comdata<<1;comdata = comdata|temp;while(DHT11);}return comdata;}/***主机的开始信号和从机的响应信号***//***********DHT11的主函数*********************/void getDHT11(){DHT11=0;Delay22ms(); //主机拉低22msDHT11=1;Delay32us(); //总线由上拉电阻拉高主机延时20-40us //判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!DHT11) //T !{//判断从机是否发出80us 的低电平响应信号是否结束while(!DHT11);//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while(DHT11);/*****接收数据的命令每次传送八位******/RH_H1 = COM();RH_L1 = COM();T_H1 = COM();T_L1 = COM();checkdata1 = COM();if(T_H1+T_L1+RH_H1+RH_L1==checkdata1){RH_H2 = RH_H1;RH_L2 = RH_L1;T_H2 = T_H1;T_L2 = T_L1;F16RH = RH_H2+RH_L2/1000;F16T = T_H2+T_L2/1000;tshi = F16T/10;tge = F16T%10;rhshi = F16RH/10;rhge = F16RH%10;}}}/************主函数*************/void main(){EA = 1 ;ET0= 1;TR0 = 1;TMOD = 0X01;TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;while(1){DHT11=0;getDHT11();shuru();}}/**********延时子程序************************/void time1() interrupt 1 //延时20微秒{TH0 = (65536-1000)/256;TL0 = (65536-1000)%256;num=num+1;num1=num1+1;num2=num2+1;}void Delay32us() //@12.000MHz{unsigned char i;_nop_();_nop_();i = 93;while (--i);}void Delay22ms() //@12.000MHz{unsigned char i, j, k;_nop_();_nop_();i = 2;j = 1;k = 201;do{do{while (--k);} while (--j);} while (--i);}/*******************************/。
51单片机+DHT11温控程序-可设置温度值

51单片机+DHT11温控程序-可设置温度值基于51 单片机的温湿度测量控制程序,使用DHT11 数字传感器,用1602液晶屏显示,按键定义如下:sbit key_1=P0;//确定按键sbit key_2=P0 ; //按键加sbit key_3=P0;//按键减本程序中用到的头文件12c5a.h 下载:51hei/f/12c5a.rar#include “12c5a.H”#include“intrins.h”unsigned char code num[]={“0123456789”};//显示字符存储unsigned char code start_char[]={“Loading....”};unsigned char code t_char[]={“NOW TEMP IS”};unsigned char *pnum=num;unsigned int bbb,ccc,temp,temp_high,temp_low;#define ADC_POWER 0x80 //ADC power control bit#define ADC_FLAG 0x10 //ADC completeflag#define ADC_START 0x08 //ADC start control bit#define ADC_SPEEDLL 0x00 //540 clocks#define ADC_SPEEDL 0x20 //360 clocks#define ADC_SPEEDH 0x40 //180 clocks#define ADC_SPEEDHH 0x60 //90 clockssbit RS=P3;//数据命令选择端sbit RW=P3 ; //读写控制端sbit E=P3;//使能信号控制端//sbit key_0=P0; //设置按键sbit key_1=P0;//确定按键sbitkey_2=P0 ; //按键加sbit key_3=P0;//按键减sbit P04=P0;sb it P05=P0 ;sbitP06=P0;void key_temphigh();void key_templow();void key_scan();void delay_1602(unsigned int a);void init_1602(void);void WR_data_1602(unsigned char adata,unsigned char i);void process(unsigned int shuju);void Delay(unsigned char n){ int x; while (n--) { x = 500; while (x--); }}void init_ADC(void){P1ASF=0xFF;ADC_RES = 0;ADC_RESL = 0;ADC_CONTR = 0x88;Delay(2);}unsigned int GetResult(void){unsigned char m,n;unsigned int aaa; init_ADC();。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//****************************************************************////DHT 使用范例//单片机 AT89S5 或 STC89C5 RC// 功能 串口发送温湿度数据波特率 9600//硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地电源和地 单片机串口加MAX 3 连接电脑// 公司 济南联诚创发科技有限公司//****************************************************************//#include <reg5 .h>#include <intrins.h>//typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3位整型变量 */typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 *///#define uchar unsigned char#define uint unsigned int#define Data_0_time 4//----------------------------------------------////----------------IO口定义区--------------------////----------------------------------------------//sbit P _0 = P ^0 ;sbit P _ = P ^ ;sbit P _ = P ^ ;sbit P _3 = P ^3 ;//----------------------------------------------////----------------定义区--------------------// //----------------------------------------------//U8 U8FLAG,k;U8 U8count,U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;U8 U8comdata;U8 outdata【5】; //定义发送地字节数U8 indata【5】;U8 count, count_r=0;U8 str【5】={"RS 3 "};U 6 U 6temp ,U 6temp ;SendData(U8 *a){outdata【0】 = a【0】;outdata【 】 = a【 】;outdata【 】 = a【 】;outdata【3】 = a【3】;outdata【4】 = a【4】;count = ;SBUF=outdata【0】;}void Delay(U 6 j){ U8 i;for(;j>0;j--){for(i=0;i< 7;i++);}}void Delay_ 0us(void){U8 i;i--;i--;i--;i--;i--;i--;} void COM(void){U8 i;for(i=0;i<8;i++){U8FLAG= ;//----------------------P _ =0 ; //TP _ = ; //T//----------------------while((!P _0)&&U8FLAG++);Delay_ 0us();Delay_ 0us();// Delay_ 0us();U8temp=0;if(P _0)U8temp= ;U8FLAG= ;while((P _0)&&U8FLAG++);//----------------------P_ =0 ; //TP _ = ; //T//----------------------//超时则跳出for循环if(U8FLAG== )break;//判断数据位是0还是// 如果高电平高过预定0高电平值则数据位为U8comdata<<= ;U8comdata|=U8temp; //0}//rof}//--------------------------------//-----湿度读取子程序 ------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位== U8T_data_H------ //----温度低8位== U8T_data_L------//----湿度高8位== U8RH_data_H-----//----湿度低8位== U8RH_data_L-----//----校验 8位 == U8checkdata-----//----调用相关子程序如下----------//---- Delay();, Delay_ 0us();,COM();//--------------------------------void RH(void){//主机拉低 8msP _0=0;Delay( 80);P _0= ;//总线由上拉电阻拉高主机延时 0usDelay_ 0us();Delay_ 0us();Delay_ 0us();Delay_ 0us();//主机设为输入判断从机响应信号P _0= ;//判断从机是否有低电平响应信号如不响应则跳出 响应则向下运行if(!P _0) //T !{U8FLAG= ;//判断从机是否发出 80us 地低电平响应信号是否结束while((!P _0)&&U8FLAG++);U8FLAG= ;//判断从机是否发出 80us 地高电平 如发出则进入数据接收状态while((P _0)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P _0= ;//数据校验 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_t emp);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;}//fi}//fi}//----------------------------------------------//main()功能描述: AT89C5 .059 MHz 串口发//送温湿度数据,波特率 9600//----------------------------------------------void main(){U8i,j;//uchar str【6】={"RS 3 "};/*系统初始化 */TMOD = 0x 0; //定时器T 使用工作方式TH = 53; // 设置初值TL = 53;TR = ; // 开始计时SCON = 0x50; //工作方式 波特率9600bps 允许接收ES = ;EA = ; // 打开所以中断TI = 0;RI = 0;SendData(str) ; //发送到串口Delay( ); //延时 00US M晶振) while( ){//------------------------//调用温湿度读取子程序RH(); //串口显示程序//--------------------------str【0】=U8RH_data_H;str【 】=U8RH_data_L;str【 】=U8T_data_H;str【3】=U8T_data_L;str【4】=U8checkdata;SendData(str) ; //发送到串口//读取模块数据周期不易小于 SDelay( 0000);}//elihw}// mainvoid RSINTR() interrupt 4 using{U8 InPut3;if(TI== ) //发送中断{TI=0;if(count!=5) //发送完5位数据{SBUF= outdata【count】;count++;}}if(RI== ) //接收中断{InPut3=SBUF;indata【count_r】=InPut3;count_r++;RI=0;if (count_r==5)//接收完4位数据{//数据接收完毕处理。