📄 18b20.c
字号:
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// DS10B20.c
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#define _Nop() _nop_() /*定义空指令*/
#include "DS1302.h"
//------- DS18B20 Temper ---------------------------------------
#define TEMH_ALM 50
#define TEML_ALM 10
#define CONFIG 0x7f // 1f=9; 3f=10; 5f=11; 7f=12A/D
bit TEM_FD; //-=1
//bit TEM_100; // >100,=1
sbit DT0 = P1^7; // Temper_0
sbit DT1 = P1^6; // Temper_1
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void delay(UI use)
{
for(; use>0; use--);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
void yys(UC yscnt) // 1=35ms
{
UI y;
for(;yscnt>0;yscnt--)
{
y=0xfff;
while(y!=0)
{
y--;
}
}
}
//**************************************************************
// 18B20_0
//******************************************************
//----reset0---------------------------
UC ow_reset0()
{
UC presence=1;
DT0 = 0;
delay(40); // 40=480...960us
DT0=1;
delay(5); // 15...60us,1=17us
presence=DT0;
delay(15); // >60..240us
return(presence);// ok=0, no=1
}
//------read byte-----------------------
UC read_byte0(void)
{
UC i,ii;
UC value=0;
for(i=8; i>0; i--)
{
value>>=1;
DT0=0;
DT0=1;
for(ii=0; ii<3; ii++);// >15us ,<20us ******
if(DT0)
value|=0x80;
delay(3); // 1=17us
}
return(value);
}
//------- write byte-------------------
void write_byte0(char val)
{
UC i;
for(i=8;i>0;i--)
{
DT0=0;
DT0=val&0x01;
delay(5); // 60...120us
DT0=1;
val=val/2;
}
delay(5); //60...120us
}
//------------------------------------------------------
//------- ini 18b02 -----------------------
void ini_18b20(void)
{
ow_reset0(); // write byte
write_byte0(0xcc); //skip ROM
write_byte0(CONFIG);
// write_byte0(0x4e);
// write_byte0(TEMH_ALM);
// write_byte0(TEML_ALM);
}
//******************************************
//------read temperature_0 --------------------
UI read_temper0(void)
{
UI teml,temh,temper,t,tt;
teml=temh=0;
ow_reset0();
write_byte0(0xcc);
write_byte0(0x44); // start A/D
yys(22); // delay>750ms, 1=35ms, 22=782ms
ow_reset0(); // read byte
write_byte0(0xcc);
write_byte0(0xbe); // read 9 RAM
teml=(unsigned int)read_byte0(); // L tem, in ds18b20 RAM 0,1,2,3,4
temh=(unsigned int)read_byte0(); // H tem
//t2=read_byte();
//t3=read_byte();
//t4=read_byte();
//temh=(unsigned int)0x00; // test T ***********************************************
//teml=(unsigned int)0x08; // test T ***********************************************
temper=temh;
if((temper&0x00f8)==0x00f8) //负值 符号处理
{
temh= ~temh;
teml= (~teml)&0x00ff;
temper=((temh<<8)+teml)+1;
teml=temper;
tt=((temper/16)<<8); // ZS(16)
temper=(teml&0x000f)*100;
t=(temper/16)&0x00ff; // XS(16)
temper=tt+t;
TEM_FD=1; // 负值符号
}
else
{
temper=((temh<<8)+teml)&0xfff0;
tt=(temper/16)<<8; // ZS(16)
temper=(teml&0x000f)*100;
t=temper/16; // XS(16)
temper=tt+t;
TEM_FD=0;
}
return(temper);
}
//-----------------------------------------
//*********************************************************
// DS18B20_1
//*********************************************************
//----reset------------------------------------------------
UC ow_reset1(void)
{
UC presence=1;
DT1 = 0;
delay(40); // 40=480...960us
DT1=1;
delay(5); // 15...60us,1=17us
presence=DT1;
delay(15); // >60..240us
return(presence);// ok=0, no=1
}
//------read byte-----------------------
UC read_byte1(void)
{
UC i,ii;
UC value=0;
for(i=8; i>0; i--)
{
value>>=1;
DT1=0;
DT1=1;
for(ii=0; ii<3; ii++);// >15us ,<20us ******
if(DT1)
value|=0x80;
delay(3); // 1=17us
}
return(value);
}
//------- write byte-------------------
void write_byte1(char val)
{
UC i;
for(i=8;i>0;i--)
{
DT1=0;
DT1=val&0x01;
delay(5); // 60...120us
DT1=1;
val=val/2;
}
delay(5); //60...120us
}
//---------------------------------------
//------ ini 18B20_1-------------------------------------
void ini_18b21(void)
{
ow_reset1(); // write byte
write_byte1(0xcc); //skip ROM
write_byte1(CONFIG);
// write_byte1(0x4e);
// write_byte1(TEMH_ALM);
// write_byte1(TEML_ALM);
}
//*****************************************************
//------read temperature_1-------------------------------
UI read_temper1(void)
{
UI teml,temh,temper,t,tt;
teml=temh=0;
ow_reset1();
write_byte1(0xcc);
write_byte1(0x44); // start A/D
yys(22); // delay>750ms, 1=35ms, 22=782ms
ow_reset1(); // read byte
write_byte1(0xcc);
write_byte1(0xbe); // read 9 RAM
teml=(unsigned int)read_byte1(); // L tem, in ds18b20 RAM 0,1,2,3,4
temh=(unsigned int)read_byte1(); // H tem
//t2=read_byte();
//t3=read_byte();
//t4=read_byte();
//temh=(unsigned int)0x00; // test **************************************
//teml=(unsigned int)0x00; // test **************************************
temper=temh;
if((temper&0x00f8)==0x00f8)
{
temh= ~temh;
teml= (~teml)&0x00ff;
temper=((temh<<8)+teml)+1;
teml=temper;
tt=((temper/16)<<8); // ZS(16)
temper=(teml&0x000f)*100;
t=(temper/16)&0x00ff; // XS(16)
temper=tt+t;
TEM_FD=1;
}
else
{
temper=((temh<<8)+teml)&0xfff0;
tt=(temper/16)<<8; // ZS(16)
temper=(teml&0x000f)*100;
t=(temper/16)&0x00ff; // XS(16)
temper=tt+t;
TEM_FD=0;
}
return(temper);
}
//------------------------------------------------
// temer_0
void dis_t0(void)
{
UI temp,t,tt;
//timer_0
led[6]=0x37; // display Home, 6, 7
temp=read_temper0();
t=tt=temp;
if(TEM_FD) // 负值符号
{
led[5]=0x01; // - 符号
tt=temp>>8;
led[4]=led_bcd[(unsigned char)tt/10]; tt%=10; // ZS (16) -> (10)
if(led[4]==0x7e) // 0x7e=0,
{
led[5]=0x00; // 0x00= ,
led[4]=0x01; // -
}
led[3]=led_bcd[(unsigned char)tt]; // DP. |0x80
t=t&0x00ff;
led[2]=led_bcd[(unsigned char)t/10]; t%=10; // XS (16) -> (10)
led[1]=led_bcd[(unsigned char)t];
}
else // 正值 >99, max 120c.
{
tt=temp>>8;
led[5]=led_bcd[(unsigned char)tt/100]; tt%=100; // ZS (16) -> (10)
if(led[5]==0x7e) // 0x7e=0,
led[5]=0x00; // 0x00= ,
led[4]=led_bcd[(unsigned char)tt/10]; tt%=10; // ZS (16) -> (10)
if((led[5]==0x00)&&(led[4]==0x7e)) // 0x7e=0,
led[4]=0x00; // 0x00= ,
led[3]=led_bcd[(unsigned char)tt]; // DP. |0x80
t=t&0x00ff;
led[2]=led_bcd[(unsigned char)t/10]; t%=10; // XS (16) -> (10)
led[1]=led_bcd[(unsigned char)t];
}
}
//******************************************************************
// temer_1
void dis_t1(void)
{
UI temp,t,tt;
//timer_0
led[6]=0x4f; // display E, 6, 7
temp=read_temper1();
t=tt=temp;
if(TEM_FD) // 负值符号
{
led[5]=0x01; // - 符号
tt=temp>>8;
led[4]=led_bcd[(unsigned char)tt/10]; tt%=10; // ZS (16) -> (10)
if(led[4]==0x7e) // 0x7e=0,
{
led[5]=0x00; // 0x00= ,
led[4]=0x01; // -
}
led[3]=led_bcd[(unsigned char)tt]; // DP. |0x80
t=t&0x00ff;
led[2]=led_bcd[(unsigned char)t/10]; t%=10; // XS (16) -> (10)
led[1]=led_bcd[(unsigned char)t];
}
else // 正值 >99, max 120c.
{
tt=temp>>8;
led[5]=led_bcd[(unsigned char)tt/100]; tt%=100; // ZS (16) -> (10)
if(led[5]==0x7e) // 0x7e=0,
led[5]=0x00; // 0x00= ,
led[4]=led_bcd[(unsigned char)tt/10]; tt%=10; // ZS (16) -> (10)
if((led[5]==0x00)&&(led[4]==0x7e)) // 0x7e=0,
led[4]=0x00; // 0x00= ,
led[3]=led_bcd[(unsigned char)tt]; // DP. |0x80
t=t&0x00ff;
led[2]=led_bcd[(unsigned char)t/10]; t%=10; // XS (16) -> (10)
led[1]=led_bcd[(unsigned char)t];
}
}
//**************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -