📄 ds18b20应用子程序.txt
字号:
晶体12M 89C52单片机
DS18B20传感器检测正温度的应用子程序
#include<reg52.h>
#define NOP_1uS _nop_();
sbit DQ =P3^2;
void delay_20us(unsigned char n)
{
while(n--)
{
NOP_1uS;NOP_1uS;NOP_1uS;
NOP_1uS;NOP_1uS;NOP_1uS;
NOP_1uS;
}
}
void ow_reset(void)
{
DQ = 0; //pull DQ line low
delay_20us(25); // leave it low for 500us
DQ = 1; // allow line to return high
delay_20us(4); // wait for presence
presence = DQ; // get presence signal
delay_20us(20); // wait for end of timeslot
}
//from 1-wire read one byte
byte read_byte(void)
{
byte i;
byte value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0; // pull DQ low to start timeslot
NOP_1uS;
DQ = 1; // then return high
NOP_1uS;
NOP_1uS;
NOP_1uS;
if(DQ)value|=0x80;
delay_20us(3); // wait for rest of timeslot
}
return(value);
}
//to 1-WIRE write one byte
void write_byte(char val)
{
byte i;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
DQ = 0; // pull DQ low to start timeslot
NOP_1uS;
NOP_1uS;
DQ = val&0x01;
delay_20us(5); // hold value for remainder of timeslot
DQ = 1;
val=val/2;
}
delay_20us(5);
}
void Read_Temperature()
{ unsigned int oldtarget;
glwd=0;
dlwd=0;
ow_reset();
if(presence==0)
{
write_byte(0xCC); //Skip ROM
write_byte(0x44); // Start Conversion
delay_20us(1);
}
ow_reset();
if(presence==0)
{
write_byte(0xCC); // Skip ROM
write_byte(0xBE); // Read Scratch Pad
dlwd=read_byte();
glwd=read_byte();
ow_reset();
}
vienum=(glwd*256+dlwd);
return(vienum/16);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -