黄金会员 
 
主题
回帖0
积分8515
阅读权限40
注册时间2011-10-27
最后登录1970-1-1
在线时间 小时
 
 
 
 
 | 
 
 楼主 |
发表于 2011-11-14 22:54
|
显示全部楼层
 
 
 
11.11.14更新 
 1.温度从冷藏室获取, 温度控制已冷藏室温度为基础. (冷藏室温度范围一般为 0℃~10℃) 
 2.压缩机断电保护, 通电后延迟3分钟后才执行温度检测. 
 3.检测温度探头是否正常, 不正常显示E02 
 4.工作超时保护, 如果压缩机连续工作30分钟则停止压缩机工作, 数码管显示E01 
 5.设置按键分别为设定,+,- 
 6.温度设置, 按下设定键后设置启机温度, 再按设定后设置停机温度, 再按设定完成设置. (2分钟内未完成设置自动取消) 
 7.红色LED 指示压缩机工作状态. 亮工作, 灭停止工作 
 8.3位数码管显示当前温度, 当进行设定时显示相应设置数值 
 9.看门狗设置 5秒溢出 
 10.数字滤波 
 
 已经给朋友的冰箱用上了, 电路部分因为没有使用双电源或者dc-dc隔离, 所以光耦是多余的. 
 实际在冰箱上测试,压缩机启动停止不会干扰到单片机. 
 ds18b20的信号线用的非屏蔽的线, 长度2.5m左右. 实际使用中存在读取失败, 显示为-1, 不过经过检测错误返回值和数字滤波已经没什么问题. 能不能长期稳定使用还不知道:) 
 
 
 
完成后的正面 
 
 
 
背面, 全部飞线... 
 
 
 
启动倒计时 
 
 
 
启动后显示当前温度 
 
 
冰箱温度控制器.rar
(2.37 KB, 下载次数: 1617)
 
 
- 主要源代码, 贴出来 也许有人会用的到
 
 -  main.c
 
 -  #include<STC89C51RC_RD_PLUS.H>
 
 -  #include<stdio.h>
 
 -  #include <string.h>
 
 -  #include "main.h"
 
 -  #include "delay.h"
 
 -  #include "iapeeprom.h"
 
 -  #include"18b20.h"
 
  
-  code const UCHAR DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0-F
 
 -  UCHAR DisplayBuf[3]; //存储显示值的全局变量
 
 -  bit ReadTempFlag;//定义读温度标志
 
 -  bit bFlash, bDisplayFlash;  //闪屏信息
 
 -  bit bRun, bProtect; //是否启动运行
 
 -  UINT TickCount=0; //计时器, 已秒为单位
 
 -  char startValue = 8, stopValue = 4; //开启与停止值
 
  
 
