hhrfjz 发表于 2006-8-13 14:31:33

DS18B20头文件!绝对好使!还使用方便!M16 8M 的!

终于调通了!哈哈:

我也拿出来跟大家分享一下!

里面的内容什么都不用该,就该一下前面宏定义就可以了!

只需调用gettemp();就可以了!出口参数wmh是显示的高位,wml使显示的低位,然后调用你的显示程序就可以了!



/*************************************************************************

ds18b20头文件   

M16内部8M      

*************************************************************************/

#define CLR_DIR_1WIRE DDRC&=~BIT(2)   //只要修改这里的参数就可以了!呵呵!

#define SET_DIR_1WIRE DDRC|=BIT(2)      //里面什么都不用该!

#define CLR_OP_1WIRE PORTC&=~BIT(2)

#define SET_OP_1WIRE PORTC|=BIT(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(480);    //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;

       else

       {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);

}



void gettemp()                   //读取温度值

{

   unsigned char temh,teml,wm0,wm1,wm2,wm3;

   init_1820();      //复位18b20

   write_1820(0xcc);   // 发出转换命令

   write_1820(0x44);

//delay_nms(800);   //不延时也好使,不知道怎么回事!

   init_1820();

   write_1820(0xcc);//发出读命令

   write_1820(0xbe);

   teml=read_1820();//读数据

   temh=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;

}





//延时程序:



//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();

}
-----此内容被hhrfjz于2006-08-13,15:01:04编辑过

hayuda 发表于 2006-8-13 14:50:28

楼主长春哪的?俺也是长春的 有机会交流下啊 我是菜鸟呵呵

hhrfjz 发表于 2006-8-13 14:54:33

呵呵,是吗?好高兴!

汽车厂的!你呢?

我的MSN:hhrfjz@hotmail.com

hayuda 发表于 2006-8-13 15:01:06

我吉林大学的,还没毕业 呵呵 幸会 !向你学习啊

hhrfjz 发表于 2006-8-13 15:03:43

哦,好大学阿!我该向你学习啊!呵呵,

hayuda 发表于 2006-8-13 15:11:03

客气了!!!我刚学这个不久,,我不是学这个专业的,,爱好而已了!!你不用QQ啊? 我QQ52115953 MSN上不去

tda1552 发表于 2006-8-13 15:42:42

谢谢分享!我第一次用1820只延时几十微妙也可以读到正确的数据(可能是寄存器还没刷新,读的都是上次的温度值)。后来由于1820电源接反一次后就要延时几百MS才能正确读出数据。官方给的数据是12位最大的转换时间750ms。

prozm 发表于 2006-8-13 21:51:09

搂住,问一下,你为什么不用自带的延时函数呢,我看了许多人都没有使用自带的函数,而是自己做延时函数,我也在调试1820,就是调不出来,是不是自带延时不准啊

hhrfjz 发表于 2006-8-13 22:16:19

我习惯自己写头文件,这个延时程序是在AVR 8M 的时钟下正常运行的!



主要是哪个delay_nms();



我是用示波器一点一点调的!你要是用别的晶镇你还得自己调!



自带的延时我没有用过!不知道他在多少M的频率下是准确的!



你要是有时间就自己调一下吧!

wgxrc 发表于 2006-9-29 16:06:28

这个头文件不会用啊.楼主帮忙一下啊.

btpig 发表于 2006-9-30 09:15:34

很菜的问一句,用示波器怎么调延时。。谢谢

luxinsun 发表于 2006-12-23 16:08:03

谢谢了,我用上就好了。

chenpeng 发表于 2006-12-23 19:45:51

呵呵,收藏先

chengshuo 发表于 2006-12-25 20:57:09

谢谢了,收藏先.

liming3267 发表于 2007-11-18 21:30:28

我实验过了,很好用,谢谢楼住!

sbdpjx 发表于 2008-1-11 23:17:16

hao

jinbu 发表于 2008-1-16 16:33:22

好东西,可是我用上之后,好象DS18B20测量的温度在升高,尤其是当室温为10度左右时,温度上升的很快,断电再通电后,温度有时可以差
4度之多!是什么问题呢?有人遇到过这个问题吗?请指点

shusheng 发表于 2008-2-1 18:02:59

谢谢

ecat 发表于 2008-2-1 18:37:58

记号一下。

panxiaoyi 发表于 2008-2-2 04:12:34

