欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標(biāo)題: 求基于proteus的智能溫度控制系統(tǒng)有keill程序思路 [打印本頁]

作者: smm1345661852    時(shí)間: 2021-5-24 17:07
標(biāo)題: 求基于proteus的智能溫度控制系統(tǒng)有keill程序思路
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請(qǐng)教一下大致的實(shí)現(xiàn)方法與思路,理清頭緒后我自己來寫程序去實(shí)現(xiàn),謝謝大家

控制模塊以at89c52為控制核心,有鍵盤設(shè)定舒適溫度值,環(huán)境溫度由數(shù)字溫度傳感器DS18B20采集,將采集溫度送入單片機(jī)進(jìn)行判按鍵程序該怎末寫,數(shù)碼管要求可顯示負(fù)數(shù),小數(shù)點(diǎn)后一位,還需要燈光報(bào)警,(超過閾值溫度led燈亮,蜂鳴器報(bào)警)這部分我沒畫,求程序思路


捕獲.PNG (77.89 KB, 下載次數(shù): 116)

捕獲.PNG

作者: smm1345661852    時(shí)間: 2021-5-25 10:07
這是程序,溫度顯示的時(shí)候負(fù)溫度顯示不出來,到0的時(shí)候顯示-00.0,之后再往下調(diào)就沒有變化了,該怎末改,求大神解答
#include "reg52.h"
#include "absacc.h"

unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77 };           //共陰 (cc)         



sbit DQ=0xb7;        //c51與DS18B20通信口
sbit P07=0x87;        //小數(shù)點(diǎn)
sbit RED=0x97;          //高溫報(bào)警燈
sbit GREEN=0x96;  //低溫報(bào)警燈
sbit SET=0x90;          //以下按鈕設(shè)置
sbit NEXT=0x91;
sbit REDUCE=0x92;
sbit ADD=0x93;

unsigned char tempL=0;        //溫度低八位
unsigned char tempH=0;         //溫度高八位
float temperature;         //顯示溫度值
float temperatureH=30,temperatureL=10;  //報(bào)警溫度
int tH=1,tL=1;//報(bào)警狀態(tài),1為關(guān)閉
int m,k=1,l,keyon,keytype,out=0;//設(shè)置報(bào)警溫度時(shí)使用的中間變量

void delay(unsigned int time)
{

  while(time--);

}

void display(float k)         //顯示溫度
{
  if(k>0)                //正溫度顯示的百位,暫時(shí)設(shè)置為零。
          {
                P2=0xfe;
                P0=0x3f;
                delay(260);
                P0=0x00;

                P2=0xfd;                  //溫度十位顯示
                P0=tab[(((int)k)%100)/10];
                delay(260);
                P0=0x00;

                P2=0xfb;                 //溫度個(gè)位顯示
                P0=tab[((int)k)%10];
                P07=1;
                delay(260);
                P0=0x00;

                P2=0xf7;                   //溫度一位小數(shù)顯示
                P0=tab[((int)(k*10))%10];
                delay(260);
                P0=0x00;
  }         
else                        //負(fù)溫度顯示負(fù)號(hào)
  {
                k= -k;
                  P2=0xfe;
                P0=0x40;
                delay(260);
                P0=0x00;

                P2=0xfd;                  //溫度十位顯示
                P0=tab[(((int)k)%100)/10];
                delay(260);
                P0=0x00;

                P2=0xfb;                 //溫度個(gè)位顯示
                P0=tab[((int)k)%10];
                P07=1;
                delay(260);
                P0=0x00;

                P2=0xf7;                   //溫度一位小數(shù)顯示
                P0=tab[((int)(k*10))%10];
                delay(260);
                P0=0x00;

        }
}

Init_DS18B20(void)
{
  unsigned char x=0;
  DQ=1;
  delay(8);
  DQ=0;
  delay(85);
  DQ=1;
  delay(14);
  x=DQ;

  delay(20);
        return DQ;
}
         
ReadOneChar(void)
{
  unsigned char i,dat=0;
        DQ = 1;
        delay(1);
        for(i=0;i<8;i++)
        {
                 DQ = 0;
               delay(1);
                dat >>= 1;
                DQ = 1;
              delay(1);
                if(DQ)
                        dat |= 0X80;
                delay(30);
                DQ = 1;
        }       
  return(dat);
}

WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8;i>0;i--)
  {                                                               
    DQ=0;
        DQ=dat&0x01;
        delay(5);
        DQ=1;
        dat>>=1;
  }
  delay(4);
return DQ;
}
ConversionTemperature()
{
  Init_DS18B20();
  WriteOneChar(0xcc);
  WriteOneChar(0x44);
  delay(20);
return 0;
}

ReadTemperature(void)
{
  char ctempL,ctempH;

  Init_DS18B20();
  WriteOneChar(0xcc);
  WriteOneChar(0xbe);

  tempL=ReadOneChar();                    
  tempH=ReadOneChar();

  if(tempH<0x3f) //溫度是否小于零
    temperature=((tempH*256)+tempL)* 0.0625;//大于零
           if (temperature>temperatureH,tH=-1);
           if (temperature<temperatureL,tL=-1);
  else          
    {
          ctempL=tempL;
      ctempH=tempH;          
          temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
          temperature=-temperature;
        }

  delay(200);
  return(temperature);
}

///////////////////////////報(bào)警設(shè)置顯示/////////////////////////