-  void main (void)
 
 -  {
 
 -      UINT temp;
 
 -      UCHAR iSet = 0, key, i, j;
 
 -      char Temperature = 0, te;  //当前温度
 
 -      char temper[5];
 
  
-      RUN_CONTROL = 1;
 
 -      bRun = 0;
 
 -      bProtect = 0;
 
  
-      //定时器初始化
 
 -      Init_Timer0();
 
 -      //Init_Timer1();
 
  
-      //检测温度探头是否正常
 
 -      if (Init_DS18B20() != 0)
 
 -      {
 
 -          DisplayBuf[0]=DuanMa[14];
 
 -          DisplayBuf[1]=DuanMa[0];
 
 -          DisplayBuf[2]=DuanMa[2];
 
 -          while (1); //显示错误代码E02
 
 -      }
 
  
-      //读取eeprom中的设置
 
 -      startValue = FlashRead( EEPROM_ADDRESS);
 
 -      stopValue = FlashRead( EEPROM_ADDRESS+4);
 
  
-      //压缩机断电保护, 通电后延迟3分钟后才执行温度检测
 
 -      TickCount = 0; //重设计时器
 
 -      bDisplayFlash = 1; //闪屏显示
 
 -      while (1)
 
 -      {
 
 -          //检测是否到达保护时间
 
 -          if (TickCount > 360)
 
 -              break;
 
 -          temp = 180 - (TickCount / 2);
 
 -          DisplayBuf[0]=DuanMa[temp/100];          //百位温度
 
 -          DisplayBuf[1]=DuanMa[(temp%100)/10]; //十位温度
 
 -          DisplayBuf[2]=DuanMa[(temp%100)%10]; //个位温度
 
 -          //按下任意键跳出保护状态
 
 -          if (KeyScan() > 0)
 
 -              break;
 
 -      }
 
  
-      //开启看门狗
 
 -      FeedDog;  //5s溢出
 
  
-      //主循环
 
 -      iSet = 0;
 
 -      bDisplayFlash = 0;
 
 -      while (1)
 
 -      {
 
 -          //读取与显示当前温度
 
 -          if (ReadTempFlag==1)
 
 -          {
 
 -              ReadTempFlag=0;
 
 -              //连续读取5次
 
 -              for (i=0; i<5; i++)
 
 -              {
 
 -                  temp=ReadTemperature();
 
 -                  if (temp == 0xffff)
 
 -                      break;
 
 -                  temper = temp>>4;
 
 -              }
 
 -              if (temp != 0xffff)
 
 -              {
 
 -                  //排序取中间结果
 
 -                  for (i=0; i<5; i++)
 
 -                  {
 
 -                      for (j=0; j<4-i; j++)
 
 -                      {
 
 -                          if (temper[j] > temper[j+1])
 
 -                          {
 
 -                              te= temper[ j] ;
 
 -                              temper[ j] = temper[ j+ 1] ;
 
 -                              temper[ j+ 1] = te;
 
 -                          }
 
 -                      }
 
 -                  }
 
  
-                  Temperature = temper[2];
 
  
-                  if (iSet == 0)
 
 -                      SetDisplay( Temperature); //设置当前显示温度
 
 -              }
 
 -          }
 
  
-          //启动与停止
 
 -          if (bProtect == 0 && iSet == 0)
 
 -          {
 
 -              if (Temperature != 85)
 
 -              {
 
 -                  if (bRun == 0)
 
 -                  {
 
 -                      if (Temperature >= startValue)
 
 -                      {
 
 -                          //达到启动温度
 
 -                          bRun = 1;
 
 -                          RUN_CONTROL = 0;
 
 -                          TickCount = 0; //重设计时器 记录工作超时
 
 -                      }
 
 -                  }
 
 -                  else
 
 -                  {
 
 -                      if (Temperature <= stopValue || TickCount > WORK_OUTTIME)
 
 -                      {
 
 -                          //达到停止温度
 
 -                          bRun = 0;
 
 -                          RUN_CONTROL = 1;
 
 -                          bProtect = 1; //启动保护功能10分钟内不再启动压缩机
 
 -                          TickCount = 0; //重设计时器
 
 -                      }
 
 -                  }
 
  
-              }
 
 -          }
 
 -          else
 
 -          {
 
 -              DisplayBuf[0]=DisplayBuf[0] | 0x80; //在数码管上显示.表示刚停止保护中
 
 -              if (TickCount > STOP_PROTECT_TIME)
 
 -              {
 
 -                  bProtect = 0;  //取消保护
 
 -              }
 
 -          }
 
  
 
-          //按键处理
 
 -          if (iSet == 0)
 
 -          {
 
 -              //不在设置状态
 
 -              key = KeyScan();
 
 -              if (key == 1)
 
 -              {
 
 -                  iSet++;
 
 -                  TickCount = 0; //重设计时器, 设置操作应该在2分钟内完成否则自动取消
 
 -                  bDisplayFlash = 1; //闪屏显示
 
 -              }
 
 -              else if (key == 2)
 
 -              {
 
 -                  //显示启动温度2秒
 
 -                  SetDisplay( startValue);
 
 -                  DisplayBuf[0]=DisplayBuf[0]|0x1;
 
 -                  DelaySec( 2);
 
 -              }
 
 -              else if (key == 3)
 
 -              {
 
 -                  //显示停止温度2秒
 
 -                  SetDisplay( stopValue);
 
 -                  DisplayBuf[0]=DisplayBuf[0]|0x8;
 
 -                  DelaySec( 2);
 
 -              }
 
 -          }
 
 -          else
 
 -          {
 
 -              if ( iSet == 1)
 
 -              {
 
 -                  //设置启动温度
 
 -                  key = KeyScan();
 
 -                  if (key == 1)
 
 -                  {
 
 -                      iSet++;
 
 -                  }
 
 -                  else if (key == 2)
 
 -                  {
 
 -                      if (startValue < 55)
 
 -                          startValue++;
 
  
-                  }
 
 -                  else if (key == 3)
 
 -                  {
 
 -                      if (startValue > -55)
 
 -                          startValue--;
 
 -                  }
 
 -                  SetDisplay( startValue);
 
 -                  DisplayBuf[0]=DisplayBuf[0]|0x1; //显示上横表示启动温度
 
 -              }
 
 -              else if ( iSet == 2)
 
 -              {
 
 -                  //设置停止温度
 
 -                  key = KeyScan();
 
 -                  if (key == 1)
 
 -                  {
 
 -                      //保存设置到eeprom
 
 -                      FlashSectorErase(EEPROM_ADDRESS);
 
 -                      FlashProgram(EEPROM_ADDRESS, startValue);
 
 -                      FlashProgram(EEPROM_ADDRESS+4, stopValue);
 
  
-                      iSet = 0;
 
 -                      bDisplayFlash = 0;
 
  
-                  }
 
 -                  else if (key == 2)
 
 -                  {
 
 -                      if (startValue < 55)
 
 -                          stopValue++;
 
 -                  }
 
 -                  else if (key == 3)
 
 -                  {
 
 -                      if (startValue > -55)
 
 -                          stopValue--;
 
 -                  }
 
 -                  SetDisplay( stopValue);
 
 -                  DisplayBuf[0]=DisplayBuf[0]|0x8; //显示下横表示停止温度
 
 -              }
 
 -              //检查设置是否超时
 
 -              if (TickCount > SET_OUTTIME)
 
 -              {
 
 -                  //设置操作超时
 
 -                  iSet = 0;
 
 -                  bDisplayFlash = 0;
 
 -              }
 
 -          }
 
  
 
-          FeedDog;  /* 喂狗,  不要用  WDT_CONTR = WDT_CONTR | 0x10;*/
 
 -          //DelayMs( 500);
 
 -      }
 
 -  }
 
  
-  UCHAR KeyScan(void)
 
 -  {
 
 -      if (!KEY0) //如果检测到低电平,说明按键按下
 
 -      {
 
 -          DelayMs(10); //延时去抖,一般10-20ms
 
 -          if (!KEY0)    //再次确认按键是否按下,没有按下则退出
 
 -          {
 
 -              while (!KEY0)
 
 -              {
 
 -                  FeedDog;
 
 -              }
 
 -              ;//如果确认按下按键等待按键释放,没有释放则一直等待
 
 -              return 1;
 
 -          }
 
 -      }
 
 -      if (!KEY1)
 
 -      {
 
 -          DelayMs(10);
 
 -          if (!KEY1)
 
 -          {
 
 -              while (!KEY1)
 
 -              {
 
 -                  FeedDog;
 
 -              };
 
 -              return 2;
 
 -          }
 
 -      }
 
 -      if (!KEY2)
 
 -      {
 
 -          DelayMs(10);
 
 -          if (!KEY2)
 
 -          {
 
 -              while (!KEY2)
 
 -              {
 
 -                  FeedDog;
 
 -              };
 
 -              return 3;
 
 -          }
 
 -      }
 
 -      return 0;
 
 -  }
 
  
-  void Init_Timer0(void)
 
 -  {
 
 -      /*功能: 初始化定时器0*/
 
 -      TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
 
 -  //TH0=0x00;              //给定初值
 
 -  //TL0=0x00;
 
 -      EA=1;            //总中断打开
 
 -      ET0=1;           //定时器中断打开
 
 -      TR0=1;           //定时器开关打开
 
 -  }
 
  