我也发一个,CVAVR的,使用NOKIA3310/5110LCD作显示

panxiaoyi 发表于 2008-2-2 04:13:07

//www.avrdiy.com
#include <mega48.h>
#include <delay.h>
#include <nokia3310.h>
#include <monobus.h>
unsigned char data_H, data_L,wendu;
unsigned intdata_T;
void main(void)
{   
lcd_init();                     //lcd初始化         
lcd_cls();                        //清屏,光标回位   
while(1)   
       {   
         monobus_init();            //单总线复位
         write_monobus(0xCC);       //跳过ID码匹配,适用于一个DS18B20
         
         //可以使用8条语句代替上面的那条语句依次写入8个ID码,这样就是ID码匹配了
         //如果不知道18B20的ID码,可以在总线上接入单个18B20
         //然后参考下面的读取语句,依次读取18B20的8个ID码
         //记得使用CRC8校验一下是否正确
         
         write_monobus(0x44);       //启动温度转换
         
         delay_ms(500);             //等待转换

         monobus_init();            //单总线复位
         write_monobus(0xCC);       //跳过ID码匹配
         write_monobus(0xBE);       //通知DS18B20,准备读数据

         data_L=read_monobus();   //读取第一个数据(温度低字节)
         data_H=read_monobus();   //读取第二个数据(温度高字节)
         
         //可以继续读取第三个到第九个RAM数据
         
         lcd_cls();
         
         data_T=data_H*256+data_L;//合并后得到原始温度数据
         
         if(data_H>15) data_T=(~data_T+1)/16; else data_T/=16; //计算实际温度
         wendu=data_T;
         
         lcd_gotoxy(16,3);
         lcd_putsf("T = ",4);       //显示字符串,字符串是保存在Flash的
         if(data_H>15) lcd_putchar('-');
         lcd_put(wendu);            //显示温度
         lcd_putchar(' ');          //空一个字符
         lcd_write(2);            //显示C前面上标的一个点
         lcd_write(0);            //空一小格
         lcd_putchar('C');   
         delay_ms(250);      
       }
}   
/*
如果温度为正,则T的最高位的4位都为0,否则为1
负温度的计算:原始数据取反、加1、再乘以 0.0625
正温度的计算:原始数据乘以 0.0625
CVAVR自带了18B20的库,如果大家不喜欢上面我写的函数,也可以使用自带的
*/

panxiaoyi 发表于 2008-2-2 04:13:44

//monobus.h文件,用于操作DS18B20/DS2401等单总线器件
//假设软件设计要求的时钟频率是4MHz
//实际上硬件工作在2-8MHz下也很正常,就是说,下面代码的延时取值是很合适的   
//CVAVR本身自带单总线的库1wire.h,如果大家不喜欢下面的代码也可以使用它自带的函数(请看帮助文档)

#define monobus_1DDRC.0=0//设置单片机IO为输入,由于总线存在上拉电阻,所以此时电平是1
#define monobus_0DDRC.0=1//设置单片机IO为输出,配合默认的 PORTC.0=0 则输出0电平
#define monobus_in PINC.0    //检测总线(从机)的电平状态

void monobus_init(void)      //复位,不检测从机设备是否存在(只要没有虚焊就肯定存在的)
{
monobus_0;
delay_us(480);
monobus_1;
delay_us(480);
}

void write_monobus(unsigned char data)   //向单总线的从机写入数据(先写低位再写高位,与SPI相反)
{
unsigned char n=1;
while(n)
{
    monobus_0;
    delay_us(2);                           //拉低总线1-3us,通知从机准备收发数据
    if(data&n) monobus_1; else monobus_0;//向总线写数据的某一位(1或者0)
    delay_us(75);                        //等待90us,保证从机有足够的时间进行采样(24-210us)
    monobus_1;                           //释放总线   
    delay_us(2);                           //释放总线时间要大于1us   
    n<<=1;
}
}

unsigned char read_monobus(void)         //读单总线的从机数据(先传输低位后传输高位,与SPI相反)
{
unsigned char data_18b20=0;
unsigned char n=1;
while(n)
{
    monobus_0;
    delay_us(2);                           //拉低总线1-3us,通知从机准备收发数据
    monobus_1;                           //释放总线
    delay_us(5);                           //从机在1-25us内会向总线输出数据的某一位(1或者0)
    if(monobus_in) data_18b20+=n;          //读取总线数据
    delay_us(55);                        //等待从机释放总线
    n<<=1;
}
return data_18b20;
}

panxiaoyi 发表于 2008-2-2 04:14:40

/*************************************************************
使用者只需把这个nokia3310.h的文件复制到工程目录即可
使用nokia3310库函数时,请先定义3310与MCU的连接
本例子3310LCD与单片机的连接如下
RESET   PB1
D/C   PB2
SDIN    PB3
SCLK    PB5
SCE   GND                                    
英文字库,5*8点阵,每一个字符占用5个字节,共94个可显示字符数据**/   
                              
#define RESET   PORTB.1       //RESET=0时,LCD复位
#define DC      PORTB.2       //DC=0_指令,DC=1_数据   
#define SDIN      PORTB.3
#define SCLK      PORTB.5

#define RESET_DDRn DDRB.1       //RESET=0时,LCD复位
#define DC_DDRn    DDRB.2       //DC=0_指令,DC=1_数据   
#define SDIN_DDRnDDRB.3
#define SCLK_DDRnDDRB.5

flash unsigned char data[]={      
0x00, 0x00, 0x00, 0x00, 0x00,   // sp
0x00, 0x00, 0x2f, 0x00, 0x00,   // !
0x00, 0x07, 0x00, 0x07, 0x00,   // "
0x14, 0x7f, 0x14, 0x7f, 0x14,   // #
0x24, 0x2a, 0x7f, 0x2a, 0x12,   // $
0x62, 0x64, 0x08, 0x13, 0x23,   // %
0x36, 0x49, 0x55, 0x22, 0x50,   // &
0x00, 0x05, 0x03, 0x00, 0x00,   // ’
0x00, 0x1c, 0x22, 0x41, 0x00,   // (
0x00, 0x41, 0x22, 0x1c, 0x00,   // )
0x14, 0x08, 0x3E, 0x08, 0x14,   // *
0x08, 0x08, 0x3E, 0x08, 0x08,   // +
0x00, 0x00, 0xA0, 0x60, 0x00,   // ,
0x08, 0x08, 0x08, 0x08, 0x08,   // -
0x00, 0x60, 0x60, 0x00, 0x00,   // .
0x20, 0x10, 0x08, 0x04, 0x02,   // /
0x3E, 0x51, 0x49, 0x45, 0x3E,   // 0
0x00, 0x42, 0x7F, 0x40, 0x00,   // 1
0x42, 0x61, 0x51, 0x49, 0x46,   // 2
0x21, 0x41, 0x45, 0x4B, 0x31,   // 3
0x18, 0x14, 0x12, 0x7F, 0x10,   // 4
0x27, 0x45, 0x45, 0x45, 0x39,   // 5
0x3C, 0x4A, 0x49, 0x49, 0x30,   // 6
0x01, 0x71, 0x09, 0x05, 0x03,   // 7
0x36, 0x49, 0x49, 0x49, 0x36,   // 8
0x06, 0x49, 0x49, 0x29, 0x1E,   // 9
0x00, 0x36, 0x36, 0x00, 0x00,   // :
0x00, 0x56, 0x36, 0x00, 0x00,   // ;
0x08, 0x14, 0x22, 0x41, 0x00,   // <
0x14, 0x14, 0x14, 0x14, 0x14,   // =
0x00, 0x41, 0x22, 0x14, 0x08,   // >
0x02, 0x01, 0x51, 0x09, 0x06,   // ?
0x32, 0x49, 0x59, 0x51, 0x3E,   // @
0x7C, 0x12, 0x11, 0x12, 0x7C,   // A
0x7F, 0x49, 0x49, 0x49, 0x36,   // B
0x3E, 0x41, 0x41, 0x41, 0x22,   // C
0x7F, 0x41, 0x41, 0x22, 0x1C,   // D
0x7F, 0x49, 0x49, 0x49, 0x41,   // E
0x7F, 0x09, 0x09, 0x09, 0x01,   // F
0x3E, 0x41, 0x49, 0x49, 0x7A,   // G
0x7F, 0x08, 0x08, 0x08, 0x7F,   // H
0x00, 0x41, 0x7F, 0x41, 0x00,   // I
0x20, 0x40, 0x41, 0x3F, 0x01,   // J
0x7F, 0x08, 0x14, 0x22, 0x41,   // K
0x7F, 0x40, 0x40, 0x40, 0x40,   // L
0x7F, 0x02, 0x0C, 0x02, 0x7F,   // M
0x7F, 0x04, 0x08, 0x10, 0x7F,   // N
0x3E, 0x41, 0x41, 0x41, 0x3E,   // O
0x7F, 0x09, 0x09, 0x09, 0x06,   // P
0x3E, 0x41, 0x51, 0x21, 0x5E,   // Q
0x7F, 0x09, 0x19, 0x29, 0x46,   // R
0x46, 0x49, 0x49, 0x49, 0x31,   // S
0x01, 0x01, 0x7F, 0x01, 0x01,   // T
0x3F, 0x40, 0x40, 0x40, 0x3F,   // U
0x1F, 0x20, 0x40, 0x20, 0x1F,   // V
0x3F, 0x40, 0x38, 0x40, 0x3F,   // W
0x63, 0x14, 0x08, 0x14, 0x63,   // X
0x07, 0x08, 0x70, 0x08, 0x07,   // Y
0x61, 0x51, 0x49, 0x45, 0x43,   // Z
0x00, 0x7F, 0x41, 0x41, 0x00,   // [
0x55, 0x2A, 0x55, 0x2A, 0x55,   // 55
0x00, 0x41, 0x41, 0x7F, 0x00,   // ]
0x04, 0x02, 0x01, 0x02, 0x04,   // ^
0x40, 0x40, 0x40, 0x40, 0x40,   // _
0x00, 0x01, 0x02, 0x04, 0x00,   // ’
0x20, 0x54, 0x54, 0x54, 0x78,   // a
0x7F, 0x48, 0x44, 0x44, 0x38,   // b
0x38, 0x44, 0x44, 0x44, 0x20,   // c
0x38, 0x44, 0x44, 0x48, 0x7F,   // d
0x38, 0x54, 0x54, 0x54, 0x18,   // e
0x08, 0x7E, 0x09, 0x01, 0x02,   // f
0x18, 0xA4, 0xA4, 0xA4, 0x7C,   // g
0x7F, 0x08, 0x04, 0x04, 0x78,   // h
0x00, 0x44, 0x7D, 0x40, 0x00,   // i
0x40, 0x80, 0x84, 0x7D, 0x00,   // j
0x7F, 0x10, 0x28, 0x44, 0x00,   // k
0x00, 0x41, 0x7F, 0x40, 0x00,   // l
0x7C, 0x04, 0x18, 0x04, 0x78,   // m
0x7C, 0x08, 0x04, 0x04, 0x78,   // n
0x38, 0x44, 0x44, 0x44, 0x38,   // o
0xFC, 0x24, 0x24, 0x24, 0x18,   // p
0x18, 0x24, 0x24, 0x18, 0xFC,   // q
0x7C, 0x08, 0x04, 0x04, 0x08,   // r
0x48, 0x54, 0x54, 0x54, 0x20,   // s
0x04, 0x3F, 0x44, 0x40, 0x20,   // t
0x3C, 0x40, 0x40, 0x20, 0x7C,   // u
0x1C, 0x20, 0x40, 0x20, 0x1C,   // v
0x3C, 0x40, 0x30, 0x40, 0x3C,   // w
0x44, 0x28, 0x10, 0x28, 0x44,   // x
0x1C, 0xA0, 0xA0, 0xA0, 0x7C,   // y
0x44, 0x64, 0x54, 0x4C, 0x44,   // z
0x00, 0x08, 0x36, 0x41, 0x00,   // {
0x00, 0x00, 0x7F, 0x00, 0x00,   // |
0x00, 0x41, 0x36, 0x08, 0x00,   // }
0x08, 0x10, 0x08, 0x04, 0x08    // ~
};

