?? 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 + -