黄金会员
主题
回帖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
复制代码 |
|