void Display2()
{ /////////高溫報(bào)警顯示
  if(m==0||m==1)
   {
     P2=0xfe;
     P0=0x6e;
     delay(70);
     P0=0x00;
            if(m==0&&k==-1) delay(70);
     else
           {
              if(tH==1)
                    {
                           P2=0xfd;                  
               P0=0x4b;
               delay(70);
               P0=0x00;
                        }
                  else
                    {
                       P2=0xfd;                 
               P0=0x3f;
               delay(70);
               P0=0x00;
                    }
           }
         if(m==1&&k==-1) delay(100);
     else
           {
              if(temperatureH>=0)
                    {
                           P2=0xfb;                  
               P0=tab[(int)(temperatureH/10)];
               delay(70);
               P0=0x00;
                           P2=0xf7;                  
               P0=tab[(int)(temperatureH)%10];
               delay(70);
               P0=0x00;
                         }
                  else
                    {
                       P2=0xfb;                  
               P0=0x40;                        //////顯示負(fù)號(hào)
               delay(70);
               P0=0x00;
                           P2=0xf7;                  
               P0=tab[(int)(-temperatureH)%10];
               delay(70);
               P0=0x00;
                    }

           }
    }
  ////////低溫報(bào)警顯示
  else if(m==2||m==3)
   {
     P2=0xfe;
     P0=0x1a;
     delay(70);
     P0=0x00;
            if(m==2&&k==-1) delay(70);
     else
           {
              if(tL==1)
                    {
                           P2=0xfd;                  
               P0=0x4b;
               delay(70);
               P0=0x00;
                        }
                  else
                    {
                       P2=0xfd;                 
               P0=0x3f;
               delay(70);
               P0=0x00;
                    }
           }
         if(m==3&&k==-1) delay(100);
     else
           {
              if(temperatureL>=0)
                    {
                           P2=0xfb;                  
               P0=tab[(int)(temperatureL/10)];
               delay(70);
               P0=0x00;       
                           P2=0xf7;                  
               P0=tab[(int)(temperatureL)%10];
               delay(70);
               P0=0x00;
                         }
                  else
                    {
                       P2=0xfb;                  
               P0=0x40;                         ////顯示負(fù)號(hào)
               delay(70);
               P0=0x00;
                           P2=0xf7;                  
               P0=tab[(int)(-temperatureL)%10];
               delay(70);
               P0=0x00;
                    }
                  
           }
   }
  if(l==200){k=-k;l=0;}
  l++;
}
/////////////////////////////報(bào)警設(shè)置顯示結(jié)束///////////////////////////////////


////////////////////////////////報(bào)警設(shè)置/////////////////////////////////////////
void seting()
{
   if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);          //無鍵盤按下
   else                                                 /////有鍵盤按下時(shí)
    {
          keyon=1;
          if(SET==0)keytype=0;
          if(NEXT==0)keytype=1;
          if(REDUCE==0)keytype=2;
          if(ADD==0)keytype=3;
        }
   if(keyon==1&&SET==1&&NEXT==1&&REDUCE==1&&ADD==1)                 //鍵盤松開后判斷鍵盤狀態(tài)
    {
          if(keytype==1)////////////////菜單下翻
            {
                  if(m>=3)m=0;
              else m++;
                 }
          if(keytype==2)        ////////////////加操作
            {
                  if(m==0)tH=-tH;
                  if(m==1)
                    {
                          if(temperatureH>(temperatureL+1)) temperatureH--;
                          else temperatureH=99;
                        }
                  if(m==2)tL=-tL;
                  if(m==3)
                    {
                          if(temperatureL>-9) temperatureL--;
                          else temperatureL=(temperatureH-1);
                        }
                }
          if(keytype==3)                 ////////////////減操作
            {
                  if(m==0)tH=-tH;
                  if(m==1)
                    {
                          if(temperatureH<99) temperatureH++;
                          else temperatureH=(temperatureL+1);
                        }
                  if(m==2)tL=-tL;
                  if(m==3)
                    {
                          if(temperatureL<(temperatureH-1)) temperatureL++;
                          else temperatureL=-9;
                        }
                }
          if(keytype==0)                          ///////////跳出溫度設(shè)置
            {
              keyon=0;
              keytype=4;
                  out=1;               
                }
          keyon=0;
          keytype=4;
        }
}
/////////////////////////////報(bào)警設(shè)置結(jié)束/////////////////////////////////////////
void main()                                       
{
  P1=0XFF;
  while(1)
  {
    ConversionTemperature();//溫度轉(zhuǎn)換
          display(temperature);//顯示溫度
        if(SET==0)        /////////////////////////進(jìn)入報(bào)警溫度設(shè)定
          {
            out=0;
            delay(300);
                while(SET==0);
                m=0;
                l=0;
                keyon=0;
                keytype=4;
                while(1)
                  {
                    Display2();
                        seting();
                        if (out==1)break;
                  }
                delay(200);
                while(SET==0);
          }
        if(tH==1)RED=1;
        else if(tH==-1&&temperature>=temperatureH) RED=0;  //////滿足條件是開啟高溫報(bào)警
        else if(temperature<(temperatureH-0.9))RED=1;
        if(tL==1)GREEN=1;
        if(tL==-1&&temperature<=temperatureL) GREEN=0;//////滿足條件時(shí)開啟低溫報(bào)警
        else if(temperature>(temperatureL+1)) GREEN=1;
        ReadTemperature();//讀取溫度
        display(temperature);//顯示溫度
  }
}

jubu.PNG (36.02 KB, 下載次數(shù): 100)

jubu.PNG

fu.PNG (24.9 KB, 下載次數(shù): 117)

fu.PNG





歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1