#include"reg52.h"
#include"intrins.h"
#include"MyFun.h"
#include"DS18B20.h"
uchar temp1=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; //开全局中断
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
请问用msp430的内部时钟,不用外部时钟,3030KHz,可以操作这个DS18B20吗?
一周热门 更多>