//=======================================================================================

void lcd_write(unsigned char data) //写LCD函数
{               
unsigned char n=8;
while(n>0)
{   
    n--;
    SDIN=data<<7-n>>7;   //先发送数据高位MSB,后发送数据低位LSB
    SCLK=0; SCLK=1;      //产生一个时钟
}
}   
/*上面的是模拟SPI发送数据函数,下面的是硬件SPI发送数据函数
void lcd_write(unsigned char data)
{   
SPCR=80;
SPDR=data;             //开始发送数据
while((SPSR>>7)==0);   //等待发送接收结束
}      */

//=======================================================================================
void lcd_cls(void)       //nokia3310清屏,光标复位
{
unsigned inti=0;   
DC=0;
lcd_write(128);      //光标回到0列
lcd_write(64);         //光标回到0行
DC=1;                  //准备写数据
for(i=0;i<504;i++)   //写504个0数据,就是清屏
lcd_write(0);
}   

//=======================================================================================
         
void lcd_init(void)      //nokia3310初始化函数
{   
RESET_DDRn =1;         //设置4个驱动LCD的IO脚为输出
DC_DDRn    =1;
SDIN_DDRn=1;
SCLK_DDRn=1;
RESET=0;      
RESET=1;               //复位结束
DC=0;                  //准备写指令
lcd_write(32+1);       //进入扩展指令
lcd_write(128+38);   //设置Vop,相当于亮度   
lcd_write(4+3);      //设置温度系数,相当于对比度   
lcd_write(16+3);       //设置偏置,这句要与不要的实际效果好像一样
lcd_write(32+0);       //进入基本指令
lcd_write(12);         //使能芯片活动/垂直寻址
}   

