一乐电子

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

微信扫码登录

搜索
楼主: goodcode

[其他综合] 冰箱温度控制器(数控)

 火.. [复制链接]
 楼主| 发表于 2011-11-14 10:33 | 显示全部楼层
光耦隔离是需要双电源才能完全隔离吗? 如果是的话在单电源的情况下是不是就一点意义也没有了呢?
回复

使用道具 举报

 楼主| 发表于 2011-11-14 11:49 | 显示全部楼层
搜了一下baidu 这个继电器的驱动如果不使用双电源或者dc-dc隔离 就是多余了 蛋疼了 :63;

洞洞板已经焊接完了 看样要学的东西还多着呢 呵呵
回复

使用道具 举报

 楼主| 发表于 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, 不过经过检测错误返回值和数字滤波已经没什么问题. 能不能长期稳定使用还不知道:)

IMG_20111114_124647.jpg
完成后的正面

IMG_20111114_124707_001.jpg
背面, 全部飞线...

IMG_20111114_124827.jpg
启动倒计时

IMG_20111114_124848.jpg
启动后显示当前温度

冰箱温度控制器.rar (2.37 KB, 下载次数: 1617)

  1. 主要源代码, 贴出来 也许有人会用的到
  2. main.c
  3. #include<STC89C51RC_RD_PLUS.H>
  4. #include<stdio.h>
  5. #include <string.h>
  6. #include "main.h"
  7. #include "delay.h"
  8. #include "iapeeprom.h"
  9. #include"18b20.h"

  10. code const UCHAR DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0-F
  11. UCHAR DisplayBuf[3]; //存储显示值的全局变量
  12. bit ReadTempFlag;//定义读温度标志
  13. bit bFlash, bDisplayFlash;  //闪屏信息
  14. bit bRun, bProtect; //是否启动运行
  15. UINT TickCount=0; //计时器, 已秒为单位
  16. char startValue = 8, stopValue = 4; //开启与停止值


  17. void main (void)
  18. {
  19.      UINT temp;
  20.      UCHAR iSet = 0, key, i, j;
  21.      char Temperature = 0, te;  //当前温度
  22.      char temper[5];

  23.      RUN_CONTROL = 1;
  24.      bRun = 0;
  25.      bProtect = 0;

  26.      //定时器初始化
  27.      Init_Timer0();
  28.      //Init_Timer1();

  29.      //检测温度探头是否正常
  30.      if (Init_DS18B20() != 0)
  31.      {
  32.          DisplayBuf[0]=DuanMa[14];
  33.          DisplayBuf[1]=DuanMa[0];
  34.          DisplayBuf[2]=DuanMa[2];
  35.          while (1); //显示错误代码E02
  36.      }

  37.      //读取eeprom中的设置
  38.      startValue = FlashRead( EEPROM_ADDRESS);
  39.      stopValue = FlashRead( EEPROM_ADDRESS+4);

  40.      //压缩机断电保护, 通电后延迟3分钟后才执行温度检测
  41.      TickCount = 0; //重设计时器
  42.      bDisplayFlash = 1; //闪屏显示
  43.      while (1)
  44.      {
  45.          //检测是否到达保护时间
  46.          if (TickCount > 360)
  47.              break;
  48.          temp = 180 - (TickCount / 2);
  49.          DisplayBuf[0]=DuanMa[temp/100];          //百位温度
  50.          DisplayBuf[1]=DuanMa[(temp%100)/10]; //十位温度
  51.          DisplayBuf[2]=DuanMa[(temp%100)%10]; //个位温度
  52.          //按下任意键跳出保护状态
  53.          if (KeyScan() > 0)
  54.              break;
  55.      }

  56.      //开启看门狗
  57.      FeedDog;  //5s溢出

  58.      //主循环
  59.      iSet = 0;
  60.      bDisplayFlash = 0;
  61.      while (1)
  62.      {
  63.          //读取与显示当前温度
  64.          if (ReadTempFlag==1)
  65.          {
  66.              ReadTempFlag=0;
  67.              //连续读取5次
  68.              for (i=0; i<5; i++)
  69.              {
  70.                  temp=ReadTemperature();
  71.                  if (temp == 0xffff)
  72.                      break;
  73.                  temper = temp>>4;
  74.              }
  75.              if (temp != 0xffff)
  76.              {
  77.                  //排序取中间结果
  78.                  for (i=0; i<5; i++)
  79.                  {
  80.                      for (j=0; j<4-i; j++)
  81.                      {
  82.                          if (temper[j] > temper[j+1])
  83.                          {
  84.                              te= temper[ j] ;
  85.                              temper[ j] = temper[ j+ 1] ;
  86.                              temper[ j+ 1] = te;
  87.                          }
  88.                      }
  89.                  }

  90.                  Temperature = temper[2];

  91.                  if (iSet == 0)
  92.                      SetDisplay( Temperature); //设置当前显示温度
  93.              }
  94.          }

  95.          //启动与停止
  96.          if (bProtect == 0 && iSet == 0)
  97.          {
  98.              if (Temperature != 85)
  99.              {
  100.                  if (bRun == 0)
  101.                  {
  102.                      if (Temperature >= startValue)
  103.                      {
  104.                          //达到启动温度
  105.                          bRun = 1;
  106.                          RUN_CONTROL = 0;
  107.                          TickCount = 0; //重设计时器 记录工作超时
  108.                      }
  109.                  }
  110.                  else
  111.                  {
  112.                      if (Temperature <= stopValue || TickCount > WORK_OUTTIME)
  113.                      {
  114.                          //达到停止温度
  115.                          bRun = 0;
  116.                          RUN_CONTROL = 1;
  117.                          bProtect = 1; //启动保护功能10分钟内不再启动压缩机
  118.                          TickCount = 0; //重设计时器
  119.                      }
  120.                  }

  121.              }
  122.          }
  123.          else
  124.          {
  125.              DisplayBuf[0]=DisplayBuf[0] | 0x80; //在数码管上显示.表示刚停止保护中
  126.              if (TickCount > STOP_PROTECT_TIME)
  127.              {
  128.                  bProtect = 0;  //取消保护
  129.              }
  130.          }


  131.          //按键处理
  132.          if (iSet == 0)
  133.          {
  134.              //不在设置状态
  135.              key = KeyScan();
  136.              if (key == 1)
  137.              {
  138.                  iSet++;
  139.                  TickCount = 0; //重设计时器, 设置操作应该在2分钟内完成否则自动取消
  140.                  bDisplayFlash = 1; //闪屏显示
  141.              }
  142.              else if (key == 2)
  143.              {
  144.                  //显示启动温度2秒
  145.                  SetDisplay( startValue);
  146.                  DisplayBuf[0]=DisplayBuf[0]|0x1;
  147.                  DelaySec( 2);
  148.              }
  149.              else if (key == 3)
  150.              {
  151.                  //显示停止温度2秒
  152.                  SetDisplay( stopValue);
  153.                  DisplayBuf[0]=DisplayBuf[0]|0x8;
  154.                  DelaySec( 2);
  155.              }
  156.          }
  157.          else
  158.          {
  159.              if ( iSet == 1)
  160.              {
  161.                  //设置启动温度
  162.                  key = KeyScan();
  163.                  if (key == 1)
  164.                  {
  165.                      iSet++;
  166.                  }
  167.                  else if (key == 2)
  168.                  {
  169.                      if (startValue < 55)
  170.                          startValue++;

  171.                  }
  172.                  else if (key == 3)
  173.                  {
  174.                      if (startValue > -55)
  175.                          startValue--;
  176.                  }
  177.                  SetDisplay( startValue);
  178.                  DisplayBuf[0]=DisplayBuf[0]|0x1; //显示上横表示启动温度
  179.              }
  180.              else if ( iSet == 2)
  181.              {
  182.                  //设置停止温度
  183.                  key = KeyScan();
  184.                  if (key == 1)
  185.                  {
  186.                      //保存设置到eeprom
  187.                      FlashSectorErase(EEPROM_ADDRESS);
  188.                      FlashProgram(EEPROM_ADDRESS, startValue);
  189.                      FlashProgram(EEPROM_ADDRESS+4, stopValue);

  190.                      iSet = 0;
  191.                      bDisplayFlash = 0;

  192.                  }
  193.                  else if (key == 2)
  194.                  {
  195.                      if (startValue < 55)
  196.                          stopValue++;
  197.                  }
  198.                  else if (key == 3)
  199.                  {
  200.                      if (startValue > -55)
  201.                          stopValue--;
  202.                  }
  203.                  SetDisplay( stopValue);
  204.                  DisplayBuf[0]=DisplayBuf[0]|0x8; //显示下横表示停止温度
  205.              }
  206.              //检查设置是否超时
  207.              if (TickCount > SET_OUTTIME)
  208.              {
  209.                  //设置操作超时
  210.                  iSet = 0;
  211.                  bDisplayFlash = 0;
  212.              }
  213.          }


  214.          FeedDog;  /* 喂狗,  不要用  WDT_CONTR = WDT_CONTR | 0x10;*/
  215.          //DelayMs( 500);
  216.      }
  217. }

  218. UCHAR KeyScan(void)
  219. {
  220.      if (!KEY0) //如果检测到低电平,说明按键按下
  221.      {
  222.          DelayMs(10); //延时去抖,一般10-20ms
  223.          if (!KEY0)    //再次确认按键是否按下,没有按下则退出
  224.          {
  225.              while (!KEY0)
  226.              {
  227.                  FeedDog;
  228.              }
  229.              ;//如果确认按下按键等待按键释放,没有释放则一直等待
  230.              return 1;
  231.          }
  232.      }
  233.      if (!KEY1)
  234.      {
  235.          DelayMs(10);
  236.          if (!KEY1)
  237.          {
  238.              while (!KEY1)
  239.              {
  240.                  FeedDog;
  241.              };
  242.              return 2;
  243.          }
  244.      }
  245.      if (!KEY2)
  246.      {
  247.          DelayMs(10);
  248.          if (!KEY2)
  249.          {
  250.              while (!KEY2)
  251.              {
  252.                  FeedDog;
  253.              };
  254.              return 3;
  255.          }
  256.      }
  257.      return 0;
  258. }

  259. void Init_Timer0(void)
  260. {
  261.      /*功能: 初始化定时器0*/
  262.      TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  263. //TH0=0x00;              //给定初值
  264. //TL0=0x00;
  265.      EA=1;            //总中断打开
  266.      ET0=1;           //定时器中断打开
  267.      TR0=1;           //定时器开关打开
  268. }

  269. void Timer0_Interrupt(void) interrupt 1
  270. {
  271.      /*功能: 定时器0中断程序*/
  272.      static unsigned char num;

  273.      TH0=(65536-2000)/256;                  //重新赋值 2ms
  274.      TL0=(65536-2000)%256;

  275.      Display();

  276.      num++;
  277.      if (num==250)       //大致500ms
  278.      {
  279.          num=0;
  280.          bFlash = ~bFlash;
  281.          ReadTempFlag=1; //读标志位置1
  282.          TickCount++;
  283.      }
  284. }

  285. void SetDisplay(char Value)
  286. {
  287.      /*功能: 设置显示值*/
  288.      if (Value&0x80)
  289.      {
  290.          DisplayBuf[0]=0x40; //负号标志
  291.          Value=~Value;  // 取反加1
  292.          Value +=1;
  293.      }
  294.      else
  295.      {
  296.          DisplayBuf[0]=0;
  297.      }
  298.      DisplayBuf[1]=DuanMa[(Value%100)/10]; //十位温度
  299.      DisplayBuf[2]=DuanMa[(Value%100)%10]; //个位温度
  300. }

  301. void Display(void)
  302. {
  303.      /*功能: 显示数码管信息*/
  304.      static unsigned char i=0;

  305.      if (bDisplayFlash)
  306.      {
  307.          //闪屏显示
  308.          if (bFlash)
  309.          {
  310.              DataPort = 0;
  311.              SEG1 = 1;                                //位码
  312.              SEG2 = 1;
  313.              SEG3 = 1;
  314.              return;
  315.          }
  316.      };

  317.      //清空数据,防止有交替重影
  318.      DataPort = 0;

  319.      switch (i)
  320.      {
  321.      case 0:
  322.          SEG1 = 0;                                //位码
  323.          SEG2 = 1;
  324.          SEG3 = 1;
  325.          DataPort = DisplayBuf[0];  //段码
  326.          break;
  327.      case 1:
  328.          SEG1 = 1;
  329.          SEG2 = 0;
  330.          SEG3 = 1;
  331.          DataPort = DisplayBuf[1];
  332.          break;
  333.      case 2:
  334.          SEG1 = 1;
  335.          SEG2 = 1;
  336.          SEG3 = 0;
  337.          DataPort = DisplayBuf[2];
  338.          break;
  339.      }

  340.      i++;
  341.      if (i==3)
  342.          i=0;
  343. }

  344. MAIN.H
  345. #ifndef __MAIN_H__
  346. #define __MAIN_H__

  347. #define UCHAR unsigned char
  348. #define UINT unsigned int
  349. #define ULONG unsigned long

  350. //定义按键控制
  351. //设置键
  352. sbit KEY0 = P1^0;
  353. //增加键
  354. sbit KEY1 = P1^1;
  355. //减少键
  356. sbit KEY2 = P1^2;

  357. //定义数码管
  358. #define DataPort P2
  359. sbit SEG1 = P1^5;
  360. sbit SEG2 = P1^6;
  361. sbit SEG3 = P1^7;

  362. //定义控制继电器
  363. sbit RUN_CONTROL = P1^4;

  364. //保护时间
  365. //停机在开始保护时间 当前 10分钟
  366. #define STOP_PROTECT_TIME 1200
  367. //设置超时 当前 2分钟
  368. #define SET_OUTTIME 240
  369. //工作超时 当前 120分钟
  370. #define WORK_OUTTIME 14400

  371. //定义eeprom起始地址
  372. #define EEPROM_ADDRESS 0x2000

  373. //看门狗定义
  374. #define FeedDog WDT_CONTR = 0x3F;

  375. void Init_Timer0(void);
  376. void Display(void);
  377. UCHAR KeyScan(void);
  378. void SetDisplay(char Value);
  379. #endif
复制代码
回复

使用道具 举报

发表于 2011-11-17 11:39 | 显示全部楼层
怎么没有仿真文件
回复

使用道具 举报

发表于 2011-11-25 21:02 | 显示全部楼层
用89S51可以吗
回复

使用道具 举报

 楼主| 发表于 2011-11-26 21:39 | 显示全部楼层
可以 改改代码就行了
回复

使用道具 举报

发表于 2011-11-28 20:37 | 显示全部楼层
怎么改请楼主改一下,谢了我也想制作一个。
回复

使用道具 举报

发表于 2011-12-7 15:27 | 显示全部楼层
我想要能给我吗?我做毕业设计刚好用到这个 ,谢谢
回复

使用道具 举报

发表于 2011-12-16 13:01 | 显示全部楼层
4.工作超时保护, 如果压缩机连续工作30分钟则停止压缩机工作, 数码管显示E01
在热天,如果连停两天电,那这台冰箱就无法制冷了。另:用ds18b20做,又这么长的连线,在ds18b20供电两端需加滤波电容,最好用屏蔽线,还有密封问题
回复

使用道具 举报

 楼主| 发表于 2011-12-16 20:47 | 显示全部楼层
用的是两根普通线...读取错误很频繁 不过软件上检测错误还是能用的
只能说是个对付的东西, 设计的不够好...
18b20是用热缩管套上又用热熔胶封了一下
谢谢楼上的提示

不过我后来去朋友家问他冰箱工作还是很正常的 看夏天会不会出问题吧 呵呵
回复

使用道具 举报

本版积分规则

QQ|一淘宝店|手机版|商店|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2025-8-18 14:02 , Processed in 0.032939 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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