📄 ds18b20.h
字号:
#include<Keyscan.h>
#define uchar unsigned char
#define uint unsigned int
/*DS18B20功能命令*/
#define SEARCH_ROM 0xf0 //搜索ROM
#define READ_ROM 0x33 //读DS18B20序列号
#define MATCH_ROM 0x55 // 匹配ROM
#define SKIP_ROM 0xcc //跳过读序列号的操作
#define ALARM_SEARCH 0xec // 报警搜索
#define CONVERT_T 0x44 //启动温度转换
#define WRITE_SCRATCHPAD 0x4e // 可写3个字节到暂存器,即高温,低温触发器和配置寄存器
#define READ_SCRATCHPAD 0xbe //读取温度寄存器
#define READ_POWER_SUPPLY 0xb4 //读供电方式,0为寄生方式,1为外部电源
#define COPY_SCRATCHPAD 0x48 //拷贝存储器
sbit DQ =P0^0; //模拟1_Wire总线DQ
uchar Highlimit=30; //代表初始上限30
uchar Lowlimit =27; //代表初始下限27
uint temp;
extern uint Set_limit( );
extern void Lcd1602_Write_Data(uchar row,uchar column,uchar Data);
void Wire_delay(uint i) //延时(15+10i)us
{
while(i--);
}
void Reset_DS18B20( ) //初始化函数
{
uchar Reset_flag=0;
DQ = 1; //主机拉低DQ至少480us开始时序
Wire_delay(8);
DQ = 0; //上拉电阻拉高总线
Wire_delay(80); //等待DS18B20响应
DQ = 1;
Wire_delay(14);
Reset_flag=DQ; //采样应答信号
Wire_delay(20);
}
uchar Read_byte( ) //读一个字节
{
uchar i,receive_data;
for(i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
receive_data>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
receive_data|=0x80;
Wire_delay(4);
}
return(receive_data);
}
Write_byte(uchar write_data) //写一个字节
{
uchar i;
for(i=8;i>0;i--)
{
DQ = 0;
DQ = write_data&0x01; //1_wire低位在前传输
Wire_delay(5);
DQ = 1;
write_data>>=1;
}
Wire_delay(4);
}
DS18B20_Initial( ) //18b20寄存器初始化
{
Reset_DS18B20( );
Write_byte(SKIP_ROM ); //跳过读序列号
Write_byte(WRITE_SCRATCHPAD); // 可连续写3个字节到暂存器,即高温,低温触发器和配置寄存器
Write_byte(Highlimit); //设置上限温度值
Write_byte(Lowlimit); //设置下限温度值
Write_byte(0x7f); //设置为12位分辨率
Reset_DS18B20( );
Write_byte(SKIP_ROM ); //跳过读序列号
Write_byte(COPY_SCRATCHPAD); //拷贝存储器命令
}
uint Read_temperature( ) //读取温度
{
uint temp=0;
uchar tempL=0; //温度值低8位
uchar tempH=0; //温度值高8位
Reset_DS18B20( );
Write_byte(0xCC ); // 跳过读序号列号的操作
Write_byte(0x44 ); // 启动温度转换
Reset_DS18B20( );
Write_byte(0xCC ); //跳过读序号列号的操作
Write_byte(0xBE); //读取温度寄存器(共可读9个寄存器),前两个就是温度值
tempL=Read_byte( ); //读取温度值低8位
tempH=Read_byte( ); //读取温度值高8位
/* tempL=tempL>>4; //低位右移4位,舍弃小数部分
temp=tempH<<4; //高位左移4位,舍弃符号位
temp=temp|tempL;
return(temp); */
temp = tempH ;
temp<<=8;
temp |= tempL;
return(temp);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -