李林泽 发表于 2014-3-11 14:43:47

ds18b20+mega128 温度低于18度时就会显示0xff,为什么

18度以上是正常的,以下就不正常都是0xff,求解答!
#include<avr/io.h>
#include<avr/interrupt.h>
#include<stdio.h>
/*************************************************************************
ds18b20头文件   
M16内部8M      
*************************************************************************/
#define CLR_DIR_1WIRE DDRC &= ~(1<<2);    //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC |= (1<<2);      //里面什么都不用该!
#define CLR_OP_1WIRE PORTC &= ~(1<<2);
#define SET_OP_1WIRE PORTC |= (1<<2);   
#define CHECK_IP_1WIRE (PINC & 0x04)    //检测

unsigned char wmh,wml;
void init_1820()
{
    SET_DIR_1WIRE;                //设置PC2 为输出
    SET_OP_1WIRE;
    CLR_OP_1WIRE;
    delay_nus(550);    //480us以上
    SET_OP_1WIRE;
    CLR_DIR_1WIRE;
    delay_nus(20);    //15~60us
    while(CHECK_IP_1WIRE);
    SET_DIR_1WIRE;
    SET_OP_1WIRE;
    delay_nus(140);//60~240us
}
void write_1820(unsigned char x)
{   
    unsigned char m;
    for(m=0;m<8;m++)
    {
      CLR_OP_1WIRE;
      
          if(x&(1<<m))    //写数据了,先写低位的!
      SET_OP_1WIRE;
      if(!(x&(1<<m)))
      CLR_OP_1WIRE;
          
      delay_nus(40);//15~60us
      SET_OP_1WIRE;
    }
    SET_OP_1WIRE;
}
unsigned char read_1820()
{      
    unsigned char temp,k,n;
    temp=0;
    for(n=0;n<8;n++)
      {
      CLR_OP_1WIRE;
      SET_OP_1WIRE;
      CLR_DIR_1WIRE;
      k=(CHECK_IP_1WIRE);    //读数据,从低位开始
      if(k)
      temp|=(1<<n);
      else
      temp&=~(1<<n);
      delay_nus(50); //60~120us      
      SET_DIR_1WIRE;
}
return (temp);
}

/*
uint8_t gettemp(void)                  //读取温度值
{
    //unsigned char temh,teml,wm0,wm1,wm2,wm3,warnl,warnh;
        uint8_t temh,teml,wm0,wm1,wm2,wm3,warnl,warnh;
    init_1820();      //复位18b20
    write_1820(0xcc);// 发出转换命令
    write_1820(0x44);
delay_nms(880);    //不延时也好使,不知道怎么回事!
    init_1820();
    write_1820(0xcc);//发出读命令
    write_1820(0xbe);
    teml=read_1820();//读数据
    temh=read_1820();
        warnl=read_1820();
        warnh=read_1820();
    wm0=teml>>4;      //只要高8位的低四位和低8位的高四位,温度范围0~99啦!
    wm1=temh<<4;
    wm2=wm1+wm0;      //16进制转10进制
    wm3=wm2/100;
    wmh=(wm2%100)/10;//出口参数了!wmh是显示的高位,wml使显示的低位
    wml=(wm2%100)%10;
        //int a;
        //a=wmh;
        //a=wml;
        return wm2;
} */
unsigned int gettemp(void)
{
      unsigned char tempL,tempH;
      unsigned int x;
      
      delay_1ms();   //等待1ms
      init_1820();
      write_1820(0xcc);//跳过ROM
      write_1820(0xbe);//读数据
      tempL=read_1820();
      tempH=read_1820();
      x=(tempH<<8)|tempL;
      init_1820();
      write_1820(0xcc);//跳过ROM
      write_1820(0x44);//启动温度转换
      return(x);
}

//延时程序:

//delay.h
/*-----------------------------------------------------------------------
延时函数
系统时钟:8M
-----------------------------------------------------------------------*/
void delay_1us(void)                //1us延时函数
{
asm("nop");
}

void delay_nus(unsigned int n)      //N us延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1us();
}

void delay_1ms(void)                //1ms延时函数
{
unsigned int i;
for (i=0;i<1140;i++);
}

void delay_nms(unsigned int n)      //N ms延时函数
{
unsigned int i=0;
for (i=0;i<n;i++)
delay_1ms();
}


gzhmcu 发表于 2014-3-11 14:49:39

没仔细看你代码,但是如果时序不正确的话,会出现问题

李林泽 发表于 2014-3-11 17:06:33

gzhmcu 发表于 2014-3-11 14:49
没仔细看你代码,但是如果时序不正确的话,会出现问题

晶振使用外部的和内部的会导致结果有差异么?

coleyao 发表于 2014-3-11 18:59:12

内部的不是晶振,是RC...
页: [1]
查看完整版本: ds18b20+mega128 温度低于18度时就会显示0xff,为什么