#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,程序需要怎么修改,谢谢大家指导。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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指令法,对想要进行的芯片再进行操作。
一周热门 更多>