unsigned int Time; //16位温度值 unsigned char Time_H; //高8位 unsigned char Time_L; //低8位 bit negative=0; float Time_F;//换算后的浮点变量 if(Time&0x8000) { negative=1; //负号标志 Temp=~temp; //取反加1 Temp +=1; } Time_H=Time>>8; Time_L=Time; Time_F=(Time_H*256+Time_L)/10; |
xxpp2011 发表于 2020-4-15 09:30 我参考下 |
wjj11 发表于 2020-4-15 10:08 下面是DHT11的程序,我是想改成DHT22的,有几个问题不理解 问题1:DHT22的温度是温度的(高7位的数值*256+低8位的数值) /10。高8位的首 位为符号位。湿度的读取同理,但是湿度没有符号位。 问题2:温度是负数的时候改怎么定义函数 /******************************************************** 函数名称:uchar DHT11_receive(void) 函数作用:接收DHT11传回来的数据 参数说明:返回接收到的八位数据 ********************************************************/ uchar DHT11_receive(void) { uchar i,Data; for(i=0;i<8;i++) //接收8位数据 { DHT11_num=2; //重置超时变量 while(!DHT11_DB&&DHT11_num++);//等待DHT11变为高电平 Delay_us(35);//延时35us Data<<=1; //数据向左移动一位 if(DHT11_DB) //如果DHT11为高电平,表示接收的数据为1 Data|=1; //存入数据 DHT11_num=2; //重置超时变量 while(DHT11_DB&&DHT11_num++);//等待DHT11变为低电平 } return Data; //返回接收到的数据 } /******************************************************** 函数名称:void DHT11_read(void) 函数作用:读取DHT11温湿度 参数说明: ********************************************************/ void DHT11_read(void) { DHT11_DB=0; //拉低DHT11信号线 Delay_ms(20); //延时20ms DHT11_DB=1; //拉高DHT11信号线 Delay_us(60); //延时60us if(!DHT11_DB) //等待DHT11拉高响应 { DHT11_num=2; //重置超时变量 while(!DHT11_DB&&DHT11_num++);//等待DHT11变为高电平 DHT11_num=2; //重置超时变量 while(DHT11_DB&&DHT11_num++); //等待DHT11变为低电平 Humi_H=DHT11_receive(); //接收湿度整数位 Humi_L=DHT11_receive(); //接收湿度小数位 Temp_H=DHT11_receive(); //接收温度整数位 Temp_L=DHT11_receive(); //接收温度小数位 Check_data=DHT11_receive(); //接收数据校验位 DHT11_DB=1; //拉高DHT11信号,结束本次数据读取 } } |
高八位 与80 ,得到结果为1为负数,反之为证 |
不太清楚你想要的效果,是想计算结果不受正负值的影响吗? 如果是这样的话符号位可以与上一个0 |
这个是DS18b20的温度转换,可以参考一下 /************************************* 函数名:ReadTemp 函数功能:温度转换 参数:无 返回:无 备注:无 *************************************/ void ReadTemp(void) { unsigned char a=0; unsigned char b=0; unsigned char t=0; dqinit(); wr1820b(0xCC); // 跳过读序号列号的操作 wr1820b(0x44); // 启动温度转换 delaydq(100); dqinit(); wr1820b(0xCC); //跳过读序号列号的操作 wr1820b(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delaydq(100); a=re1820b(); //读取温度值低位 b=re1820b(); //读取温度值高位 if(b>127) { b=(256-b);a=(256-a);fflag=1; //负温度求补码 temp_value=b<<4; temp_value+=(a&0xf0)>>4; temp2=a&0x0f; //小数的值 } else { fflag=0; temp_value=b<<4; temp_value+=(a&0xf0)>>4; temp2=a&0x0f; //小数的值 } xs=temp2*0.0625*10; //小数位,若为0.5则算为5来显示 xs小数 } |