亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 求基于proteus的智能溫度控制系統有keill程序思路 [打印本頁]

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

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


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

捕獲.PNG

作者: smm1345661852    時間: 2021-5-25 10:07
這是程序,溫度顯示的時候負溫度顯示不出來,到0的時候顯示-00.0,之后再往下調就沒有變化了,該怎末改,求大神解答
#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;        //小數點
sbit RED=0x97;          //高溫報警燈
sbit GREEN=0x96;  //低溫報警燈
sbit SET=0x90;          //以下按鈕設置
sbit NEXT=0x91;
sbit REDUCE=0x92;
sbit ADD=0x93;

unsigned char tempL=0;        //溫度低八位
unsigned char tempH=0;         //溫度高八位
float temperature;         //顯示溫度值
float temperatureH=30,temperatureL=10;  //報警溫度
int tH=1,tL=1;//報警狀態,1為關閉
int m,k=1,l,keyon,keytype,out=0;//設置報警溫度時使用的中間變量

void delay(unsigned int time)
{

  while(time--);

}

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

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

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

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

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

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

                P2=0xf7;                   //溫度一位小數顯示
                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);
}

///////////////////////////報警設置顯示/////////////////////////

void Display2()
{ /////////高溫報警顯示
  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;                        //////顯示負號
               delay(70);
               P0=0x00;
                           P2=0xf7;                  
               P0=tab[(int)(-temperatureH)%10];
               delay(70);
               P0=0x00;
                    }

           }
    }
  ////////低溫報警顯示
  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;                         ////顯示負號
               delay(70);
               P0=0x00;
                           P2=0xf7;                  
               P0=tab[(int)(-temperatureL)%10];
               delay(70);
               P0=0x00;
                    }
                  
           }
   }
  if(l==200){k=-k;l=0;}
  l++;
}
/////////////////////////////報警設置顯示結束///////////////////////////////////


////////////////////////////////報警設置/////////////////////////////////////////
void seting()
{
   if(SET==1&&NEXT==1&&REDUCE==1&&ADD==1);          //無鍵盤按下
   else                                                 /////有鍵盤按下時
    {
          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)                 //鍵盤松開后判斷鍵盤狀態
    {
          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)                          ///////////跳出溫度設置
            {
              keyon=0;
              keytype=4;
                  out=1;               
                }
          keyon=0;
          keytype=4;
        }
}
/////////////////////////////報警設置結束/////////////////////////////////////////
void main()                                       
{
  P1=0XFF;
  while(1)
  {
    ConversionTemperature();//溫度轉換
          display(temperature);//顯示溫度
        if(SET==0)        /////////////////////////進入報警溫度設定
          {
            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;  //////滿足條件是開啟高溫報警
        else if(temperature<(temperatureH-0.9))RED=1;
        if(tL==1)GREEN=1;
        if(tL==-1&&temperature<=temperatureL) GREEN=0;//////滿足條件時開啟低溫報警
        else if(temperature>(temperatureL+1)) GREEN=1;
        ReadTemperature();//讀取溫度
        display(temperature);//顯示溫度
  }
}

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

jubu.PNG

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

fu.PNG





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