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