13,826
社区成员
发帖
与我相关
我的任务
分享
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^7;
bit DS18B20_IS_OK = 1;
bit Plus_Minus = 0;
bit Point = 0;
uchar time;
uchar Number,Decimal;
uchar Temp_Value[] = {0,0};
uchar Display_Digit[] = {0,0,0,0x0c};
uchar Error[] = {0x86,0xaf,0xaf,0x0ff};
uchar code Num_Tab[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0x70};
void delaynms(int x)
{
uchar i;
while(x--)
for(i=0;i<123;i++);
}
bit Init_DS18B20()
{
bit status;
DQ = 1;
for(time=0;time<3;time++);
DQ = 0;
for(time=0;time<150;time++);
DQ = 1;
for(time=0;time<15;time++);
status = DQ;
for(time=0;time<100;time++);
DQ = 1;
return status;
}
unsigned char ReadOnebyte()
{
unsigned char i,dat;
for(i=0;i<8;i++)
{
DQ = 1;
_nop_();
DQ = 0;
dat >>= 1;
_nop_();
DQ = 1;
for(time=0;time<2;time++);
if(DQ==1)
dat |= 0x80;
else
dat |= 0x00;
for(time=0;time<15;time++);
}
return dat;
}
uchar WriteOnebyte(uchar dat)
{
unsigned char i = 0;
for(i=0;i<8;i++)
{
DQ = 1;
_nop_();
DQ = 0;
DQ = dat&0x01;
for(time=0;time<10;time++);
DQ = 1;
for(time=0;time<2;time++);
dat >>= 1;
}
for(time=0;time<15;time++);
}
void ReadyReadTemp(void)
{
Init_DS18B20();
WriteOnebyte(0xCC);
WriteOnebyte(0x44);
for(time=0;time<100;time++);
Init_DS18B20();
WriteOnebyte(0xCC);
WriteOnebyte(0xBE);
}
void Read_Temperature()
{
if(Init_DS18B20()==1)
DS18B20_IS_OK = 0;
else
{
DS18B20_IS_OK = 1;
ReadyReadTemp();
Temp_Value[0] = ReadOnebyte();
Temp_Value[1] = ReadOnebyte();
Plus_Minus = 0;
if((Temp_Value[1]&0xF8)==0xF8)
{
Plus_Minus = 1;
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=(~Temp_Value[0])+1;
if(Temp_Value[0]==0x00)
Temp_Value[1]++;
}
Number=Temp_Value[1]*16+Temp_Value[0]/16;
Decimal=(Temp_Value[0]%16)*10/16;
}
}
void Data_Process()
{
if(Plus_Minus==1)
{
Display_Digit[0]=0x0b;
if(Number>9)
{
Display_Digit[1]=Number/10;
Display_Digit[2]=Number%10;
Point = 0;
}
else
{
Display_Digit[1]=Number;
Display_Digit[2]=Decimal;
Point = 1;
}
}
else
{
if(Number>99)
{
Display_Digit[0]=Number/100;
Display_Digit[1]=(Number/10)%10;
Display_Digit[2]=Number%10;
Point = 0;
}
else
if(Number>9)
{
Display_Digit[0]=Number/10;
Display_Digit[1]=Number%10;
Display_Digit[2]=Decimal;
Point = 1;
}
else
{
Display_Digit[0]=0x0a;
Display_Digit[1]=Number;
Display_Digit[2]=Decimal;
Point = 1;
}
}
}
void Data_Display(void)
{
P2=0xf7;
P0=Num_Tab[Display_Digit[0]];
delaynms(2);
P0=0xff;
P2=0xfb;
if(Point==1)
{
P0=Num_Tab[Display_Digit[1]]&0x7f;
}
else
{
P0=Num_Tab[Display_Digit[1]];
}
delaynms(2);
P0=0xff;
P2=0xfd;
P0=Num_Tab[Display_Digit[2]];
delaynms(2);
P0=0xff;
P2=0xfe;
P0=Num_Tab[Display_Digit[3]];
delaynms(2);
P0=0xff;
P2=0xff;
}
void Error_Display(void)
{
uchar i;
P2=0xf7;
for(i=0;i<4;i++)
{
P0=Error[i];
delaynms(3);//delaynms[3];
P2=P2>>1;
}
}
void main(void)
{
delaynms(5);
while(1)
{
Read_Temperature();
if(DS18B20_IS_OK==1)
{
Read_Temperature();
Data_Process();
Data_Display();
}
else
{
Error_Display();
}
}
}