ZIGBEE温湿度传感器代码分析
传感器介绍 产品详细介绍 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,它应用专用的数字模块采集技术和温湿度传感技术,确保产品具有极高的可靠性和卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测温元件,并与一个高性能8位单片机相连接。因此该产品具有品质卓越、超快响应、抗干扰能力强、性价比极高等优点。每个DHT11传感器都在极为精确的湿度校验室中进行校准。校准系数以程序的形式存在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。单线制串行接口,使系统集成变得简易快捷。超小的体积、极低的功耗,使其成为该类应用中,在苛刻应用场合的最佳选择。产品为4针单排引脚封装,连接方便。 典型应用电路 传感器协议 单总线(OneWire)协议介绍 1-wire 单总线是 Maxim 全资子公司 Dallas 的一项专有技术与目前多数标准串行数据通信方式,如 SPI/I2C/MICROWIRE不同,它采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的。它具有节省 I/O口线资源、结构简单、成本低廉、便于总线扩展和维护等诸多优点。 协议图示 代码分析 裸机代码 #include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char #define wenshi P0_6 //温湿度定义 uchar ucharFLAG,uchartemp; uchar shidu_shi,shidu_ge,wendu_shi,wendu_ge=4; uchar ucharT_data_H,ucharT_data_L,ucharRH_data_H,ucharRH_data_L,ucharcheckdata; uchar ucharT_data_H_temp,ucharT_data_L_temp,ucharRH_data_H_temp,ucharRH_data_L_temp,ucharcheckdata_temp; uchar ucharcomdata; uchar temp[2]={0,0}; uchar temp1[5]="temp="; uchar humidity[2]={0,0}; uchar humidity1[9]="humidity="; /**************************** 延时函数 *****************************/ void Delay_us() //1 us延时 { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } void Delay_10us() //10 us延时 { Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); Delay_us(); } void Delay_ms(uint Time)//n ms延时 { unsigned char i; while(Time--) { for(i=0;i<100;i++) Delay_10us(); } } /*********************** 温湿度传感 ***********************/ void COM(void) // 温湿写入 { uchar i; for(i=0;i<8;i++) /// for 循环 8 次 每次读 一个位 { ucharFLAG=2; while((!wenshi)&&ucharFLAG++); //等DHT11 拉高 Delay_10us(); Delay_10us(); Delay_10us(); /// 30 us 之后 uchartemp=0; if(wenshi)uchartemp=1; //如果还是 高 得 bit = 1 ucharFLAG=2; // 否则 bit = 0 while((wenshi)&&ucharFLAG++); // 等待拉低 if(ucharFLAG==1)break;/// 超时吗?? 不太懂 ucharcomdata<<=1; // 左移一位 ucharcomdata|=uchartemp; // 把读取到的赋值 } } void DHT11(void) //温湿传感启动 { wenshi=0; // 先将 DATA数据线接口拉低 Delay_ms(19); // 延迟大于18 毫秒 复位 wenshi=1; /// 拉高 DATA 数据线 P0DIR &= ~0x40; // 将 DATA 接口 从 输出 设置为输入 Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); /// 延时 40 us 拉低了40 us if(!wenshi) // 此时 DHT11 应该 拉低DATA数据线 { ucharFLAG=2; while((!wenshi)&&ucharFLAG++); // 等待拉高 并设置超时 ucharFLAG=2; while((wenshi)&&ucharFLAG++); // 拉高完成 接下来将会开始传输数据 COM(); // 调用读取函数 ucharRH_data_H_temp=ucharcomdata; //读取出湿度高8 COM(); ucharRH_data_L_temp=ucharcomdata; // 读取出湿度底8 COM(); ucharT_data_H_temp=ucharcomdata; // 读取出温度高8 COM(); ucharT_data_L_temp=ucharcomdata; // 读取出温度低8 COM(); ucharcheckdata_temp=ucharcomdata; // 数据校验码 wenshi=1; //// 拉高 DAta uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp); if(uchartemp==ucharcheckdata_temp) // 校验数据 { ucharRH_data_H=ucharRH_data_H_temp; ucharRH_data_L=ucharRH_data_L_temp; ucharT_data_H=ucharT_data_H_temp; ucharT_data_L=ucharT_data_L_temp; ucharcheckdata=ucharcheckdata_temp; } wendu_shi=ucharT_data_H/10; wendu_ge=ucharT_data_H%10; shidu_shi=ucharRH_data_H/10; shidu_ge=ucharRH_data_H%10; } else //没用成功读取,返回0 { wendu_shi=0; wendu_ge=0; shidu_shi=0; shidu_ge=0; } } ZStack代码 DHT11驱动代码 分析 同裸机代码 ...