网站的服务与建设岗位职责,做qq图片的网站,南充城市建设投诉网站,东莞招聘网站有哪些简介
DS18B20的核心功能是直接温度-数字测量。其温度转换可由用户自定义为9、10、11、12位精度分别为0.5℃、0.25℃、0.125℃、0.0625℃分辨率。值得注意的是#xff0c;上电默认为12位转换精度。DS18B20上电后工作在低功耗闲置状态下。主设备必须向DS18B20发送温度转换命令上电默认为12位转换精度。DS18B20上电后工作在低功耗闲置状态下。主设备必须向DS18B20发送温度转换命令44h才能开始温度转换。温度转换后温度转换的值将会保存在暂存存储器的温度寄存器中并且DS18B20将会恢复到闲置状态。
高五位S为符号位。正温度把16进制数转成10进制即可负温度把16进制数取反后加1再转成10进制数。
初始化
检查总线上是否存在该器件存在就返回一个低电平脉冲不存在总线保持高电平。
/*
拉低引脚持续500us
延时60us
读取存在脉冲并等待脉冲结束
*/
bit Get18B20Ack()
{bit ack;EA0; //禁止总中断IO_18B200; DelayX10us(50);IO_18B201;DelayX10us(6);ackIO_18B20;while(!IO_18B20);//等待存在脉冲结束EA1; //使能总中断return ack;
}ROM操作指令
在总线上可以通过不同的器件地址来访问不同的器件 这个序列号为64位长开始8位位产品类型编码接着48位为每个器件的唯一的序号最后8位为CRC校验码。 当总线上只有一个器件时可以跳过ROM不进行ROM检测。指令为0xCC。
RAM存储器操作指令
读暂存寄存器0xBE (先读地位再读高位) 启动温度转换0x44 (最大转换时间为740ms)
读写操作
写
void Write18B20(unsigned char dat)
{unsigned char mask;EA0;for(mask0x01;mask!0;mask1){IO_18B200;_nop_();_nop_();//延时2usif((maskdat)0)IO_18B200;elseIO_18B201;DelayX10us(6);IO_18B201;}EA1;
}读 解读单片机首先拉低这个引脚至少保持1us,然后释放引脚释放完毕后尽快读取从拉低引脚倒读取引脚状态不能超过15us,
unsigned char Read18B20()
{unsigned char mask;unsigned char dat;EA0;for(mask0x01;mask!0;mask1){IO_18B200;_nop_();_nop_();//延时2usIO_18B201;_nop_();_nop_();//延时2usif(!IO_18B20)dat~mask;elsedat|mask;DelayX10us(6);}EA1;return dat;
}DS18B20.c文件
#include reg52.h
#include intrins.h
sbit IO_18B20P3^2;
void DelayX10us(unsigned char t)//延迟时间为t*10us
{do{_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}while(--t);
}
/*
拉低引脚持续500us
延时60us
读取存在脉冲并等待脉冲结束
*/
bit Get18B20Ack()
{bit ack;EA0; //禁止总中断IO_18B200; DelayX10us(50);IO_18B201;DelayX10us(6);ackIO_18B20;while(!IO_18B20);//等待存在脉冲结束EA1; //使能总中断return ack;
}
void Write18B20(unsigned char dat)
{unsigned char mask;EA0;for(mask0x01;mask!0;mask1){IO_18B200;_nop_();_nop_();//延时2usif((maskdat)0)IO_18B200;elseIO_18B201;DelayX10us(6);IO_18B201;}EA1;
}
unsigned char Read18B20()
{unsigned char mask;unsigned char dat;EA0;for(mask0x01;mask!0;mask1){IO_18B200;_nop_();_nop_();//延时2usIO_18B201;_nop_();_nop_();//延时2usif(!IO_18B20)dat~mask;elsedat|mask;DelayX10us(6);}EA1;return dat;
}
//启动温度转换操作
bit Start18B20()
{bit ack;ack Get18B20Ack();if(ack0){Write18B20(0xCC);//跳过ROM操作Write18B20(0x44);//启动温度转换 }return ~ack;
}
//读取温度返回值表示是否读取成功
bit Get18B20Temp(int *temp)
{bit ack;unsigned char LSB,MSB;ack Get18B20Ack(); //获取应答if(ack0){Write18B20(0xCC);Write18B20(0xBE);//发送读命令LSBRead18B20(); //读取低位MSBRead18B20(); //读取高位*temp((int)MSB8)LSB; //合成整型数}return ~ack;
}