51单片机之温度传感器DS18B20的使用
#include"reg52.h"#include"intrins.h"
#include"MyFun.h"
#include"DS18B20.h"
uchartemp1=0,temp2=0; //temp1表示温度整数部分,temp2 表示温度小数部分
void tempdelay(uchar i) //延时6US
{
while(i--);
}
void dsreset() //初始化
{
ds=1; //先将数据线置高电平
ds=0; //将数据线拉为低电平
tempdelay(100); //延时480~960
ds=1; //将数据线拉为高电平
tempdelay(100); //延时DS18B20的响应为低电平
ds=1; //将数据线拉为高电平
}
void tempwritebyte(uchar dat) //写字节
{
uchar i;
for(i=0;i<8;i++)
{
ds=0; //将数据线先置低电平
tempdelay(2); //延时12US
ds=dat&0x01; // 写入每位
tempdelay(11); // 等待DS18B20采集数据
ds=1; //将数据线拉为高电平开始下次采集数据
dat>>=1; // 右移
}
ds=1; //将数据线拉为高电平
delayms(1);
}
uchar tempreadbyte() //读字节
{
uchar i,dat=0;
for(i=0;i<8;i++)
{
ds=1; //将数据线拉高到1
dat>>=1; // 右移
_nop_();_nop_(); //延时2US
ds=0; // 将数据线拉为低电平
tempdelay(1); //延时6US
ds=1; // 将数据线拉为高电平
if(ds==1) // 读数据
dat|=0x80;
tempdelay(8);
}
return(dat); // 将字节返回
ds=1; //读完后将数据线拉为高电平
delayms(1);
}
void tempdispose() //温度转化和读数据函数
{
uchar temph,templ;
EA=0; //关全局中断
dsreset();
tempwritebyte(0xcc); //跳过ROM
tempwritebyte(0x44); // 温度转换命令
// delayms(800);
dsreset();
tempwritebyte(0xcc);
tempwritebyte(0xbe); //读内部RAM中9字节的温度数据
templ=tempreadbyte(); //先读低字节再读高字节
temph=tempreadbyte();
temp1=(uchar)(((templ&0xf0)>>4)|((temph&0x0f)<<4)); // 整数部分
temp2=(uchar)((templ&0x0f)*0.625);
EA=1; //开全局中断
} 很好,谢谢啦! 先收藏啦! 喀喀喀{:loveliness:}{:loveliness:} {:smile:}{:smile:} 先收藏了 先收藏啦!谢谢!好贴子 终于能够正常读值了,就是还差小数部分不能正常显示,什么原因阿 收藏啦{:smile:}{:smile:}{:smile:} 内容不全 一开始 都在写DS18B20 后来用到加强型 就因为时序的原因造成读数失败 你应该说一下你的选取的晶振频率 以及你的分频 谢谢楼主,收下。 INT0 发表于 2014-6-26 20:12
一开始 都在写DS18B20 后来用到加强型 就因为时序的原因造成读数失败 你应该说一下你的选取的晶振频率 以及 ...
请问用msp430的内部时钟,不用外部时钟,3030KHz,可以操作这个DS18B20吗? 上帝的佑护 发表于 2014-7-22 17:00
请问用msp430的内部时钟,不用外部时钟,3030KHz,可以操作这个DS18B20吗?
应该是可以的 具体你看一下数据手册中的 时序图就行 留名。。。记号 好多ds18b20 复位温度85°
页:
[1]