【最新编排】基于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();。
AVR外设汇总之DHT11温湿度传感器+串口
//RXEN 位置 1 接收使能,使 USART 处于能够接收的状态 //TXEN 位置 1 发送使能,使 USART 处于能够发送的状态 UCSRB|=_BV(RXEN)|_BV(TXEN); //URSEL 位置 1 设置使用 UCSRC 寄存器 //UCSZ0 和 UCSZ1 位都置 1,设置数据帧包含的数据位数为 8 位 UCSRC|=_BV(URSEL)|_BV(UCSZ1)|_BV(UCSZ0); //在波特率寄存器中设置波特率的值,高四位的值为 0,低八位的值为 23. //7372800/19200/16-1=23,设置的波特率为 19200Hz
UBRRH=0; UBRRL=23; } //获得一个字符 u8 get_c(void) { //当 UCSRA 的 RXC 位为 1 时,表示 UDR 中有未读出的 8 位数据(即一个字符) while(!(UCSRA&_BV(RXC))); return UDR; } //输出一个字符 void put_c(u8 chr) { //当 UCSRA 的 UDRE 位为 1 时,表示 UDR 为空可以向外传送数据(一个字符) while(!(UCSRA&_BV(UDRE))); UDR=chr; } //输出字符串 void put_string(char *tmp) { while(*tmp!='\0') {
基于单片机采集DHT11传感器的数据
从图中可以看出,系统有微处理器模块、DHT11传感器模块、阈值设置模块、1602字符液晶显示模块、报警模块组成。在方案设计中,外围模块采用并行控制,以简化系统,提高控制精度。该设计以AT89S52单片机为控制核心,实现温湿度采集及显示的基本功能。
1.4.2 总体设计工作进程
本次设计相对而言有两个部分弄明白了就能够设计好了。一个是液晶显示部分,一个是DHT11传感器部分。传感器比较陌生,以前没有接触太多,液晶相对而言比较容易点。因此这次先攻克了液晶显示部分,然后再拿下传感器部分。整个流程如下图所示:
阈值设置模块通过三个按键来实现阈值设置功能的。使得在不同环境下设置阈值提供了极大的方便,不需要每次都在程序里改动然后再烧录,省去了复杂的过程。
1.4 总体设计简介
1.4.1总体设计框图
按照系统功能的具体要求,在保证实现其功能的然础上,尽可能降低系统成本。总体设计方 案围绕上述思想,初步确定系统的方案如图1-1所示。
大连海事大学自动化课程设计
基于单片机的温湿度
检测控制系统
2009届自动化
学 号2220093699
学生姓名
指导教师
目 录
第1章总体设计概述
1.1 课题的背景和意义
温度、湿度和人类的生产、生活有着密切的关系,同时也是工业生产中最常见最基本的工艺参数,例如机械、电子、石油、化工等各类工业中广泛需要对温度湿度的检测与控制。并且随着人们生活水平的提高,人们对自己的生存环境越来越关注。而空气中温湿度的变化与人体的舒适度和情绪都有直接的影响,所以对温度湿度的检测及控制就非常有必要了。
图2-2 DHT11典型应用电路
(3)数据帧的描述:
DATA 用于微处理器与 DHT11之间的通讯和同步,采用单总线数据格式,一次通讯时间4ms左右,数据分小数部分和整数部分,具体格式在下面说明,当前小数部分用于以后扩展,现读出为零.操作流程如下:
51单片机dht11的工作流程
51单片机dht11的工作流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!1. 初始化设置单片机的引脚为输入模式,用于接收 DHT11 的数据。
DHT11说明
用户单片机发送一次开始信号后,DHT11 从低功耗模式转换到高速模式,待主机开始信号结束后,DHT11 发送响应信号,送出 40bit 的数据,并触发一次信采集。
信号发送如图所示。
数据时序图注:主机从 DHT11 读取的温湿度数据总是前一次的测量值,如两次测间隔时间很长,请连续读两次以第二次获得的值为实时温湿度值。
外设读取步骤步骤一:DHT11 上电后(DHT11 上电后要等待 1S 以越过不稳定状态在此期间不能发送任何指令),测试环境温湿度数据,并记录数据,同时 DHT11 的 DATA 数据线由上拉电阻拉高一直保持高电平;此时DHT11 的DATA 引脚处于输入状态,时刻检测外部信号。
步骤二:单片机的 I/O 设置输出低电平,且低电平保持时间不能小于18ms,然后单片机的 I/O置高电位,为输入状态,等待 DHT11 作出回答信号,发送信号如图所示:步骤三:DHT11 的 DATA 引脚检测到外部信号有低电平时,等待外部信号低电平结束,延迟后 DHT11 的 DATA引脚处于输出状态,输出 80 微秒的低电平作为应答信号,紧接着输出 80 微秒的高电平通知外设准备接收数据,单片机的 I/O 检测到有低电平(DHT11 回应信号)后,等待 80 微秒的高电平后的数据接收,发送信号如图所示:步骤四:由 DHT11 的 DATA 引脚输出 40 位数据,微处理器根据 I/O 电平的变化接收 40 位数据。
“0”的格式为: 50 微秒的低电平和 26-28 微秒的高电平,“1”的格式为: 50 微秒的低电平加 70微秒的高电平。
“0”、“1”格式信号如图所示:结束信号:DHT11 的 DATA 引脚输出 40 位数据后,继续输出低电平 50 微秒后转为输入状态,由于上拉电阻随之变为高电平。
自动测量数据重装,等待外部信号的到来。
自我理解:单片机响应部分:开始—》18ms的低电平——》置高电平(等待信号)——》检测到被拉低80us ——》紧接是高电平80us——》 40数据位——》最后50us低电平——》结束8位湿整+ 8位湿小+8位温整+ 8位温小+8位校验码。
51单片机dht11驱动程序(1)
H文件:#ifndef __DHT11_H__#define __DHT11_H__#include <reg52.h>sbit DA TA=P3^3;void DHT11_DA TA(unsigned char *str); //接收温度+湿度数据并且校验#endifC文件:#include "dht11.h"#include <intrins.h>static unsigned char flag;void Delayus(void){unsigned char i;for(i=0;i<1;i++);}void Delay10ms(void)//12M晶振下延时{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--){for(k=248;k>0;k--);}}void Start(void){DA TA=1;Delay10ms();DA TA=0;Delay10ms(); //主机把总线拉低必须大于18ms 保证DHT11能检测到起始信号Delay10ms();Delay10ms();DA TA=1;Delayus(); //发送开始信号结束后 拉高电平延时20-40usDelayus();Delayus();}unsigned char Receive_byte(void)//接收一个字节{static unsigned char i,temp;static unsigned char data_byte;for (i=0;i<8;i++){ flag=2;while((!DA TA)&&flag++); //等待50us的低电平开始信号结束Delayus();//时间为26us-28us 表示接收的为数据'0'Delayus();Delayus();temp=0;flag=2;if(DA TA==1)temp=1;flag=2;while(DA TA&&flag++);//等待数据信号高电平 '0'为26us-28us '1'为70us if(flag==1)break;data_byte<<=1;//接收的数据为高位在前 右移data_byte|=temp;}return data_byte;}void DHT11_DA TA( unsigned char *str) //接收温度+湿度数据并且校验{ static unsigned char T_H,T_L,R_H,R_L,check,num_check;Start();//开始信号DA TA=1;if(!DA TA){flag=2;while((!DA TA)&&flag++);//判断从机发出80us的低电平响应信号是否结束//flag=2;while(DA TA&&flag++); //判断从机发出80us的高电平是否结束 如结束则主机进入数据接收状态R_H=Receive_byte();//湿度高位R_L=Receive_byte();//湿度低位T_H=Receive_byte();//温度高位T_L=Receive_byte();//温度低位check=Receive_byte();//校验位DA TA=0; //当最后一bit数据接完毕后 从机拉低电平50us//Delayus();Delayus();Delayus();Delayus();Delayus();Delayus();DA TA=1;num_check=R_H+R_L+T_H+T_L;if(num_check==check)//判断读到的四个数据之和是否与校验位相同{//温湿度低8位数据为零*str=T_H; str++;*str=R_H; str++;*str='\0';check=num_check;}}}。
DHT11自定义总线通信协议实例详解(附详细示波器实测波形图)
DHT11详解有的时候,外围器件与MCU之间的通信并不是常见通用的通信方式,而是厂家自定义的一种通信格式。
所以,最重要的应该是掌握根据时序图编写驱动程序的能力,本文通过对一种利用厂家自定义的通信格式和MCU之间通信的详细讲解,以期让读者掌握这种能力。
在本文就以DHT11数字温湿度传感器为例来讲解。
一、DHT11与MCU的通信协议首先需要得到DHT11的Datasheet,然后根据Datasheet编写程序。
DHT11的Datasheet前面部分是该传感器的介绍和一些接口及其相关性能参数的说明,这部分读者可以自己去看,我们关注的是改手册的第4部分:串行接口(单线双向)。
接下来详细讲解这一部分。
DHT11的DATA引脚用于微处理器与DHT11之间的通讯和同步,采用单总线的数据格式,一次通信时间为4ms左右。
先来看一下MCU发送开始信号和DHT11响应信号这部分的时序图:图1 开始信号和响应信号时序图从图1可以看出,总线空闲的时候为高电平(图1第1段的前面所示),MCU 把总线拉低至少18ms(图1第1段),然后拉高总线(图1第2段)等待DHT11响应。
DHT11接收到MCU的开始信号后,等待MCU开始信号结束,然后发送80us 低电平响应信号(图1第3段),然后DHT11拉高总线80us(图1第4段)准备输出数据。
图1第5段和图1第6段分别是数据1和数据0的格式。
根据图1编写的MCU开始信号如下:#define DHT_IO PORTA_PA0void DHT11_init(void){DHT_IO=1;DDRA_DDRA0=0xFF; //总线空闲高电平DHT_IO = 0; //总线拉低DDRA_DDRA0 = 0xFF; //设置为输出Dlyms(18); //主机至少拉低18msDHT_IO = 1; //释放总线delay_us(19); //主机拉高20~40usDDRA_DDRA0 = 0x00; //设置为输入,等待DHT11响应}实测的MCU发出开始信号的波形如下:图二 MCU发出开始信号从图2可以看出,MCU把总线拉低18.2ms(图2中两光标之间的部分,对应于图1的第1部分),满足Datasheet中规定的数值。
dht11使用手册
dht11使用手册(原创实用版)目录1.DHT11 简介2.DHT11 的功能与特点3.DHT11 的使用方法4.DHT11 的安装与连接5.DHT11 的注意事项6.DHT11 的故障排除正文【DHT11 简介】DHT11 是一款数字温湿度传感器,它可以实时测量环境内的温度和湿度,并将数据通过数字信号传输到相关的设备中。
DHT11 具有测量精度高、响应速度快、可靠性强等特点,广泛应用于智能家居、农业生产、实验室环境监测等领域。
【DHT11 的功能与特点】DHT11 的主要功能是测量环境内的温度和湿度,并将数据以数字信号的形式输出。
其主要特点如下:1.测量精度高:DHT11 的温度测量范围为 -40℃至 +85℃,湿度测量范围为 0% 至 100%,测量精度分别为±0.5℃和±5%。
2.响应速度快:DHT11 的响应速度非常快,可以在短时间内输出准确的测量数据。
3.可靠性强:DHT11 采用数字化信号输出,具有较强的抗干扰能力,能够在恶劣环境下正常工作。
4.接口简单:DHT11 采用单线制串行通信接口,便于与各种微控制器、计算机等设备相连。
【DHT11 的使用方法】在使用 DHT11 时,需要将其与相关的微控制器、计算机等设备相连。
以下是 DHT11 与 Arduino 连接的示例:1.将 DHT11 的数据线连接到 Arduino 的数字接口,如 D2 和 D3。
2.将 DHT11 的 VCC 连接到 Arduino 的 5V 接口。
3.将 DHT11 的 GND 连接到 Arduino 的 GND 接口。
4.上传相关代码到 Arduino,以实现对 DHT11 的控制和数据读取。
【DHT11 的安装与连接】DHT11 的安装与连接较为简单,以下是一般步骤:1.根据实际需求选择合适的安装位置,如墙壁、天花板等。
2.使用螺丝钉将 DHT11 固定在安装位置上。
3.将 DHT11 的数据线、VCC 线和 GND 线分别连接到相应的设备接口上。
DHT11接口通信-KC08141102-d02.
5
DHT11接口通信
3.串行单总线器件
单总线通信简介
在这里,根据单总线原理把挂在单总线上的器件统称为单总线器件,这些器件内部都具有控制、
收/发、储存等电路。为了区分不同的单总线器件,各个芯片厂家生产器件时都会设置一个 64位的二 进制代码,用它来作为标识单总线器件的ID号。 主、从机通信三步骤: 1. 初始化单总线器件
SCI总线是以异步方式进行通信(即1条数据输入线和1条数据输出线)。
然而,以上这些总线至少都需要两条或两条以上的信号线。
单总线(1-wire Bus)技术。该技术与上述总线不同。它采用单根信号线,既可传输时钟,又能传
输数据,而且数据传输是双向的。
3
DHT11接口通信
1.串行单总线概述
单总线通信简介
8
DHT11接口通信
DHT11的数据格式
DHT11数字温湿度传感器采用单总线数据格式。即单个数据引脚端口 完成输入输出双向传输。每次数据包的长度由 5Byte(40Bit)组成,分小 数部分和整数部分。 数据格式:8bit湿度整数数据+8bit湿度小数数据+8bit温度整数数据 +8bit温度小数数据+8bit校验和。
单总线适用于单主机系统,能够控制一个或多个从机设备。单主机多节点系统如下图所示。
4Байду номын сангаас
DHT11接口通信
2.串行单总线工作原理
单总线通信简介
由于只有一根数据线要实现数据交换和控制。设备(无论主机或从机)都通过一个漏极开路或三 态端口连至该数据线,这样使得设备在不发送数据时释放总线,以便总线上其他设备可以使用总线, 其内部等效电路如图2所示。
2. 识别单总线器件
- 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位数据{//数据接收完毕处理。