找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1587|回复: 1
收起左侧

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

[复制链接]
ID:926404 发表于 2021-5-24 17:07 | 显示全部楼层 |阅读模式
由于本论坛禁止直接求程序,禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来写程序去实现,谢谢大家

控制模块以at89c52为控制核心,有键盘设定舒适温度值,环境温度由数字温度传感器DS18B20采集,将采集温度送入单片机进行判按键程序该怎末写,数码管要求可显示负数,小数点后一位,还需要灯光报警,(超过阈值温度led灯亮,蜂鸣器报警)这部分我没画,求程序思路


捕获.PNG
回复

使用道具 举报

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)         

tu.PNG

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
fu.PNG
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表