搜索
bottom↓
回复: 298

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

[复制链接]

出0入0汤圆

发表于 2006-8-13 14:31:33 | 显示全部楼层 |阅读模式
终于调通了!哈哈:

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

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

只需调用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编辑过

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2006-8-13 14:50:28 | 显示全部楼层
楼主长春哪的?俺也是长春的 有机会交流下啊 我是菜鸟呵呵

出0入0汤圆

 楼主| 发表于 2006-8-13 14:54:33 | 显示全部楼层
呵呵,是吗?好高兴!

汽车厂的!你呢?

我的MSN:hhrfjz@hotmail.com

出0入0汤圆

发表于 2006-8-13 15:01:06 | 显示全部楼层
我吉林大学的,还没毕业 呵呵 幸会 !向你学习啊

出0入0汤圆

 楼主| 发表于 2006-8-13 15:03:43 | 显示全部楼层
哦,好大学阿!我该向你学习啊!呵呵,

出0入0汤圆

发表于 2006-8-13 15:11:03 | 显示全部楼层
客气了!!!我刚学这个不久,,我不是学这个专业的,,爱好而已了!!你不用QQ啊? 我QQ52115953 MSN上不去

出0入0汤圆

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

出0入0汤圆

发表于 2006-8-13 21:51:09 | 显示全部楼层
搂住,问一下,你为什么不用自带的延时函数呢,我看了许多人都没有使用自带的函数,而是自己做延时函数,我也在调试1820,就是调不出来,是不是自带延时不准啊

出0入0汤圆

 楼主| 发表于 2006-8-13 22:16:19 | 显示全部楼层
我习惯自己写头文件,这个延时程序是在AVR 8M 的时钟下正常运行的!



主要是哪个delay_nms();



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



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



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

出0入0汤圆

发表于 2006-9-29 16:06:28 | 显示全部楼层
这个头文件不会用啊.楼主帮忙一下啊.

出0入0汤圆

发表于 2006-9-30 09:15:34 | 显示全部楼层
很菜的问一句,用示波器怎么调延时。。谢谢

出0入0汤圆

发表于 2006-12-23 16:08:03 | 显示全部楼层
谢谢了,我用上就好了。

出0入0汤圆

发表于 2006-12-23 19:45:51 | 显示全部楼层
呵呵,收藏先

出0入0汤圆

发表于 2006-12-25 20:57:09 | 显示全部楼层
谢谢了,收藏先.

出0入0汤圆

发表于 2007-11-18 21:30:28 | 显示全部楼层
我实验过了,很好用,谢谢楼住!

出0入0汤圆

发表于 2008-1-11 23:17:16 | 显示全部楼层
hao

出0入0汤圆

发表于 2008-1-16 16:33:22 | 显示全部楼层
好东西,可是我用上之后,好象DS18B20测量的温度在升高,尤其是当室温为10度左右时,温度上升的很快,断电再通电后,温度有时可以差
4度之多!是什么问题呢?有人遇到过这个问题吗?请指点

出0入0汤圆

发表于 2008-2-1 18:02:59 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2008-2-1 18:37:58 | 显示全部楼层
记号一下。

出0入0汤圆

发表于 2008-2-2 04:12:34 | 显示全部楼层
我也发一个,CVAVR的,使用NOKIA3310/5110LCD作显示

出0入0汤圆

发表于 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 int  data_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的库,如果大家不喜欢上面我写的函数,也可以使用自带的
*/

出0入0汤圆

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

#define monobus_1  DDRC.0=0  //设置单片机IO为输入,由于总线存在上拉电阻,所以此时电平是1
#define monobus_0  DDRC.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;
}

出0入0汤圆

发表于 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_DDRn  DDRB.3  
#define SCLK_DDRn  DDRB.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 int  i=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[No]);   
       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++;                           
       }  
}

出0入0汤圆

发表于 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);
}

出0入0汤圆

发表于 2008-2-2 10:51:59 | 显示全部楼层
好东西,做个记号

出0入0汤圆

发表于 2008-2-3 14:21:00 | 显示全部楼层
.

出0入22汤圆

发表于 2008-2-28 17:45:49 | 显示全部楼层
谢谢,标记一个。

出0入0汤圆

发表于 2008-2-28 23:19:56 | 显示全部楼层
Very good!Thank you.

出0入0汤圆

发表于 2008-2-28 23:24:35 | 显示全部楼层
顶!

出0入0汤圆

发表于 2008-2-29 08:50:43 | 显示全部楼层
我觉得DS18B20不是太准,刚上电的时候读的值是准的,但之后就以0.1度慢慢上升,与实测温度误差4~5度

出0入0汤圆

 楼主| 发表于 2008-2-29 09:06:09 | 显示全部楼层
【29楼】 fshong
我没有发现这种情况,和普通温度表对比还是挺准的。

出0入0汤圆

发表于 2008-2-29 11:03:18 | 显示全部楼层
我是用89c4051做的,我想是我的程序有问题吧!还没找到问题,郁闷中.......

出0入0汤圆

发表于 2008-2-29 16:56:40 | 显示全部楼层
做个记号保留,用到的时候再来下。谢谢了!

出0入0汤圆

发表于 2008-3-1 21:34:40 | 显示全部楼层
还没有玩过,有空也要玩一下.
谢谢楼主!

出0入0汤圆

发表于 2008-3-2 17:59:34 | 显示全部楼层
谢谢先

出0入0汤圆

 楼主| 发表于 2008-3-7 18:00:44 | 显示全部楼层
fshong,不知道你的问题解决了没有,我今天又用18B20了,没有出现你说的升高的问题。一切都正常。

出0入0汤圆

发表于 2008-3-7 18:54:22 | 显示全部楼层
好东西。先留个记号,以后有需要再看

出0入0汤圆

发表于 2008-3-14 19:02:10 | 显示全部楼层
记号,谢谢楼主们分享

出0入0汤圆

发表于 2008-3-14 23:38:45 | 显示全部楼层
sign

出0入0汤圆

发表于 2008-3-15 09:13:31 | 显示全部楼层
收下,看完了datasheet完全不知道怎么着手写。还得好好加油啊

出0入0汤圆

发表于 2008-4-23 16:53:23 | 显示全部楼层
..jiayou.

出0入0汤圆

发表于 2008-4-23 20:28:05 | 显示全部楼层
不用LIBC移置是个问题。

出0入0汤圆

发表于 2008-4-24 14:41:59 | 显示全部楼层
阿艺,不错的好资料,学习,致敬!

出0入0汤圆

发表于 2008-5-8 19:08:57 | 显示全部楼层
大家都用过这个程序了吗?
我试了一下,不通,感觉初始化好像不对啊!
我用的是avr studio
调试的时候就停在while(CHECK_IP_1WIRE);这里了,
看了下程序,好像和手册上说的不一样!

初始化时序 (原文件名:未命名.jpg)

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

出0入0汤圆

发表于 2008-5-9 12:04:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-5-9 12:40:19 | 显示全部楼层
很好

出0入0汤圆

发表于 2008-5-11 04:30:00 | 显示全部楼层
我的怎么就不行呢

出0入46汤圆

发表于 2008-5-11 09:29:35 | 显示全部楼层
学习!

出0入0汤圆

发表于 2008-5-11 19:11:18 | 显示全部楼层
我觉得一次就读出温度有些浪费cpu的资源 呵呵 我是定时器中断里去读温度的   比如第一次中断只复位ds18b20同时启动转换
第二次中断的时候复位读数   第三次的时候数据处理  当然操作的时候要关闭中断的



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

出0入0汤圆

发表于 2008-5-11 21:33:16 | 显示全部楼层
做个记号,要用的时候在看

出0入0汤圆

发表于 2008-5-11 22:09:03 | 显示全部楼层
好东东

出0入0汤圆

发表于 2008-5-12 09:09:50 | 显示全部楼层
真的不错,谢谢

出0入0汤圆

发表于 2008-5-12 16:52:22 | 显示全部楼层
MARK

出0入0汤圆

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

出0入0汤圆

发表于 2008-5-15 00:09:37 | 显示全部楼层
mark...

出0入0汤圆

发表于 2008-5-16 09:45:24 | 显示全部楼层
嗨,调了一天还是没调出来,不知哪出了问题……
郁闷……

出0入0汤圆

发表于 2008-5-16 12:25:58 | 显示全部楼层
不错

出0入0汤圆

发表于 2008-5-16 21:57:28 | 显示全部楼层
不知为何,我用8M的晶振,用示波器看了一下,LZ微秒延时程序很不准,实际的延时(微秒的那个)为大约16倍时间。

出0入0汤圆

发表于 2008-5-29 12:39:02 | 显示全部楼层
呵呵,谢谢楼主无私奉献

出75入4汤圆

