📄 ds18b20.c
字号:
#include<C8051F020.h>
#include<intrins.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 //可写暂存器,即高温,低温触发器
#define READ_SCRATCHPAD 0xbe //读取温度寄存器
#define READ_POWER_SUPPLY 0xb4 //读供电方式,0为寄生方式,1为外部电源
#define COPY_SCRATCHPAD 0x48 //拷贝存储器
sbit DQ =P0^0; //模拟1_Wire总线DQ
uchar High_limit=30; //代表初始上限30
uchar Low_limit =10; //代表初始下限27
/*--------------------------------------------------------------------------------
函数名称:void Wire_delay(uint T_us);
函数功能:初始化DS18B20;
---------------------------------------------------------------------------------*/
void Wire_delay(uint T_us) //延时T_us,us
{
while(T_us)
{
_nop_();_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();
// _nop_();_nop_();_nop_();
--T_us;
}
}
/*--------------------------------------------------------------------------------
函数名称:void Reset_DS18B20( );
函数功能:复位DS18B20; 调试好
---------------------------------------------------------------------------------*/
bit Reset_DS18B20( ) //初始化函数
{
uchar Reset_flag=1,i;
bit Judge=1;
DQ=0; //上拉电阻拉高总线
Wire_delay(600); //等待DS18B20响应
DQ=1;
Wire_delay(80);
for (i=0;i<16;i++) //60us-240us
{
Wire_delay(20);
Reset_flag=DQ; //采样应答信号
if(Reset_flag==0)
Judge=0;
}
return(Judge); //返回0-有设备连接1-无设备连接
}
/*--------------------------------------------------------------------------------
函数名称:uchar Read_byte( );
函数功能:通过总线,将18B20内部数据读出,以字节为单位;
入口参数:无;
出口参数:receive_data;读出的数据;
---------------------------------------------------------------------------------*/
bit Read_bit()
{
bit re_bit;
DQ=0; // 给脉冲信号
Wire_delay(1);
DQ=1;
Wire_delay(2);
re_bit=DQ;
Wire_delay(60); //重要!!!
return(re_bit);
}
uchar Read_byte( ) //读一个字节
{
uchar i,receive_data=0;
for(i=0;i<8;i++)
{
if(Read_bit()==1)
receive_data=receive_data|(0x01<<i);
Wire_delay(2);
}
return(receive_data);
}
/*--------------------------------------------------------------------------------
函数名称:void Write_byte(uchar write_data);
函数功能:通过总线,将数据写入DS18B20内部;
入口参数:write_data;写入的数据;
出口参数:无;
---------------------------------------------------------------------------------*/
void Write_bit(bit Trans_data)
{
DQ=0;
Wire_delay(2);
if(Trans_data==1)
DQ=1;
Wire_delay(60);
DQ=1;
}
void Write_byte(uchar write_data) //写一个字节
{
uchar i,Bit;
for(i=0;i<8;i++)
{
Bit=write_data>>i;
Bit=Bit&0x01; //1_wire低位在前传输
Write_bit(Bit);
Wire_delay(2);
}
//Wire_delay(120);
}
/*--------------------------------------------------------------------------------
函数名称:DS18B20_Initial( );
函数功能:初始化;
入口参数:无;
出口参数:无;
---------------------------------------------------------------------------------*/
void DS18B20_Initial( ) //18b20寄存器初始化
{
Reset_DS18B20( );
Write_byte(SKIP_ROM ); //跳过读序列号
Write_byte(WRITE_SCRATCHPAD); //写字节到暂存器,即高温,低温触发器和配置寄存器
Write_byte(High_limit); //设置上限温度值
Write_byte(Low_limit); //设置下限温度值
Write_byte(0x7f); //设置为12位分辨率
Reset_DS18B20( );
Write_byte(SKIP_ROM); //跳过读序列号
Write_byte(CONVERT_T); //拷贝存储器
}
/*--------------------------------------------------------------------------------
函数名称:void Start_Convert();
函数功能;开始温度转换;
入口参数:无;
出口参数:无;
---------------------------------------------------------------------------------*/
void Start_Convert()
{
Reset_DS18B20( );
Write_byte(SKIP_ROM); //跳过读序列号
Write_byte(CONVERT_T); //拷贝存储器
}
/*--------------------------------------------------------------------------------
函数名称:uint Read_temperature( );
函数功能:读取温度;
入口参数:无;
出口参数:温度所对应的二进制数;
---------------------------------------------------------------------------------*/
uint Temper;
uint Read_temperature() //读取温度
{
bit Busy_Test=0;
uchar tempL=0; //温度值低8位
uchar tempH=0; //温度值高8位
//uint i;//,T[16];
Reset_DS18B20();
Write_byte(SKIP_ROM); //跳过读序号列号的操作
Write_byte(READ_SCRATCHPAD); //读取温度寄存器(共可读9个寄存器),前两个就是温度值
/*for(i=0;i<16;i++)
{
T[i]=Read_bit();
Wire_delay(200);
}*/
tempL=Read_byte(); //读一个字节
tempH=Read_byte(); //读一个字节
Start_Convert();
Wire_delay(2);
Busy_Test=DQ;
while(!Busy_Test)
Busy_Test=DQ;
//for(i=0;i<80;i++)
// Wire_delay(1000);
/*Temper=T[0]*0.0625+T[1]*0.125+T[2]*0.25+T[3]*0.5+T[4]*1+T[5]*2+T[6]*4+T[7]*8+T[8]*16
T[9]*32+T[10]*64+T[11]*128+T[12]*256;*/
Temper=tempH;
Temper<<=8;
Temper|=tempL;
return(Temper);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -