📄 ds18b20.c
字号:
//////////////////////////////////温度检测DS18B20////////////////////////////////////
//晶振由原来的11.059M变为32M
#include<at89x52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit TMPort=P3^4;
uchar TempH,TempL,TempInt,TempDec;
unsigned char code TemTab[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
bit flag;
void TempDelay (uchar us)
{
while(us--);
}
void Init18b20 (void)
{
EA=0;
flag=0;
do
{
TMPort=1; //拉高数据线TMPort
_nop_(); _nop_(); _nop_();//保持一个周期
TMPort=0; //发送530us的低电平复位脉冲
TempDelay(154); //delay 530 uS
TMPort=1; //释放TMPort
TempDelay(29); //delay 100 uS
if(TMPort==0) //如果TMPort为低电平则复位成功
flag = 1; //detect 1820 success!
else
flag = 0; //detect 1820 fail!
TempDelay(34); //应答脉冲时间140us
TMPort = 1;
}
while(!flag);
EA=1;
}
uchar ReadByte (void) //读取单字节
{
uchar i,u=0;
EA=0;
for(i=0;i<8;i++)
{
TMPort = 0; //保持低电平1us以上
u >>= 1;
TMPort = 1; //释放总线
TempDelay (6); //在15us以后18B20输出才有效
if(TMPort==1)
u |= 0x80;
TempDelay (10); //读时候间隔
EA=1;
}
return(u);
}
void WriteByte (uchar wr) //单字节写入
{
uchar i;
EA=0;
for (i=0;i<8;i++)
{
TMPort = 0;
_nop_();_nop_();_nop_();
TMPort=wr&0x01;
TempDelay(21); //delay 45 uS //5
TMPort=1;
wr >>= 1;
}
EA=1;
}
void convert(void) //启动温度检测
{
Init18b20();
WriteByte(0xCC);//跳过ROM
WriteByte(0x44);//温度转换
}
void readtemp(void)
{
Init18b20();
WriteByte(0xCC);//跳过ROM
WriteByte(0xbe);//读取温度
TempL=ReadByte();//温度低字节,(低4位为二进制的小数部分)
TempH=ReadByte();//温度高字节,(高5位为符合位)
}
void tempconform(void)
{
TempInt=(TempL>>4&0x0f)|(TempH<<4&0xf0);//整数部分
TempDec=TemTab[TempL&0x0f];
}
void TempDetect(void) //测量温度函数
{
convert();
readtemp();
tempconform();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -