本设计通过对温度测量系统、上水循环系统、辅助加热系统,这三个太阳能热水器中最重要的组成部分的自动控制设计,使其太阳能的利用率达到最大化,通过科技的手段造福人类,在proteus中进行仿真实现家用太能热水控制器的主要功能,在一定程度上提高使系统的利用率!
太阳能热水控制器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
太阳能控制器的单片机源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <lcd1602.h>
- #include <ds1302.h>
- #include <ds18b20.h>
- #include <depth.h>
- sbit heater = P2^3;
- sbit k1=P1^0; //选择按键
- sbit k2=P1^1; //增加按键
- sbit k3=P1^2; //减小按键
- sbit k4=P1^3;// 确认按键
- sbit k5=P1^4; //加热开关按键
- sbit k6=P1^5;// 上水开关
- unsigned char x;
- unsigned char flag = 0;
- unsigned char temp_max = 55; //保存温度变量
- unsigned char temp_min = 40; //保存湿度变量
- unsigned char presskeynum = 0; //按键次数变量
- unsigned char Current_MIN[4];
- unsigned char Current_MAX[4];
- unsigned char integer,symbol,decimal;
- /************更新***************/
- void updatatime()
- { systemtime datetime;
- dsgettime(&datetime); //获取时间
- lcdoutput(0,0,"DATE:"); //日期
- datezstr(&datetime,datestring);
- lcdoutput(5,0,"20");
- lcdoutput(7,0,datestring);
- lcdoutput(0,1,"TIME:");
- for(x=8;x>0;x--) //循环显示时间
- {
- converttemp();
- dsgettime(&datetime);
- timezstr(&datetime,timestring);
- lcdoutput(5,1,timestring);
- delay_ms(5);
- }
- }
- void updatatemp()
- {
- lcdoutput(0,0,"SWEN:"); //水温
- lcdoutput(0,1,"SWEI:"); //水位
- lcdoutput(13,0,Current_MAX); //水温
- lcdoutput(13,1,Current_MIN);
- for(x=8;x>0;x--) //循环显示时间
- {
- converttemp();
- lcdoutput(5,0,tempstr);
- depthprocess();
- delay_ms(5);
- }
- }
- void key()
- {
- if (k1==0) //调整按键检测
- {
- delay_ms(1);
- if (k1==0)
- {
- presskeynum++; flag = ~flag;
- if(presskeynum==4)
- presskeynum=0;
- while(k1==0); //若一直按下,循环
- lcdwrite(command,clear_screen);
- }
- }
- if(presskeynum==1)//设置模式温度上限
- {
- if(k2==0) // 加
- {
- delay_ms(1);
- temp_max++;
- if (temp_max>99)
- temp_max=99;
- while(k2==0); //加上此句必须松按键才处
- lcdwrite(command,clear_screen);
- }
- if(k3==0)//减
- {
- delay_ms(1);
- temp_max--;
- if (temp_max<1)
- temp_max=1;
- while(k3==0); //加上此句必须松按键
- lcdwrite(command,clear_screen);
- }
- }
- if(presskeynum==3)//湿度设置
- {
- if(k2==0)// 加
- {
- delay_ms(1);
- temp_min++;
- if (temp_min>99)
- temp_min=100;
- while(k2==0);
- lcdwrite(command,clear_screen);
- }
- if(k3==0)//减
- {
- delay_ms(1);
- temp_min--;
- if (temp_min<1)
- temp_min=1;
- while(k3==0); //这句是调试加入的
- lcdwrite(command,clear_screen);
- }
- }
- if(k4==0)// 退出键 //设置完初始值以后通过IIC写入24c02并清屏
- {
- delay_ms(1);
- if((k4==0)&&(flag != 0))
- {
- while(k4==0);
- lcdwrite(command,clear_screen);
- lcdoutput_delay(0,0,"SAVE DATE...");
- }
- }
- }
- /************主函数***************/
- void main()
- {
- ds1302init();
- lcdini();
- while(1)
- {
- key();
- sprintf(Current_MAX,"+%2d",(int)temp_max);
- sprintf(Current_MIN,"-%2d",(int)temp_min);
-
- dsgettemp(&integer,&decimal,&symbol); //获取温度
- if(integer<temp_min) //自动加热设置temp的上下限
- {
- heater=0;
- }
- else if(integer>temp_max)
- {
- heater=1;
- }
- if(flag)
- {
- updatatemp();
- }else
- {
- updatatime(); //关键显示部分
- }
- }
-
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
工程源码.zip
(65.66 KB, 下载次数: 132)
|