📄 18b20.c
字号:
/////////////////////////////////////
//通信工程 陈自远 08年12月4日
////////////////////////////////////
#include <reg52.h>
sbit DQ=P3^4;
bit presence;
char tflag;
unsigned long tdat=0;
long tt;
int t=0;
int temp_lsb;
int temp_msb;
void delay(int useconds);
void delay02s(void) ;
unsigned char ow_reset(void);
unsigned char read_bit(void);
void write_bit(char bitval);
void disp0();
long Read_Temperature(void);
char data1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void main()
{
// P0=254;
// delay(30000000);测试用
while (1)
{
tdat=Read_Temperature();
// delay02s();
// delay02s();
disp0();
}
}
void delay02s(void) //延时0.2秒子程序
{
unsigned char i,j,k; //定义3个无符号字符型变量。
for(i=5;i>0;i--) //三个FOR循环用来延时,这里为
for(j=5;j>0;j--) //什么是0.2S大家可以用WAVE
for(k=5;k>0;k--); //高断点仿真一下,就可知道大概
} //是0.2S了。
void delay(int useconds)
{
int s;
for (s=0; s<useconds;s++);
}
unsigned char ow_reset(void)
{
//unsigned char presence;
DQ = 0;//pull DQ line low
delay(30);// leave it low for 480us
DQ = 1; // allow line to return high
delay(3); // wait for presence
presence = DQ;// get presence signal
delay(25);// wait for end of timeslot
// P0=presence;
return(presence);// presence signal returned
} // 0=presence, 1 = no part
unsigned char read_bit(void)
{
unsigned char i;
DQ = 0;// pull DQ low to start timeslot
DQ = 1;// then return high
for (i=0; i<3; i++);// delay 15us from start of timeslo
return(DQ);// return value of DQ line
}
void write_bit(char bitval)
{
DQ = 0;// pull DQ low to start timeslot
if(bitval==1) DQ =1;// return DQ high if write 1
delay(5);// hold value for remainder of timeslot
DQ = 1;
}
unsigned char read_byte(void)
{
unsigned char i;
unsigned char value = 0;
for (i=0;i<8;i++)
{
if(read_bit())
value|=0x01<<i; // reads byte in, one byte at a time and the
//shifts it left
delay(6);// wait for rest of timeslot
}
return(value);
}
void write_byte(char val)
{
unsigned char i;
unsigned char temp;
for (i=0; i<8; i++) // writes byte, one bit at a time
{
temp = val>>i; // shifts val right 'i' spaces
temp &= 0x01; // copy that bit to temp
write_bit(temp);
}
delay(5); // write bit in temp into
}
long Read_Temperature(void)
{
temp_lsb=0;
temp_msb=0;
ow_reset();
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
delay(5);
ow_reset();
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
temp_lsb =read_byte(); // Temp data plus lsb
temp_msb=read_byte();
t=temp_msb;
t<<=8; //温度值的高8位放在t的高8位
t=t|temp_lsb; //温度值的低8位放在t的低8位
if(t<0x0fff) //判断温度值得正负值
tflag=0; //tflag=0温度值为正
else
{
t=~t+1; //温度值为负,负值以补码形式存放,这里要将其还原成原码
tflag=1; //tflag=1温度值为负
}
tt=t*(62.5);
//P0=temp_lsb;
//P0=temp_msb;
//delay(3000000);test
return(tt);
}
void disp0()//温度转换
{
char flagdat ;//定义温度值符号
char shi,ge,xshi,xbai;
if(tflag==0)
flagdat=0xff;//温度为正不显示符号
else
flagdat=0x2d;//负温度显示负号:
P0=flagdat;
P1=0xf2;
delay02s();
//delay02s();
shi=tdat/10000;//温度十位
P0=data1[shi];
P1=0xf3;
// delay02s();
// delay02s();
// delay02s();
// delay02s();
ge=tdat%10000/1000;//温度个位
P0=data1[ge];
P1=0xf4;
delay02s();
delay02s();
delay02s();
delay02s();
P0=0X7f;//小数点
P1=0xf5;
delay02s();
delay02s();
xshi=tdat%1000/100;//小数十位
P0=data1[xshi];
P1=0xf6;
delay02s();
delay02s();
delay02s();
delay02s();
xbai=tdat%100/10;//小数百位
P0=data1[xbai];
P1=0xf7;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -