搜索
bottom↓
回复: 6

ds18b20的一点疑惑

[复制链接]

出0入0汤圆

发表于 2010-1-22 16:21:16 | 显示全部楼层 |阅读模式
以下是DS18b20的程序,我用的芯片是at91sam7s64,发现有些IO可以用,有些IO不行,比如我用PA0是可以正确读数的,但是用PA15读数一直是0,请问是怎么回事呢?
AT91S_PIO * pPIO = AT91C_BASE_PIOA;

void DS18b20_Init(void)
{
        pPIO->PIO_PER = DS18B20;
        pPIO->PIO_PPUDR = DS18B20;
}

//*-------------------------------------------------
//* Function Name: Reset_Ds18b20
//* Object: Reset Ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Reset_Ds18b20(void)  
{  
    SET_DIR_1WIRE;
    SET_OP_1WIRE;
        _delay_us(1);   
    CLR_OP_1WIRE;
  
    _delay_us(600);    //480usÒÔÉÏ  
       
    SET_OP_1WIRE;  
    CLR_DIR_1WIRE;  
       
    _delay_us(20);     //15~60us  
       
    while(CHECK_IP_1WIRE);  //* Ϊ±ÜÃâËÀÑ­Ðò£¬´ý´¦Àí
       
    SET_DIR_1WIRE;  
    SET_OP_1WIRE;  
       
    _delay_us(140);   //60~240us         
}  


//*-------------------------------------------------
//* Function Name: Write_Ds18b20
//* Object: Write a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
void Write_Ds18b20(unsigned char x)  
{     
    unsigned char m;
     
    for(m=0; m<8; m++)  
    {  
       CLR_OP_1WIRE;
        
       if(x&(1<<m))
           SET_OP_1WIRE;  
       else  
           CLR_OP_1WIRE;

       _delay_us(50);   //15~60us  

       SET_OP_1WIRE;
           _delay_us(1);
    }
        
     SET_OP_1WIRE;  
}

//*-------------------------------------------------
//* Function Name: Read_Ds18b20
//* Object: Read a byte
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
unsigned char Read_Ds18b20(void)  
{      
    unsigned char temp,k,n;
      
    temp=0;
     
    for(n=0; n<8; n++)  
    {  
      CLR_OP_1WIRE;  
      SET_OP_1WIRE;  
      CLR_DIR_1WIRE;
      
          _delay_us(2);
          
      k =(CHECK_IP_1WIRE);

      if(k)  
          temp|=(1<<n);  
      else  
          temp&=~(1<<n);
        
      _delay_us(70); //60~120us
                     //     
      SET_DIR_1WIRE;
          _delay_us(1);   
   }
     
   return (temp);  
}   

//*-------------------------------------------------
//* Function Name: Get_Temp
//* Object: Read tempture from ds18b20
//* Input Parameters:none
//* Output Parameters:none
//*-------------------------------------------------
float Get_Temp(void)
{  
     unsigned char temh,teml;
         float         temp;
         unsigned int tmp;
         
     Reset_Ds18b20();

     Write_Ds18b20(skiprom);
     Write_Ds18b20(convert);
         
     _delay_ms(100);
         _delay_ms(100);

     Reset_Ds18b20();  

     Write_Ds18b20(skiprom);
     Write_Ds18b20(readscrat);

     teml = Read_Ds18b20();
     temh = Read_Ds18b20();
         
        tmp = temh;
        tmp <<= 8;
        tmp |= teml;

        temp = tmp*0.0625+0.005;

        return temp;
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2010-1-22 16:33:45 | 显示全部楼层
是不是你的IO设置了别的功能?

出0入0汤圆

 楼主| 发表于 2010-1-22 16:46:19 | 显示全部楼层
回复【1楼】gooogleman 谷歌汉子
-----------------------------------------------------------------------

没有,
void DS18b20_Init(void)
{
pPIO->PIO_PER = DS18B20;
pPIO->PIO_PPUDR = DS18B20;
}
初始化使能IO了,外设禁用了的

出0入0汤圆

 楼主| 发表于 2010-1-22 17:17:55 | 显示全部楼层
我直接控制IO的时候有电平变化,但是用来驱动ds18b20就不行了,是不是时序上有问题呢

出0入0汤圆

发表于 2010-11-23 13:14:21 | 显示全部楼层
回复【楼主位】snailchen 箫寒客
-----------------------------------------------------------------------
楼主,我也是用AT91SAM64控制18B20,请问下,为什么忙标志一直读回来是1呢?我换了好多口都是1,请问是不是在其他地方要设置什么啊?
下面是我的程序,您帮我看下好吗?
uint32 Init_DS18B20(void)//18B20初始化
{
        uint32 x;
       
        *AT91C_PIOA_OER|=BIT0;//IO方向为输出
        //*AT91C_PIOA_PER|=BIT0;//PIO控制
        SET_DS;    //DQ置高
        delay_nus(1);  //稍做延时
        CLR_DS;    //将DQ拉低
        delay_nus(750); //精确延时 大于 480us
        SET_DS;    //拉高总线
        delay_nus(80);
        *AT91C_PIOA_ODR|=BIT0;//IO方向为输入,方便读取数据
       
        *AT91C_PIOA_PER|=BIT0;// 禁止PIO控制
       
        delay_nus(100);
        x=(*AT91C_PIOA_PDSR&0x00000001);
        *AT91C_PIOA_OER|=BIT0;//IO方向为输出
        SET_DS;    //DQ置高
        delay_nus(140);
        return(x);
}}

出0入0汤圆

发表于 2010-11-23 13:32:39 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-11-25 19:58:28 | 显示全部楼层
4楼的这样很难检测到存在脉冲了。你可能没了解“脉冲”这个词!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 18:02

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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