//=======================================================================================

//光标定位,x(0-83)是列地址,y(0-5)是行地址      
void lcd_gotoxy(unsigned char x,unsigned char y)
{
DC=0;
lcd_write(x+128);
lcd_write(y+64);
}

//=======================================================================================
      
void lcd_putchar(unsigned char character) //显示ASCII值的字符
{
unsigned char i=0;
unsigned int No;
No=character-32;       //字模数据是由空格开始,空格字符的ASCII的值就是32
No=No*5;               //每个字符的字模是5个字节
DC=1;   
while(i<5)             //一个字符的字模是5个字节,就是5*8点阵
   {
       lcd_write(data);   
       i++;
       No++;
   }
lcd_write(0);          //每个字符之间空一列
}   

//=====================================================================================

void lcd_put(unsigned char byte_data) //以十进制显示一个字符变量
{
lcd_putchar(byte_data/100+48);      //百位数转化为ASCII值再显示
lcd_putchar(byte_data/10%10+48);    //十位数转化为ASCII值再显示
lcd_putchar(byte_data%10+48);       //个位数转化为ASCII再再显示
}

//=====================================================================================

void lcd_puthex(unsigned char byte_data)   //以十六进制显示一个字节变量
{
unsigned char temp_data;

temp_data=byte_data>>4;                           //求高4位
if(temp_data<10) temp_data+=48; else temp_data+=55; //转化为ASCII值
lcd_putchar(temp_data);                           //显示

temp_data=byte_data&15;                           //求低4位
if(temp_data<10) temp_data+=48; else temp_data+=55; //转化为ASCII值
lcd_putchar(temp_data);                           //显示
}

//=====================================================================================

void lcd_putsf(flash unsigned char *string , unsigned char n) //显示FLASH里面的字符串
{         
unsigned char i=0;
while(i<n)
       {   
         lcd_putchar( string[ i ] );    //顺序显示字符
         i++;                           
       }
}

panxiaoyi 发表于 2008-2-2 04:14:57

常用的CRC校验有CRC8、CRC16、CRC32等,DS18B20数字温度器件就是采用CRC8的校验方式,下面是CVAVR集成的CRC8校验函数

#include <mega48.h>
#include <1wire.h>
unsigned char a[]={0x28,0x6D,0x00,0x85,0x00,0x00,0x00,0xCF};
unsigned char crc8;
main()
{
while(1)
       {
         crc8=w1_dow_crc8(a,7); //求数组a的前7个数的CRC8校验码
       }
}

上面的例子中,数组a的8个数据就是我的DS18B20的ID码,0x28是器件的家族码,0x6D,0x00,0x85,0x00,0x00,0x00这6个数就是ID码,0xCF是前面7个数的校验码

用AVR Studio调试上面的程序就可以看到,crc8的结果就是0xCF了

也可以自己写函数,功能与上面的一样

unsigned char crc8(unsigned char *ptr, unsigned char len)
{
unsigned char i;
unsigned char crc=0;
while(len--!=0)
   {
   for(i=1; i!=0; i*=2)
      {
      if((crc&1)!=0) {crc/=2; crc^=0x8C;}
      else crc/=2;
      if((*ptr&i)!=0) crc^=0x8C;   
       }
   ptr++;
    }
return(crc);
}

langeliu 发表于 2008-2-2 10:51:59

