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条回答
無智
1楼-- · 2020-02-05 11:15
楼主,关注你的delay函数,无符号整形的形参,延时时间和你预想的不同的!

可以看你编译时的汇编文件。
yesno
2楼-- · 2020-02-05 12:34
 精彩回答 2  元偷偷看……
BXAK
3楼-- · 2020-02-05 15:13
哪款单片机
goolloo
4楼-- · 2020-02-05 18:39
  1. void delay_15us( uchar times )
  2. {
  3.         do
  4.         {
  5.                 _nop_ ();
  6.                 _nop_ ();
  7.                 _nop_ ();
  8.                 _nop_ ();
  9.                 _nop_ ();
  10.                 _nop_ ();
  11.                 _nop_ ();
  12.                 _nop_ ();
  13.                 _nop_ ();
  14.                 _nop_ ();
  15.                 _nop_ ();
  16.                 _nop_ ();
  17.                 _nop_ ();
  18.                
  19.                 times--;       
  20.         }while(times);
  21. }

  22. //初始化函数
  23. void DS18B20_reset(void)
  24. {
  25.         uchar x=0;
  26.        
  27.         DQ = 1; //DQ复位
  28.         delay_15us (3); //稍做延时
  29.         DQ = 0; //单片机将DQ拉低
  30.         delay_15us(33); //精确延时 大于 480us          33           大于10即可
  31.         DQ = 1; //拉高总线
  32.         delay_15us(6);        //等待大于60us       有无都可以
  33.         x = DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  34.         delay_15us(6);
  35. }

  36. //读一个字节
  37. uchar DS18B20_read(void)
  38. {
  39.         uchar i=0;
  40.         uchar dat = 0;
  41.        
  42.         for (i=0;i<8;i++)
  43.         {
  44.                 DQ = 1;                        //高电平
  45.                 _nop_();_nop_();//延时2us
  46.                 DQ = 0;                 //低电平 开始时间片
  47.                 dat>>=1;
  48.                 DQ = 1;                 //高电平 DS18B20开始输出
  49.                 if(DQ)                       
  50.                 {
  51.                         dat|=0x80;        //如果是高电平就在最高位写入1,低电平则保留原来的0
  52.                 }
  53.                 delay_15us(2);        //延时30us
  54.         }
  55.        
  56.         return(dat);
  57. }

  58. //写一个字节
  59. void DS18B20_write(uchar dat)
  60. {
  61.         uchar i=0;
  62.        
  63.         for (i=8; i>0; i--)
  64.         {
  65.                 DQ = 0;
  66.                 delay_15us(1);
  67.                 DQ = dat&0x01;
  68.                 delay_15us(2);
  69.                 DQ = 1;
  70.                 dat>>=1;
  71.         }
  72. }

  73. void DS18B20_convert( void )
  74. {
  75.         DS18B20_reset();
  76.         DS18B20_write(0xCC); // 跳过读序号列号的操作
  77.         DS18B20_write(0x44); // 启动温度转换
  78. }

  79. //读取温度
  80. uint get_temperature(void)
  81. {
  82.         uchar tempL=0;
  83.         uchar tempH=0;
  84.         uint t=0;
  85.         DS18B20_convert();
  86.         DS18B20_reset();
  87.         DS18B20_write(0xCC); //跳过读序号列号的操作
  88.         DS18B20_write(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
  89.         tempL=DS18B20_read();
  90.         tempH=DS18B20_read();

  91.         t = (tempH*256 + tempL)*0.625+0.5;
  92.         return(t);
  93. }
复制代码
yesno
5楼-- · 2020-02-05 22:40
BXAK 发表于 2012-5-19 13:54
哪款单片机

51单片机啊
BXAK
6楼-- · 2020-02-06 00:11
yesno 发表于 2012-5-19 14:41
51单片机啊


具体型号,因为有些新51和旧51指令速度不同,delay延时就不通用了,
如果你的是STC 1T系列,就用这贴的就可以:STC 1T DS18B20通用操作模块,正 / 负温度,适应晶振:1 ~ 45MHz
如果是AT89C52的话,你把工程发上来,今天比较有空,帮你改改

一周热门 更多>