久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1938|回復: 1
打印 上一主題 下一主題
收起左側

求基于proteus的智能溫度控制系統有keill程序思路

[復制鏈接]
跳轉到指定樓層
樓主
由于本論壇禁止直接求程序,禁止伸手黨,所以向大家請教一下大致的實現方法與思路,理清頭緒后我自己來寫程序去實現,謝謝大家

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


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

捕獲.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:926404 發表于 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
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人日韩精品 | 涩涩鲁亚洲精品一区二区 | 狠狠狠 | 国产精品18hdxxxⅹ在线 | 免费黄色成人 | 91精品久久久久久久久久 | 成人在线国产 | 国产精品美女www爽爽爽视频 | 欧美一区免费 | 亚洲国产一区在线 | 自拍偷拍一区二区三区 | 亚洲狠狠 | 天天插天天搞 | 99热国产在线播放 | 久久影院一区 | 国产你懂的在线观看 | 午夜一级黄色片 | 久热9| 51ⅴ精品国产91久久久久久 | 天天av综合 | 国产免费一区二区 | 欧美性生交大片免费 | av 一区二区三区 | 国产一区二区三区在线免费 | 精品国产乱码久久久久久丨区2区 | 亚洲二区在线观看 | 97色在线视频 | 狠狠撸在线视频 | 精品久久九 | 国产成人精品久久 | 黄色毛片免费看 | 国产伊人久久久 | 欧美综合在线观看 | 日韩一区二 | 一级黄色片在线免费观看 | 国产欧美精品 | 一区二区三区四区在线免费观看 | 天天操天天舔 | 97成人免费| 国产精品久久久久久久三级 | 国产一区二区三区四区五区加勒比 |