好东西,做个记号

caixiong 发表于 2008-2-3 14:21:00

.

zxq6 发表于 2008-2-28 17:45:49

谢谢,标记一个。

huyugv_830913 发表于 2008-2-28 23:19:56

Very good!Thank you.

xiaorenren 发表于 2008-2-28 23:24:35

顶!

fshong 发表于 2008-2-29 08:50:43

我觉得DS18B20不是太准,刚上电的时候读的值是准的,但之后就以0.1度慢慢上升,与实测温度误差4~5度

hhrfjz 发表于 2008-2-29 09:06:09

【29楼】 fshong
我没有发现这种情况,和普通温度表对比还是挺准的。

fshong 发表于 2008-2-29 11:03:18

我是用89c4051做的,我想是我的程序有问题吧!还没找到问题,郁闷中.......

wangxiaoacc 发表于 2008-2-29 16:56:40

做个记号保留,用到的时候再来下。谢谢了!

525133174 发表于 2008-3-1 21:34:40

还没有玩过,有空也要玩一下.
谢谢楼主!

heizi302 发表于 2008-3-2 17:59:34

谢谢先

hhrfjz 发表于 2008-3-7 18:00:44

fshong,不知道你的问题解决了没有,我今天又用18B20了,没有出现你说的升高的问题。一切都正常。

lihq97 发表于 2008-3-7 18:54:22

好东西。先留个记号,以后有需要再看

hl0716 发表于 2008-3-14 19:02:10

记号,谢谢楼主们分享

Richey 发表于 2008-3-14 23:38:45

sign

stevenlu 发表于 2008-3-15 09:13:31

收下,看完了datasheet完全不知道怎么着手写。还得好好加油啊

wisebaby 发表于 2008-4-23 16:53:23

..jiayou.

microyao 发表于 2008-4-23 20:28:05

不用LIBC移置是个问题。

jack 发表于 2008-4-24 14:41:59

阿艺,不错的好资料,学习,致敬!

chenxduan 发表于 2008-5-8 19:08:57

大家都用过这个程序了吗?
我试了一下,不通,感觉初始化好像不对啊!
我用的是avr studio
调试的时候就停在while(CHECK_IP_1WIRE);这里了,
看了下程序,好像和手册上说的不一样!
http://cache.amobbs.com/bbs_upload782111/files_10/ourdev_270803.jpg
初始化时序 (原文件名:未命名.jpg)

大家帮忙看看,小弟是新手,指点指点!
多谢了!

jhoee 发表于 2008-5-9 12:04:26

mark

sciencehero 发表于 2008-5-9 12:40:19

很好

guoxiongmao 发表于 2008-5-11 04:30:00

我的怎么就不行呢

bjj9217 发表于 2008-5-11 09:29:35

学习!

laoliu2008 发表于 2008-5-11 19:11:18

我觉得一次就读出温度有些浪费cpu的资源 呵呵 我是定时器中断里去读温度的   比如第一次中断只复位ds18b20同时启动转换
第二次中断的时候复位读数   第三次的时候数据处理当然操作的时候要关闭中断的



ds18b20的测温精度是0.5摄氏度 虽然分辨率可以到0.0625

endlesslzx 发表于 2008-5-11 21:33:16

做个记号,要用的时候在看

xj_1232005 发表于 2008-5-11 22:09:03

好东东

zlutian 发表于 2008-5-12 09:09:50

真的不错,谢谢

ChenHP 发表于 2008-5-12 16:52:22

MARK

252177861 发表于 2008-5-14 22:55:00

我的DS18b20也出现过类似温度升高的问题,在刚上电的时候能稳定2秒钟,然后会慢慢的升高到1度左右停止。会不会是芯片批次不一样的结果。会不会是芯片需要供电,在芯片的内部微热而发生的,不知道增大数据线上的上拉电阻会不会改善一些。我的数据线上的上啦为5K

yemingxp 发表于 2008-5-15 00:09:37

mark...

xiaoruo1116 发表于 2008-5-16 09:45:24

嗨,调了一天还是没调出来,不知哪出了问题……
郁闷……

spy2008 发表于 2008-5-16 12:25:58

不错

liu5221 发表于 2008-5-16 21:57:28

不知为何,我用8M的晶振,用示波器看了一下,LZ微秒延时程序很不准,实际的延时(微秒的那个)为大约16倍时间。

