找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4434|回复: 6
打印 上一主题 下一主题
收起左侧

DHT22低八位和温度负数程序怎么定义?

[复制链接]
跳转到指定楼层
楼主
30黑币

MT9L7Y]}[TS0YM@~GOO%(4F.png (23.83 KB, 下载次数: 80)

MT9L7Y]}[TS0YM@~GOO%(4F.png

4T(0IS{N63ZI5~6D_)5D3LU.png (35.24 KB, 下载次数: 70)

4T(0IS{N63ZI5~6D_)5D3LU.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:452950 发表于 2020-4-15 09:30 | 只看该作者
这个是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小数
}
回复

使用道具 举报

板凳
ID:729488 发表于 2020-4-15 10:08 | 只看该作者
不太清楚你想要的效果,是想计算结果不受正负值的影响吗? 如果是这样的话符号位可以与上一个0
回复

使用道具 举报

地板
ID:267932 发表于 2020-4-15 10:14 | 只看该作者
高八位  与80 ,得到结果为1为负数,反之为证
回复

使用道具 举报

5#
ID:710465 发表于 2020-4-15 10:49 | 只看该作者
wjj11 发表于 2020-4-15 10:08
不太清楚你想要的效果,是想计算结果不受正负值的影响吗? 如果是这样的话符号位可以与上一个0

下面是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信号,结束本次数据读取
        }
}
回复

使用道具 举报

6#
ID:710465 发表于 2020-4-15 10:49 | 只看该作者
xxpp2011 发表于 2020-4-15 09:30
这个是DS18b20的温度转换,可以参考一下
/*************************************
函数名:ReadTemp

我参考下
回复

使用道具 举报

7#
ID:213173 发表于 2020-4-15 13:20 | 只看该作者
        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;
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表