微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > DS18B20上下限温度值,根据温度的变化而变化!

DS18B20上下限温度值,根据温度的变化而变化!

时间:10-02 整理:3721RD 点击:
这是我的程序,上限温度可以有变化,但是下限温度就没有变化了~~~~不知道为什么,求大神们帮忙看看!
由于lcd1602头文件是另外编的,在这没有附上!
#include<reg52.h>
#include"lcd1602.h"
#define uchar unsigned char
#define uint unsigned int
sbit io=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code num[]="0123456789";
uchar code set2[]="TH:     TL:   ";
uint temper;//存储温度变量
uchar table[4];//存储当前温度
uchar T[6]={2,0,0,1,8,0};//存储上下限温度
void delayms(uchar t)
{
    uchar i;
            while(t--)
         for(i=0;i<125;i++);
}
void delayus(uint t)
{
    while(t--);
}
void ds_rest()//复位
{
   io=1;
   delayms(5);
   io=0;
   delayus(480);//至少480us
   io=1;
   delayus(50);
}
void ds_write(uchar com)//向DS18B20写数据
{
  uchar i;
  for(i=0;i<8;i++)
  {
    io=0;
        io=com&0x01;//给数据到总线上让从机抽样
        delayus(19);//需要给时间从机抽样,大于20不行
        io=1;
        delayus(1);
        com>>=1;
  }
}
uchar ds_read()//向DS18B20读取数据
{
   uchar dat=0;
   uchar i;
   for(i=0;i<8;i++)
   {
       io=0;//拉低总线
           dat>>=1;
           //delayus(1);
           io=1;//主机释放总线,让从机来工作
           if(io)//接收从机来的数据
           dat|=0x80;
           delayus(5);//让读取数据稳定
            //dat>>=1;
           io=1;//释放总线
           delayus(1);//每个周期至少1us延时
            
   }
   return dat;
}
void readtemp()
{
    uchar TL,TH;
    ds_rest();
        ds_write(0xcc);
        ds_write(0x44);
       
        ds_rest();
        ds_write(0xcc);
        ds_write(0xbe);
        TL=ds_read();//先低后高
        TH=ds_read();
        temper=TH;
        temper<<=8;
        temper|=TL;
        temper*=0.625;
  //table[0]=num[temper/1000];
  table[1]=num[temper%1000/100];
  table[2]=num[temper%100/10];
  table[3]=num[temper%10];
}
void xianshi()
{
    uchar i,j;
    //lcd_set(5,1,table[0]);
        lcd_set(6,1,table[1]);
        lcd_set(7,1,table[2]);
        lcd_set(8,1,'.');
        lcd_set(9,1,table[3]);
        lcd_set(10,1,0xdf);
        lcd_set(11,1,'C');
        for(j=3,i=0;i<3,j<7;i++,j++)
        {
          if(j==5)
          {i--;lcd_set(j,0,'.');}
          else
          lcd_set(j,0,0x30+T[i]);
        }
        for(j=11,i=3;i<6,j<15;i++,j++)
        {
          if(j==13)
          {i--;lcd_set(j,0,'.');}
          else
          lcd_set(j,0,0x30+T[i]);
        }
        //lcd_set(3,0,0x30+T[0]);//改成上面的循环
        //lcd_set(4,0,0x30+T[1]);
        //lcd_set(5,0,'.');
        //lcd_set(6,0,0x30+T[2]);
        //lcd_set(11,0,0x30+T[3]);
        //lcd_set(12,0,0x30+T[4]);
        //lcd_set(13,0,'.');
        //lcd_set(14,0,0x30+T[5]);
}
void main()
{
   float TH,TL;
   TH=(T[0]*10)+T[1]+(T[2]*0.1);
   TL=(T[3]*10)+T[4]+(T[5]*0.1);
   wela=1;
   P0=0xff;
   wela=0;
   dula=1;
   P0=0;
   dula=0;
   lcd_init();
   lcd_writezfc(0,0,set2);
   lcd_set(4,1,'T');
   lcd_set(5,1,':');
   while(1)
   {       
        if(temper>TH)
                 {
                   TH=temper;
                   T[0]=temper%1000/100;
                   T[1]=temper%100/10;
                   T[2]=temper%10;
                  }  
                if(temper<TL)
                   {
                     TL=temper;
                         T[3]=temper%1000/100;
                     T[4]=temper%100/10;
                         T[5]=temper%10;
                        }
              readtemp();
        xianshi();
                //delayms(10);
               
   }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top