jyhanxiao 发表于 2008-5-29 12:39:02

呵呵,谢谢楼主无私奉献

taishandadi 发表于 2008-5-29 14:31:13

mark

ndust 发表于 2008-5-29 15:19:51

记号

pcwinner 发表于 2008-5-29 21:17:48

我也来个记号....

jemmy 发表于 2008-5-29 22:36:25

收藏,以后试一试。。。。。。。

njnuaya 发表于 2008-6-7 14:34:02

mark

guandavid 发表于 2008-6-30 16:58:13

mark

yinhe 发表于 2008-8-6 13:52:47

记号

macchange 发表于 2008-8-7 21:08:40

marking. ......thanks ../

footballboy9 发表于 2008-8-7 23:45:10

好东西,收藏了!

fengxianjin 发表于 2008-8-8 09:47:08

谢谢!

yangdoing 发表于 2008-8-13 13:13:47

好东西,支持个!

kevin8 发表于 2008-8-13 15:04:07

好东西,要记号

lanfeng007 发表于 2008-8-13 23:26:46

好东西,顶下。

xiaodong 发表于 2008-8-14 00:01:45

18B20的时序就是麻烦...好在有楼主的程序..

knight_avr 发表于 2008-8-14 09:53:37

MARK!!!

zuan 发表于 2008-8-14 10:03:57

做个标记。。^^

litchiate 发表于 2008-8-14 10:05:25

如何显示小数?非要用浮点么?

stayzhang 发表于 2008-8-14 10:25:45

Mark

cuhon 发表于 2008-8-15 22:10:11

谢谢,收藏了

bcndance 发表于 2008-8-19 08:51:49

mark

yxlcarter 发表于 2008-9-9 11:32:48

来做个记号,有空调一下,现在还没有器件

Schmittlong 发表于 2008-9-9 15:11:28

用18b20測試時出現溫度往上漂的情況是因為材料在通電工作后,消耗功率所致.解決此問題很簡單: 將sensor緊貼在一塊1平方厘米左右的金屬片上即可.

以上是經過驗證的,希對各位有用!

avr1008 发表于 2008-9-9 16:34:35

pally2004 发表于 2008-9-9 16:40:43

mark!!

yxlcarter 发表于 2008-9-22 16:38:21

恩,楼主的不错,网上很多都不行,

chn0924 发表于 2008-9-29 10:53:55

很喜欢啊艺那种模块化的风格

xiaog0219 发表于 2008-10-24 19:32:57

mark!!!!!!!!!!!!

ItTakes5 发表于 2009-2-21 20:46:26

我想问一下,如果用CC2430与DS18B20连接应该要注意什么?程序又要怎么改?

feiyang007 发表于 2009-2-21 21:05:56

好东西哦!!

bbsniua 发表于 2009-2-22 19:17:24

保存一下!有空看看!

lsb200 发表于 2009-2-23 11:41:20

很不错的程序,我仿真通过了。

wajlh 发表于 2009-2-23 11:44:41

标号

cgbabc 发表于 2009-2-23 15:59:20

支持一个

feiyang007 发表于 2009-2-26 13:41:05

我又来了,我是菜鸟,不明白这三个宏定义:
------------------------------------------------------------------
#define CLR_DIR_1WIRE DDRC&=~BIT(2)   //只要修改这里的参数就可以了!呵呵!
#define SET_DIR_1WIRE DDRC|=BIT(2)      //里面什么都不用该!
#define CLR_OP_1WIRE PORTC&=~BIT(2)
#define SET_OP_1WIRE PORTC|=BIT(2)
------------------------------------------
哪位给指点一下,麻烦了,我不懂。

1860 发表于 2009-2-26 14:30:18

先标记一下,以后应该用到

ml07077 发表于 2009-3-5 22:03:23

谢!

ml07077 发表于 2009-3-5 22:03:33

谢!

zzy9903 发表于 2009-3-6 11:05:45

做个记号,DS18B20

zhdbao88 发表于 2009-3-6 13:13:26

不错..支持.

apo34210 发表于 2009-3-10 11:32:09

自带的延时程序绝对不比自己写的延时程序精度差,只不过它有些特定条件,晶振问题,范围问题,

thisisarquine 发表于 2009-3-13 12:02:39

恩,学习了
页: [1] 2 3
查看完整版本: DS18B20头文件!绝对好使!还使用方便!M16 8M 的!