📄 temperature.c
字号:
#include <includes.h>
#include <math.h>
sbit DQ=P1^4;
char sflag;//成功4之前不对
/*--------------------------------------------------------
1ms延时子程序
---------------------------------------------------------*/
void delayX1ms(unsigned char count)
{
unsigned char j,k;
while(count--!=0)
{
for(j=0;j<4;j++)
for(k=0;k<73;k++)
;
}
}
bit resetpulse(void)//启动脉冲
{
static bit presence;
unsigned char i;
DQ=0;
for(i=128;i>0;i--);// 延时256个机器周期
DQ=1;
for(i=30;i>0;i--);
presence=DQ;
for(i=100;i>0;i--);
return(presence);
}
void writecommandtods18b20(unsigned char command)
{
unsigned char i;
unsigned char j;
for(i=0;i<8;i++)
{
if((command & 0x01)==0)
{
DQ=0;
for(j=20;j>0;j--);//低电平40个机器周期
DQ=1;
}
else
{
DQ=0;
for(j=1;j>0;j--);
DQ=1;
for(j=15;j>0;j--);
}
command=_cror_(command,1);
}
}
unsigned char readdatafromds18b20(void)
{
unsigned char i;
unsigned char j;
unsigned char temp;
temp=0;
for(i=0;i<8;i++)
{
temp=_cror_(temp,1);
DQ=0;
_nop_();
DQ=1;
for(j=2;j>0;j--); //此数非常重要,取5就不行!
if(DQ==1)
{
temp=temp | 0x80;
}
else
{
temp=temp | 0x00;
}
for(j=100;j>0;j--);
}
return(temp);
}
unsigned char temperature(void)
{
unsigned char gettemperature();
unsigned char tttemper;
unsigned char temper[5],i,j,te,tee;
for(i=0;i<5;i++) //测量5次
{
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0x44);
delayX1ms(0x01);
temper[i]=gettemperature();
}
for(j=4;j>0;j--)
for(i=0;i<j;i++) //成功4之前不对,为4;对5次测量结果排序,计算取中间值
{
if (temper[i]<temper[i+1])
{
te=temper[i];
temper[i]=temper[i+1];
temper[i+1]=te;
}
}
te=temper[2]%10;//将测量结果变为BCD码
tttemper=temper[2]/10;
tee=tttemper%10;
tee=tee<<4;//形成高位
tttemper=tee|te;//高位低位合并
return(tttemper);//返回结果的数值部分,符号部分在全局变量sflag中
}
unsigned char gettemperature()
{
unsigned char readdata[2];
unsigned int result;
while(resetpulse());
writecommandtods18b20(0xcc);
writecommandtods18b20(0xbe);
readdata[0]=readdatafromds18b20();
readdata[1]=readdatafromds18b20();
sflag=1;
if((readdata[1] & 0xf8)!=0x00)
{
sflag=-1;
readdata[1]=~readdata[1];
readdata[0]=~readdata[0];
result=readdata[0]+1;
readdata[0]=result;
if(result>255)
{
readdata[1]++;
}
}
readdata[1]=readdata[1]<<5;
readdata[1]=readdata[1] & 0xe0;
readdata[0]=readdata[0]>>3;
readdata[0]=readdata[0]&0x1f;
readdata[1]=readdata[1] | readdata[0]; //测量结果保留小数点后一位
//实际扩大了2位,在计算时要除2
readdata[1]=(readdata[1]>>1);//去掉小数点后的一位!
return(readdata[1]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -