📄 ds18b20.c
字号:
#include <REG52.H>
#include <intrins.h>
#define uint unsigned int
sbit DQ=P3^6;
void delay_us(unsigned char us);
unsigned char _18b20_init(void);
unsigned char _18b20_read();
void Read_Temperature(unsigned char *p);
void _18b20_write(unsigned char commond);
void delay(unsigned char useconds)
{
for(;useconds>0;useconds--);
}
unsigned char _18b20_init(void)
{
unsigned char presence;
EA=0;
DQ = 0; //拉低总线
delay(29); // 保持 480us
DQ = 1; // 释放总线
delay(3); // 等待回复
presence = DQ; // 读取信号
delay(25); // 等待结束信号
return(presence); // 返回 0:正常 1:不存在
}
//从 1-wire 总线上读取一个字节
unsigned char _18b20_read(void)
{
unsigned char i;
unsigned char value = 0;
for (i=8;i>0;i--)
{
value>>=1;
DQ = 0;
_nop_();
_nop_();
_nop_();
DQ = 1;
delay(1);
if(DQ)value|=0x80;
delay(6);
}
return(value);
}
//向 1-WIRE 总线上写一个字节
void _18b20_write(char val)
{
unsigned char i;
EA=0;
for (i=8; i>0; i--) // 一次写一位
{
DQ = 0; //
_nop_();
_nop_();
_nop_();
DQ = val&0x01;
delay(5); //
DQ = 1;
val=val/2;
}
EA=1;
delay(5);
}
//读取和显示温度
void Read_Temperature(unsigned char *p)
{
unsigned char i;
unsigned char x;
unsigned char th,tl;
for(i=0;i<10;i++)
;
_18b20_init();
for(i=0;i<10;i++)
;
_18b20_write(0xCC); // Skip ROM
_18b20_write(0x44); // 转换温度
for(i=0;i<254;i++)
;
_18b20_init();
for(i=0;i<10;i++)
;
_18b20_write(0xCC); //Skip ROM
_18b20_write(0xbe); // 读取寄存器
tl=_18b20_read();//读出温度低8位
th=_18b20_read();//读出温度高8位
tl &= 0xf0;
tl >>= 4;
*(p+3)=tl/2+'0';
*(p+2)='.';
x=((th&0x07)<<4)+tl;
*p=x/10+'0';//显示温度十位数
*(p+1)=x%10+'0';//显示温度个位数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -