⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temperature.c

📁 用单片机做的数字万年历
💻 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 + -