#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,程序需要怎么修改,谢谢大家指导。。。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
重新检查下程序,不输入SKIP ROM[oxcc],就能检测ROM CRC了,我己经调试出来了,设定寄存器中的HI和LI,如果我想增加8个或者更多DS18B20,程序需要怎么修改,谢谢。
一周热门 更多>