#include"18B20.h"
#include<stdio.h>
#include<intrins.h>
void delayNus(int N)
{
while (N--)
{
_nop_();
_nop_();
}
}
unsigned char Rest18b20(void)
{
int NowDQ1,NowDQ2,WaitTime=240; // 临时变量
DQ=0; //拉低总线
delayNus(480);
DQ=1; //释放总线,拉高电平
delayNus(60);
delayNus(20); //隔20us,读60--240us间电平状态
while(DQ&&WaitTime--);//在240us中一直等待DQ的低电平,即等待复位信号成功
NowDQ1=DQ;
if(NowDQ1) //若是高电平,则表示复位失败
{
return 0; //复位失败
}
else
{ //DQ=0;
while(DQ&&WaiteTime--);//等待DQ为1,释放总线
NowDQ2=DQ;
if(NowDQ2)
{
return 1;//释放总线成功
} 是
else
{
return 0;//释放总线失败
}
} 弄清
} /*写这段程序时,一定要弄清楚:1、DQ就是单片机P2^6口的状态,DQ=1,就是P2^6输出高电平,
就是释放总线(拉高总线);DQ=0,就是P2^6输出低电平,就是拉低总线 2、单片机P2口初始状态就
是高电平,接上上拉电阻后,端口还是高电平*/
void WriteOneByte(unsigned char data)
{
unsigned char i;
for(i=0;i<8;i++)
{
DQ=0;
delayNus(13);
DQ=data&0x01;
delayNus(43);
DQ=1;
delayNus(1);
data>>=1;
}
}
unsigned char ReadOneByte(void)
{
unsigned char i,data;
for(i=0;i<8;i++)
{
data>>=1;
DQ=0;
delayNus(1);
DQ=1;
if(DQ)
data|=0x80;
delayNus(45);
}
return data;
}
unsigned int Read_Tempreture()
{
unsigned int RegitL,RegitH;
if(Rest18b20())
{
WriteOneByte(0xCC);
WriteOneByte(0x44);
delayNus(300);
}
if(Rest18b20())
{
WriteOneByte(0xCC);
WriteOneByte(0xBE);
RegitL=ReadOneByte();
RegitH=ReadOneByte();
}
if(Rest18b20())
{
return (((RegitH<<8)|RegitL))*0.0625;
}
}
评论0