-  void Timer0_Interrupt(void) interrupt 1
 
 -  {
 
 -      /*功能: 定时器0中断程序*/
 
 -      static unsigned char num;
 
  
-      TH0=(65536-2000)/256;                  //重新赋值 2ms
 
 -      TL0=(65536-2000)%256;
 
  
-      Display();
 
  
-      num++;
 
 -      if (num==250)       //大致500ms
 
 -      {
 
 -          num=0;
 
 -          bFlash = ~bFlash;
 
 -          ReadTempFlag=1; //读标志位置1
 
 -          TickCount++;
 
 -      }
 
 -  }
 
  
-  void SetDisplay(char Value)
 
 -  {
 
 -      /*功能: 设置显示值*/
 
 -      if (Value&0x80)
 
 -      {
 
 -          DisplayBuf[0]=0x40; //负号标志
 
 -          Value=~Value;  // 取反加1
 
 -          Value +=1;
 
 -      }
 
 -      else
 
 -      {
 
 -          DisplayBuf[0]=0;
 
 -      }
 
 -      DisplayBuf[1]=DuanMa[(Value%100)/10]; //十位温度
 
 -      DisplayBuf[2]=DuanMa[(Value%100)%10]; //个位温度
 
 -  }
 
  
-  void Display(void)
 
 -  {
 
 -      /*功能: 显示数码管信息*/
 
 -      static unsigned char i=0;
 
  
-      if (bDisplayFlash)
 
 -      {
 
 -          //闪屏显示
 
 -          if (bFlash)
 
 -          {
 
 -              DataPort = 0;
 
 -              SEG1 = 1;                                //位码
 
 -              SEG2 = 1;
 
 -              SEG3 = 1;
 
 -              return;
 
 -          }
 
 -      };
 
  
-      //清空数据,防止有交替重影
 
 -      DataPort = 0;
 
  
-      switch (i)
 
 -      {
 
 -      case 0:
 
 -          SEG1 = 0;                                //位码
 
 -          SEG2 = 1;
 
 -          SEG3 = 1;
 
 -          DataPort = DisplayBuf[0];  //段码
 
 -          break;
 
 -      case 1:
 
 -          SEG1 = 1;
 
 -          SEG2 = 0;
 
 -          SEG3 = 1;
 
 -          DataPort = DisplayBuf[1];
 
 -          break;
 
 -      case 2:
 
 -          SEG1 = 1;
 
 -          SEG2 = 1;
 
 -          SEG3 = 0;
 
 -          DataPort = DisplayBuf[2];
 
 -          break;
 
 -      }
 
  
-      i++;
 
 -      if (i==3)
 
 -          i=0;
 
 -  }
 
  
-  MAIN.H
 
 -  #ifndef __MAIN_H__
 
 -  #define __MAIN_H__
 
  
-  #define UCHAR unsigned char
 
 -  #define UINT unsigned int
 
 -  #define ULONG unsigned long
 
  
-  //定义按键控制
 
 -  //设置键
 
 -  sbit KEY0 = P1^0;
 
 -  //增加键
 
 -  sbit KEY1 = P1^1;
 
 -  //减少键
 
 -  sbit KEY2 = P1^2;
 
  
-  //定义数码管
 
 -  #define DataPort P2
 
 -  sbit SEG1 = P1^5;
 
 -  sbit SEG2 = P1^6;
 
 -  sbit SEG3 = P1^7;
 
  
-  //定义控制继电器
 
 -  sbit RUN_CONTROL = P1^4;
 
  
-  //保护时间
 
 -  //停机在开始保护时间 当前 10分钟
 
 -  #define STOP_PROTECT_TIME 1200
 
 -  //设置超时 当前 2分钟
 
 -  #define SET_OUTTIME 240
 
 -  //工作超时 当前 120分钟
 
 -  #define WORK_OUTTIME 14400
 
  
-  //定义eeprom起始地址
 
 -  #define EEPROM_ADDRESS 0x2000
 
  
-  //看门狗定义
 
 -  #define FeedDog WDT_CONTR = 0x3F;
 
  
-  void Init_Timer0(void);
 
 -  void Display(void);
 
 -  UCHAR KeyScan(void);
 
 -  void SetDisplay(char Value);
 
 -  #endif
 
  复制代码 |   
 
 
 
 |