#include<intrins.h>
#include"peizhi/WenDu_DS18B20.H"
//extern bit Bz; /*调用主文件变量*/
extern bit Xz;
void YanShiUs(unsigned int j){while(--j);}
bit ChuShiHua_DS18B20(/*单总线初始化时序*/)
{
bit i;
if(!Xz)DS0 = 1; else DS1 = 1;
_nop_();
if(!Xz)DS0 = 0; else DS1 = 0;
YanShiUs(75); //拉低总线499.45us 挂接在总线上的18B20将会全部被复位
if(!Xz)DS0 = 1; else DS1 = 1; //释放总线,如果DS18B20做出反应会将在15us~60us后总线拉低
YanShiUs(4); //延时37.95us 等待18B20发回存在信号
i = Xz?DS1:DS0; //DS18B20拉低总线,赋值作为判断
YanShiUs(20); //等待141.95us
/*while(DS){YanShiMs(5); i=1; } 初始化失败标志*/
if(!Xz)DS0 = 1; else DS1 = 1;
_nop_(); /**/
return (i);
}
void DS18B20_Xie_ZhiJie(unsigned int ZhiJie/*写一个字节*/)
{
unsigned char i=8;
do
{
if(!Xz)DS0 = 0; else DS1 = 0; //每写入一位数据之前先把总线拉低
_nop_(); //产生5us时序
if(!Xz)DS0 = ZhiJie & 0x01; //然后写入一个数据,从最低位开始
else DS1 = ZhiJie & 0x01; //然后写入一个数据,从最低位开始
YanShiUs(10); //76.95us
//11.0592Mz的晶振一个机器周期时间1.085us,12*1/11059200一个循环2.17US
if(!Xz)DS0 = 1; else DS1 = 1; //释放总线至少1us给总线恢复时间才能准备下一个数据写入
_nop_(); //指令ZhiJie的最低位赋予给总线,必须在拉低总线后的15us内,因为15us后DS18B20会对总线采样。
ZhiJie >>= 1; //数据右移
}while(--i);
}
unsigned int DS18B20_Du_ZhiJie(/*读数据字节*/)
{
unsigned char i = 8, j; unsigned int ZhiJie;
do
{
if(!Xz)DS0 = 0; else DS1 = 0; //先将总线拉低1us
_nop_(); //产生读时序
if(!Xz)DS0 = 1; else DS1 = 1; //释放总线
_nop_(); //读数据时,数据以字节的最低有效位先从总线移出
j = Xz?DS1:DS0; //读取数据,从最低位开始读取
YanShiUs(10);//76.95us
if(!Xz)DS0 = 1; else DS1 = 1;
_nop_();/*将ZhiJie右移一位,然后与逻辑运算左移7位后的J,注意移动之后移掉那位补0。*/
ZhiJie = (j<<7)|(ZhiJie>>1);
}while(--i);
return (ZhiJie);
}
void DS18B20_Xie(bit X/*发送读取温度命令*/)
{
ChuShiHua_DS18B20(); //初始化DS18B20
DS18B20_Xie_ZhiJie(0xcc); //发送跳过ROM操作命令
DS18B20_Xie_ZhiJie(X?0xbe:0x44); //发送读取DS18B20暂存器值命令/发送温度转换指令
}
unsigned int DS18B20_WenDu(/*Ds18b20转换温度*/)
{
unsigned int L,M,i;
DS18B20_Xie(0); //先写入转换命令
DS18B20_Xie(1); //然后等待转换完后发送读取温度命令
L = DS18B20_Du_ZhiJie(); //读取温度值共16位,先读低字节,读取到的第一个字节为温度LSB
M = DS18B20_Du_ZhiJie(); //再读高字节,读取到的第一个字节为温度MSB
i = M;
i <<= 8; //把以上8位数据从i低八位移到高八位
i |= L; //两字节合成一个整型变量
if(i > 2048) //当温度值为负数
{
// Bz = 1;
//--i;i ^= 0xffff;//因为读取的温度是实际温度的补码,所以减1,再异或求出原码
i=~i;++i; //负数的绝对值等于: 取反 + 1
i = i * 0.0625 * 100 + 0.5;
/*留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
算加上0.5,还是在小数点后面。*/
}
else {i = i * 0.0625 * 100 + 0.5;}//Bz = 0;
//因为数据处理有小数点所以将温度赋给一个浮点型变量,如果温度是正的那么正数的原码就是补码它本身
return (i);
}
02-21
420
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-07