发表于 2008-5-29 14:31:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-5-29 15:19:51 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-5-29 21:17:48 | 显示全部楼层
我也来个记号....

出0入0汤圆

发表于 2008-5-29 22:36:25 | 显示全部楼层
收藏,以后试一试。。。。。。。

出0入0汤圆

发表于 2008-6-7 14:34:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-6-30 16:58:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-8-6 13:52:47 | 显示全部楼层
记号

出0入0汤圆

发表于 2008-8-7 21:08:40 | 显示全部楼层
marking. ......thanks ../

出0入0汤圆

发表于 2008-8-7 23:45:10 | 显示全部楼层
好东西,收藏了!

出0入0汤圆

发表于 2008-8-8 09:47:08 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2008-8-13 13:13:47 | 显示全部楼层
好东西,支持个!

出0入0汤圆

发表于 2008-8-13 15:04:07 | 显示全部楼层
好东西,要记号

出0入0汤圆

发表于 2008-8-13 23:26:46 | 显示全部楼层
好东西,顶下。

出0入0汤圆

发表于 2008-8-14 00:01:45 | 显示全部楼层
18B20的时序就是麻烦...好在有楼主的程序..

出0入0汤圆

发表于 2008-8-14 09:53:37 | 显示全部楼层
MARK!!!

出0入0汤圆

发表于 2008-8-14 10:03:57 | 显示全部楼层
做个标记。。^^

出0入0汤圆

发表于 2008-8-14 10:05:25 | 显示全部楼层
如何显示小数?  非要用浮点么?

出0入0汤圆

发表于 2008-8-14 10:25:45 | 显示全部楼层
Mark

出0入0汤圆

发表于 2008-8-15 22:10:11 | 显示全部楼层
谢谢,收藏了

出0入0汤圆

发表于 2008-8-19 08:51:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2008-9-9 11:32:48 | 显示全部楼层
来做个记号,有空调一下,现在还没有器件

出0入0汤圆

发表于 2008-9-9 15:11:28 | 显示全部楼层
用18b20測試時出現溫度往上漂的情況是因為材料在通電工作后,消耗功率所致.解決此問題很簡單: 將sensor緊貼在一塊1平方厘米左右的金屬片上即可.

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

出0入0汤圆

发表于 2008-9-9 16:34:35 | 显示全部楼层

出0入0汤圆

发表于 2008-9-9 16:40:43 | 显示全部楼层
mark!!

出0入0汤圆

发表于 2008-9-22 16:38:21 | 显示全部楼层
恩,楼主的不错,网上很多都不行,

出0入0汤圆

发表于 2008-9-29 10:53:55 | 显示全部楼层
很喜欢啊艺那种模块化的风格

出0入0汤圆

发表于 2008-10-24 19:32:57 | 显示全部楼层
mark!!!!!!!!!!!!

出0入0汤圆

发表于 2009-2-21 20:46:26 | 显示全部楼层
我想问一下,如果用CC2430与DS18B20连接应该要注意什么?程序又要怎么改?

出0入0汤圆

发表于 2009-2-21 21:05:56 | 显示全部楼层
好东西哦!!

出0入0汤圆

发表于 2009-2-22 19:17:24 | 显示全部楼层
保存一下!有空看看!

出0入0汤圆

发表于 2009-2-23 11:41:20 | 显示全部楼层
很不错的程序,我仿真通过了。

出0入4汤圆

发表于 2009-2-23 11:44:41 | 显示全部楼层
标号

出0入0汤圆

发表于 2009-2-23 15:59:20 | 显示全部楼层
支持一个

出0入0汤圆

发表于 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)
------------------------------------------
哪位给指点一下,麻烦了,我不懂。

出0入0汤圆

发表于 2009-2-26 14:30:18 | 显示全部楼层
先标记一下,以后应该用到

出0入0汤圆

发表于 2009-3-5 22:03:23 | 显示全部楼层
谢!

出0入0汤圆

发表于 2009-3-5 22:03:33 | 显示全部楼层
谢!

出85入4汤圆

发表于 2009-3-6 11:05:45 | 显示全部楼层
做个记号,DS18B20

出0入0汤圆

发表于 2009-3-6 13:13:26 | 显示全部楼层
不错..支持.

出0入0汤圆

发表于 2009-3-10 11:32:09 | 显示全部楼层
自带的延时程序绝对不比自己写的延时程序精度差,只不过它有些特定条件,晶振问题,范围问题,

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 23:54

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

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