?? text1
字號:
#include <REG52.H>
#include <intrins.h>
typedef unsigned char byte;
extern void delay_10us(unsigned char n); //延時10us, 外部函數
sbit Sensor_DQ =P1^5; //18B20 Sensor_DQ
//復位 18B20
bit DS18B20_Reset(void)
{
bit ret;
//EA=0;
Sensor_DQ = 0; //拉第電平
delay_10us(50); //主機發置位脈沖持續5us*100=500 us -
600 us
Sensor_DQ = 1; //主機釋放總線控制,DQ口改為輸入口
delay_10us(5); //DS18B20等待5us*10=50 us - 60 us
ret = Sensor_DQ;
delay_10us(6);
//EA=1;
return(ret);
}// 1 = 存在, 0 = 不存在
//從 18B20 總線上讀取一個字節
byte read_byte(void)
{
//EA=0;
byte i;
byte value = 0;
for (i=8;i>0;i--){
Sensor_DQ = 0; // pull Sensor_DQ low to start timeslot
_nop_(); //低電平持續2us
Sensor_DQ = 1; // then return high
//等待12us
value>>=1;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
if(Sensor_DQ)value|=0x80; //數據送入A
delay_10us(5); //保證讀數據持續50-60us
}
Sensor_DQ=1; //拉高數據線
//EA=1;
return(value);
}
//向 18B20 總線上寫一個字節
void write_byte(byte val)
{
byte i;
//EA=0;
for (i=8; i>0; i--) // writes byte, one bit at a time
{
Sensor_DQ = 1;
_nop_();_nop_();
Sensor_DQ = 0; //DS18B20數據線
拉低,保持4*4=16us
delay_10us(1);
//_nop_();_nop_();_nop_();_nop_();
Sensor_DQ = val&0x01; //將命令字依次送給DS18B20
delay_10us(5); //保證整個寫過程
持續 50-60us
val=val/2;
}
delay_10us(5);
Sensor_DQ=1; //拉高數據線
//EA=1;
}
//讀取溫度
int Read_Temperature(void)
{
union{
byte c[2];
int x;
}temp;
DS18B20_Reset(); //復位
//復位異常
write_byte(0xCC); //發SKIP ROM命令
write_byte(0xBE); //發讀存儲器命令
temp.c[1]=read_byte(); //讀出溫度值LOW
temp.c[0]=read_byte(); //讀出溫度值High
DS18B20_Reset(); //復位
write_byte(0xCC); //發SKIP ROM命令
write_byte(0x44); //發開始轉換溫度命令
return temp.x;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -