C51读DS18B20 ROM CRC

2020-01-27 11:43发布

#include <reg51.h>   
#include "intrins.h"


unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

sbit DQ=P3^3;                                  
unsigned char tempL=0;                        
unsigned char tempH=0;                       
unsigned char temp2=0;                        
unsigned char temp3=0;                       
unsigned char temp4=0;                
unsigned char temp5=0;                       
unsigned char temp6=0;                        
unsigned char temp7=0;                       
unsigned char temp8=0;                        

float temperature;                            



void delay(unsigned int k)
{         
        unsigned int n=0;     
        while(n< k)      
        {
          n++;
  }  
        return;      
}  


void delay1(void)
{
        int k;
        for(k=0;k<400;k++);
}



void display(int k)
{
        P2=0xfe;                       
        P0=tab[k/1000];
        delay1();

        P2=0xfd;
        P0=tab[k%1000/100];
        delay1();

        P2=0xfb;
        P0=tab[k%100/10];
        delay1();

        P2=0xf7;
        P0=tab[k%10];
        delay1();

        P2=0xff;
}



Init_DS18B20(void)
{
        unsigned char x=0;
          DQ=1;                                 
          delay(15);                  

          DQ=0;                            
          delay(70);                     


          DQ=1;                                 
          delay(15);                     


}


ReadOneChar(void)                         
{
        unsigned char i=0;                
        unsigned char dat=0;
    for (i=8;i>0;i--)                 
                {
                        DQ=1;
                    delay(1);
                    DQ=0;      
                    dat>>=1;
                           DQ=1;
                    if(DQ)
                           dat|=0x80;
                    delay(4);
                }
    return(dat);
}



WriteOneChar(unsigned char dat)
{
        unsigned char i=0;                
        for(i=8;i>0;i--)         
        {
                DQ=0;           
                DQ=dat&0x01;
                delay(5);
                DQ=1;
                dat>>=1;
        }
        delay(4);
}



ReadTemperature(void)
{  
       
        Init_DS18B20();                 
        WriteOneChar(0xcc);       
        WriteOneChar(0x33);
       
//         Init_DS18B20();                         
//         WriteOneChar(0xcc);                 
//         WriteOneChar(0x44);                
//         delay(125);                                  
//         Init_DS18B20();                         
//         WriteOneChar(0xcc);                 
//         WriteOneChar(0xbe);                
        tempL=ReadOneChar();        
        tempH=ReadOneChar();        
        temp2=ReadOneChar();
        temp3=ReadOneChar();
        temp4=ReadOneChar();
        temp5=ReadOneChar();
        temp6=ReadOneChar();
        temp7=ReadOneChar();
        temp8=ReadOneChar();
//         temperature=((tempH*256)+tempL)*0.0625;
//         delay(200);
//         return(temperature);
}



void  main()
{
        float i;
        while(1)
        {
                i=ReadTemperature();
                display(i);
        }
}



请大家告诉我怎么读ROM中的数值和CRC和设定寄存器中的HI和LI,如果我想增加8个或者更远DS18B20,程序需要怎么修改,谢谢大家指导。。。。




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
MAO.J.L
1楼-- · 2020-01-27 12:17
建议你把DS18B20的数据手册详细看一遍,尤其是做多点测温。
DS18B20工作分三步:1.初始化复位 2.写ROM指令 3.写功能指令。
你说的ROM指令中的芯片序列号,在第二步。具体的读出数值指令可以参见数据手册里。
包括:
1.0x33读ROM指令,1字节的系列码和6字节的序列号,只有在单点模式下使用。(采用多个IO口进行多个单点测温)
2.0x55匹配ROM指令,在多点测温下,所有器件挂接在一个总线上,在初始化后,发送匹配ROM指令后,再发送相应的64位序列位,以下操作即对相应DS18B20进行,每次需要进行发送初始化指令,匹配ROM指令,发序列号,写功能指令完成相应操作。(需要提前将序列号存放在控制器ROM里面)
3.0xf0搜索ROM指令,可以到MAXIM官网去搜索 DS18B20,然后找对应的 搜索ROM指令算法,里面涉及到自动搜索的算法,较复杂。

你现在的程序里面,在读温度的时候,写的是oxcc指令,也就是跳ROM指令,这种是在单点模式下用的。比较简单的方法,利用匹配ROM指令法。开始先通过0X33把各个DS18B20的序列号,逐一读回,然后在处理器里面建立一个对应表,用匹配ROM指令法,对想要进行的芯片再进行操作。
jamasliu
2楼-- · 2020-01-27 13:18
本帖最后由 jamasliu 于 2013-7-5 18:20 编辑

重新检查下程序,不输入SKIP ROM[oxcc],就能检测ROM CRC了,我己经调试出来了,设定寄存器中的HI和LI,如果我想增加8个或者更多DS18B20,程序需要怎么修改,谢谢。

一周热门 更多>