ds18b20测温初学,测试失败啦麻烦大家给我看看

2020-02-05 09:20发布

本帖最后由 yesno 于 2012-5-19 15:29 编辑

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char  
#define uint unsigned int
sbit dula=P2^6;  
sbit wela=P2^7;
sbit DQ=P2^2;
uint temp;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};          //0-9数字
void delay (uint x)                 //延时函数        
{        
uchar i;
        while(x--)
        for(i=0; i<120; i++);
        }
void delay1(uint a)                 //延时函数
{   
while(--a);
}
void disp(uchar num)  //显示函数
{
  uchar shi,ge;   
shi=num/10;   
ge=num%10;  
dula=1;  
P0=table[shi];
  dula=0;  
P0=0xff;   
wela=1;
  P0=0xfe;  
wela=0;   
delay(5);   
dula=1;  
P0=table[ge];  
dula=0;   
P0=0xff;  
wela=1;  
P0=0xfd;   
wela=0;   
delay(5);
}          
void init_18b20() //  初始化
{
DQ=1;
delay1(8);
DQ=0;
delay1(90);
DQ=1;
_nop_();
_nop_();
delay1(100);
DQ=1;
}        
void write(uchar dat)          //写字节
{
uchar i;        
for(i=0; i<8; i++)        
        {
                DQ=0;        
        DQ=dat&0x01;        
        delay1(5);                
        DQ=1;        
        dat>>=1;                
        }                
      delay1(4);
}  
uchar read()                   //读字节
{
uchar i, dat=0;
DQ=1;  
_nop_();  
for(i=0; i<8; i++)
{
   DQ=0;  
   _nop_();
   _nop_();
    dat>>=1;
    DQ=1;
    _nop_();
    _nop_();  
    if(DQ)
    dat|=0x80;
    delay1(30);
    DQ=1;
  }  
return dat;
}
uchar read_tu()                          //  温度转换
{
uchar a,b;
init_18b20();
delay1(100);
write(0xcc);
write(0x44);
init_18b20();
write(0xcc);
write(0xbe);
a=read();
b=read();
b<<=4;
b+=(a&0xf0)>>4;
return b;
}   
void main()                                                 //主函数
{
delay(30);
        while(1)
        {
        temp=read_tu;
        disp(temp);        
         }
}


这个初学仔细检查啦视乎没错,可是下载到板子里面就不行啦。其他的情况也没什么就是温度没反应,数码管就是显示70,任凭我怎么触摸传感器都是没反应既不升温也不降温。



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
yao1
1楼-- · 2020-02-07 15:52
18B20:
    测量数据以16位带符号位扩展的二进制补码形式存放
    单片机读取温度,一次读2字节16位,读完将低11位的二进制转化为十进制后乘0.0625即为实际温度,只

需要判断11位即可
还需要判断温度正负:前5位为符号位,1为负,0为正
1)前5位为1时,读取温度为负值,实际温度=测得数值需要取反加1再乘0.0625
  -55  ——11111 10010010000——低11位取反011 0110 1111(十进制879)——加1(880)——乘0.0625——

实际温度-880*0.0625 (11111为负)   
2)前5位为0时,读取温度为正值,实际温度=测得数值乘0.0625
  +125 ——00000 11111010000——低11位十进制为2000 ——2000*0.0625=125  (00000位正)

//移位原理:
//用10进制来理解,如果把123456这个数右移4位,是不是得到12?也就是除以10的4次方10000得到的(因为是整型,小数部分被舍去了)。
//二进制右移4位,自然是除以2的4次方16了。
//因0.0625=1/16 所以T*0.0625=T/16=T>>4
//若除4096则是右移12位 因2的12次方=4096

*************************************************************************************
AVR优化算法:
x为小数部分0-15之间的数,y为最后输出的数,为什么偷笑?因为只要10个周期。
y=(((x*5)>>2)+1)>>1;   //小数输出 10T
y=(((x*5)>>2)+1)>>1;
等效y=((x*5)/4+1)/2;
再等效y=((x*20)/16+1)/2;
实际上y=x*10/16;
由于定义的类型都是整数,单片机计算完后是取整数部份,所以要进行四舍五入
y=x*10/16+0.5;
所以y=2*(x*10/16+0.5)/2;
y=(x*20/16+1)/2;
*****************************************************

BXAK
2楼-- · 2020-02-07 16:25
yao1 发表于 2012-5-19 17:52
18B20:
    测量数据以16位带符号位扩展的二进制补码形式存放
    单片机读取温度,一次读2字节16位,读完 ...

哪那么复杂

bit    P_N;
unsigned char   msb,lsb;

/*****************************************************
函数:温度转换命令 + 读取计算保存
要求:在主程序中循环调用此函数,调用速度随意
比如:P_N = 0,msb = 20,lsb = 4,即+20.4℃
          P_N = 1,msb = 14,lsb = 3,即-14.3℃
*****************************************************/
void Conversion_Update_Temp(void)
{       
    …………
       
    a = DS18B20_ReadByte();             //读温度低字节           
    b = DS18B20_ReadByte();             //读温度高字节
               
    P_N = (bit)( b & 0x80 );            //P_N=1负温,P_N=0正温
    if ( P_N ) {    b = 255 - b;  if( a )a = 256 - a;  else b++; }   //负温计算方法1:65536减去后,按正温计算
    …………                                                                           //负温计算方法2:取反加1后,按正温计算                                      

    msb = (b<<4) | (a>>4);       //温度整数                                      相当于 (b<<8 + a)*0.0625
    //lsb = ((a&0x0F)*10)/16;     //温度小数保留1位(不带四舍五入)相当于 ( (b<<8 + a)*0.0625*10) %10
    lsb = ((a&0x0F)*10+8)/16;    //温度小数保留1位(带四舍五入)  相当于 ( (b<<8 + a)*0.0625*10 +5 ) %10
}
yesno
3楼-- · 2020-02-07 20:46
BXAK 发表于 2012-5-19 19:00
哪那么复杂

bit    P_N;

忘记打括号啦
BXAK
4楼-- · 2020-02-08 02:11
 精彩回答 2  元偷偷看……
yesno
5楼-- · 2020-02-08 05:16
BXAK 发表于 2012-5-19 20:49
编译没报错或者警告?

很多网友也觉得奇怪都说为什么没报警,问题是它就是没报警,郁闷

一周热门 更多>