📄 ds18b20.c
字号:
#include<reg52.h>
#include<stdio.h>
#include <intrins.h>
#include"pdp.h"
unsigned char READ_DS(void)
{
unsigned short temperature;
unsigned char temp_high,temp_low;
initiate18b20();
write18b20(0xCC);
write18b20(0x44);
initiate18b20();
write18b20(0xCC);
write18b20(0xBE);
temp_low = read18b20();
temp_high = read18b20();
initiate18b20();
if((temp_high&0xf8)==0x00)
{
temperature = ((temp_high<<8)&0xff00) + temp_low;
temperature = temperature>>4;
temperature = temperature&0x007f;
return(temperature);
}
else
{
return(0x01);
}
}
bit initiate18b20(void)
{
unsigned short i;
SD = 0; //初始化,送RESET,513.78us
for(i=0;i<300;i++)
{
_nop_();
}
SD = 1;
i = 0;
while(SD)
{
i++;
if(i>18) break;
}
if((!SD) && (i>4) && (i<19)) //等待DS18B20回送PRESENCE
{
i = 0;
while(!SD)
{
i++;
if(i>72) break;
}
if(SD && (i>16) && (i<73)) return(1);
else return(0);
}
else
return(1);
}
unsigned char read18b20(void)
{
unsigned char temp = 0x00;
unsigned char i,j;
for(j=0;j<8;j++)
{
SD = 0;
for(i=0;i<1;i++); // 3us
SD = 1;
for(i=0;i<3;i++) // 8us
{
_nop_();
}
// 在15us前读总线数据
if(SD)
{
temp = (temp|(0x01<<j));
}
for(i=0;i<22;i++) //延时54us
{
_nop_();
}
SD = 1;
for(i=0;i<2;i++) //recovery time 6us
{
_nop_();
}
}
return(temp);
}
void write18b20(unsigned char command)
{
unsigned char i,j;
for(j=0;j<8;j++)
{
SD = 0; // 写每一位前的始化,将总线拉低8us
for(i=0;i<3;i++)
{
_nop_(); //
}
if((command>>j)&0x01)
{
SD = 1;
for(i=0;i<32;i++) // 写1后,保持79us (60us<t<120us)
{
_nop_();
}
SD = 1;
for(i=0;i<3;i++) // 写完释放总线,恢复8us (1us<t<15us)
{
_nop_();
}
}
else
{
SD = 0;
for(i=0;i<32;i++) // 写0后,保持79us (60us<t<120us)
{
_nop_();
}
SD = 1;
for(i=0;i<3;i++) // 写完释放总线,恢复8us (1us<t<15us)
{
_nop_();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -