找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17738|回复: 27
打印 上一主题 下一主题
收起左侧

太阳能自动电加热控制器程序+电路图

  [复制链接]
跳转到指定楼层
楼主
ID:113276 发表于 2016-4-10 22:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PCB图
SCH图
北方由于冬季较长,太阳能几乎处于废弃状态,于是自己用MCU作了这款简易自动加热热控制器,本款加热器还可以做其他方面如水温,室内测温,各种家电设备测温,测温范围0-100。很实用。

源程序更新:
太阳能热水器智能控制,它以89C52单片机为核心,配合电阻型4档水位传感器、负温度系数NTC热敏电阻温度传感器、8255A扩展键盘和显示器件、驱动电路(电磁阀、电加热、报警)等外围器件, 完成对太阳能热水器容器内的水位、水温测量、显示等
全部源码下载: 太阳能热水器智能控制系统程序.rar (2.84 KB, 下载次数: 203)

以下是部分程序预览:

  1. //太阳能热水器智能控制系统程序:
  2. //定义头文件和各个输入管脚以及变量声明
  3. #include <reg52.h>
  4. #include <absacc.h>
  5. #include <stdio.h>
  6. #include <intrins.h>

  7. #define uint unsigned int//定义变量类型名
  8. #define uchar unsigned char

  9. /*定义8255a字符型字位口*/
  10. #define DIGPORT XBYTE[0x1FFF]//PA口地址,位选码地址
  11. #define WORDPORT XBYTE[0X3FFF]//PB口地址,断选码地址
  12. #define CCOM XBYTE[0X7FFFF]//控制字寄存器地址
  13. #define KPORT XBYTE[0X5FFF]//PC口,键盘扫描地址

  14. //DS1302_RST=1//定义DS1302时钟芯片引脚操作
  15. #define Set_DS1302_RST DS1302_RST=1
  16. //DS1302_RST=0
  17. #define Clr_DS1302_RST DS1302_RST=0
  18. //DS1302_SDA=1
  19. #define Set_DS1302_SDA DS1302_SDA=1        
  20. //DS1302_SDA=0
  21. #define Clr_DS1302_SDA DS1302_SDA=0
  22. //DS1302_SCLK=1
  23. #define Set_DS1302_SCLK DS1302_SCLK=1
  24. //DS1302_SCLK=0
  25. #define Clr_DS1302_SCLK DS1302_SCLK=0
  26. //定义读时间控制字
  27. #define DS1302_SEC_Reg 0x80
  28. #define DS1302_MIN_Reg 0x82
  29. #define DS1302_HR_Reg 0x84
  30. #define DS1302_DATE_Reg 0x86
  31. #define DS1302_MONTH_Reg 0x88
  32. #define DS1302_DAY_Reg 0x8a
  33. #define DS1302_YEAR_Reg 0x8c
  34. #define DS1302_CONTROL_Reg 0x8e
  35. #define DS1302_CHARGER_Reg 0x90
  36. #define DS1302_CLKBURST_Reg 0xbe
  37.             //全局变量
  38.             //为了方便,我把个位和十位分开了
  39. uchar year1=0x88;
  40. uchar year0=0x88;
  41. uchar month=0x88;
  42. uchar date=0x88;
  43. uchar day=0x88;
  44. uchar hour=0x88;
  45. uchar minute=0x88;
  46. uchar second=0x88;

  47. /*定义P1口各管脚*/
  48. sbit L0=P2^0;
  49. sbit L1=P2^1;
  50. sbit L2=P2^2;
  51. sbit L3=P2^3;
  52. sbit K0=P2^4;
  53. sbit P1_0=P1^0;
  54. sbit P1_1=P1^1;
  55. sbit P1_2=P1^2;
  56. sbit Hig=P1^4;
  57. sbit DS1302_SDA=P1^5;//定义DS1302时钟引脚与单片机引脚的连接
  58. sbit DS1302_SCLK=P1^6;
  59. sbit DS1302_RST=P1^7;

  60. /*声明调用函数*/
  61. void inital(void);
  62. void timer1_svr(void);
  63. void display(void);
  64. void delay(uchar j);
  65. void DS1302_Write(uchar reg,uchar dat);
  66. uchar DS1302_Read(uchar reg);
  67. void DS1302_Init(void);
  68. void ReadTime(void);
  69. void WtTmCr();
  70. void LvRead();
  71. void TmRead();
  72. void key(void);
  73. uchar kbscan(void);
  74. void DS1302(void);
  75. void int0_int(void);
  76. void int1_int(void);

  77. /*定义调用存储单元*/
  78. /*显示缓冲区(依次为高位低位)*/

  79. uchar BUFFER[3]={0,0,0};
  80. uchar WTLV;//水位值
  81. uchar TMP;//水温值
  82. uchar WTLVSET;//水位设定值
  83. uchar TMPSET;//水温设定值
  84. uchar buf[4]={0,0,0,0};
  85. /*数码管显示编码"0"-"9","A","-"*/
  86. uchar code TABLE[]={0x7B,0x30,0xEA,0xF8,0xB1,0xD9,0xDB,0x70,0xFB,0xF9,0xF3,0x80};

  87. main()
  88. {
  89.       inital();//初始化中断、定时器、I/O口
  90.                 kbscan();//键盘扫描
  91.            key();//键盘处理
  92.                 TmRead();//读取温度
  93.                 LvRead();//读取水位
  94.                 DS1302();//读取时间
  95.            display();//显示

  96. }

  97. void inital()
  98. {
  99. P1_0= P1_1= P1_2=K0=0;//初始化外部驱动口
  100. DS1302_Init();
  101.        EA=1;//开外部中断
  102.            IT0=1;//外部中断下降沿触发
  103.        EX0=1;//允许外部中断0
  104.        Hig=1;P1.3输出高电平
  105.        TMOD=0x11;定时器工作于方式1
  106.        TH1=0X8A;//定时器1赋初值
  107.        TL1=0XD0;
  108.             ET1=1;定时器1开定时中断
  109.                  TR1=1;//开启定时器1
  110.             CCOM=0X80;//初始化8255A,送控制字,工作方式0
  111.      
  112. }

  113. uchar kbscan(void)
  114. {
  115.      uchar recode;
  116.                   if((KPORT&0X0F)!=0X0F)                  //若有键按下
  117.           {
  118.                delay(2);                           //延时抖动
  119.          
  120.           if((KPORT&0X0F)!=0X0F)            
  121.                          {
  122.                                 recode=KPORT;
  123.                                           return(recode);
  124.                          }
  125.                 }
  126.                 else
  127.                 return(0);
  128. }

  129. void key(void)

  130. {   
  131.      uchar key;
  132.     key=kbscan();
  133.          delay(2);
  134.          if(key==0x01)
  135.                                 {
  136.                                    
  137.                                         P1_1=1;//上水
  138.                         
  139.                                 }
  140.                         if(key==0x02) //设置水位
  141.                                 {
  142.                                    if(WTLVSET==4)
  143.                                         WTLVSET=0;
  144.                                         else
  145.                                         WTLVSET+=WTLVSET;
  146.                             BUFFER[0]=WTLVSET;//显示设置水位
  147.                    display();
  148.                                    
  149.                                 }
  150.                 if(key==0x04)//电加热
  151.                                         {
  152.                                           P1_0=1;
  153.                                         }  
  154.                 if(key==0x08)//设置温度
  155.                                       {

  156.                                         if(TMPSET>=80)
  157.                                              TMPSET=30;
  158.                                             else
  159.                                              TMPSET=TMPSET+10;//增加十度
  160.                                  BUFFER[0]=TMPSET; 显示设置水温
  161.                         display();
  162.                                        }  
  163. }

  164. void timer1_svr() interrupt 1
  165. {
  166.    TH1=0X8A;//重新给定时器1赋值
  167.    TL1=0XD0;
  168.    Hig=!Hig;//充放电变换
  169.         if(Hig)//充电开始时启动定时器0
  170.         {
  171.             TL0=TH0=0X00;//定时器0赋初值0
  172.        TR0=1;//启动定时器0
  173.          }
  174. }

  175. void int0_int(void) interrupt 0//外部中断0,测水位
  176. {
  177.   EX0=0;
  178.   EX1=1;
  179.   TR0=0;
  180.   buf[0]=TL0;
  181.   buf[1]=TH0;
  182. }

  183. void int1_int(void) interrupt 2//外部中断1,测水温
  184. {
  185.    EX1=0;
  186.    EX0=1;
  187.    TR0=0;
  188.         buf[2]=TL0;
  189.         buf[3]=TH0;
  190. }

  191. void TmRead()//水温值处理
  192. {
  193.   uint val;
  194.   val=buf[3]*256+buf[2];
  195.    if(val<7549)
  196.      TMP=97-int(val*8/1000);
  197.   else  
  198.       if(val<20000)
  199.            TMP=50-int(val/1000);
  200.       else
  201.            TMP=30-int(val*5/10000);
  202.       
  203. }

  204. void LvRead()//水位值处理
  205. {
  206.      if(buf[1]>60)
  207.          {
  208.               WTLV=1;//
  209.                         L3=0;L2=1;L1=1;L0=1;
  210.                         }
  211.           else if(buf[1]>45)
  212.               {
  213.                         WTLV=2;
  214.          L3=1;L2=0;L1=1;L0=1;
  215.                         }
  216.           else if(buf[1]>36)
  217.               {
  218.                         WTLV=3;
  219.          L3=1;L2=1;L1=0;L0=1;
  220.                         }
  221.           else
  222.               {
  223.                         WTLV=4;
  224.          L3=1;L2=1;L1=1;L0=0;
  225.                         }
  226. }

  227. void WtTmCr()//水位、水温控制
  228. {
  229.       if(WTLV==4)
  230.                 P1_1=0;
  231.                 if(WTLV==1)
  232.                 P1_1=1;
  233.                 if(TMP>=TMPSET)
  234.                 P1_0=0;
  235.                 if(TMP<TMPSET&&hour==0x19)
  236.                 P1_0=1;

  237. }

  238. void  display(void)
  239. {
  240.       uchar i;           //显示缓冲区首址
  241.       uchar delay;       //显示延时
  242.       uchar disp;        //显示内容
  243.       uchar digit;       //定义数码管显示位
  244.       digit=0x0200;
  245.       for(i=2;i>=0;i--)
  246.       {
  247.           if(BUFFER[i]>100) disp=BUFFER[i]%10+10;//显示高位
  248.           else disp=BUFFER[i]%10;

  249.           DIGPORT=digit;
  250.           WORDPORT=TABLE[disp];
  251.           for(delay=0;delay<=200;delay++);
  252.           digit=digit>>1;//显示低位
  253.           disp=BUFFER[i]/10;

  254.           DIGPORT=digit;
  255.           WORDPORT=TABLE[disp];

  256.           for(delay=0;delay<=200;delay++);
  257.           digit=digit>>1;
  258.        }
  259. }
  260.    
  261. void delay(uchar j)//延时程序
  262. {
  263.     uchar a,b;
  264.          for(a=0;a<j;a++)
  265.             for(b=0;b<200;b++)
  266.                          ;
  267. }

  268. void DS1302()//时间程序
  269. {
  270.       ReadTime();
  271.       BUFFER[1]=second;
  272.           BUFFER[2]=hour;
  273. }

  274. void DS1302_Write(uchar reg,uchar dat)//写入时间
  275.        {
  276.             uchar i;
  277.             Clr_DS1302_RST;
  278.                                 _nop_();
  279.             _nop_();            
  280.             Clr_DS1302_SCLK;
  281.             _nop_();
  282.             _nop_();
  283.             Set_DS1302_RST;
  284.             _nop_();
  285.             _nop_();
  286.             for(i=8;i>0;i--)
  287.             {
  288.             if(reg&0x01) Set_DS1302_SDA;
  289.             else Clr_DS1302_SDA;
  290.             _nop_();
  291.             _nop_();
  292.             Set_DS1302_SCLK;
  293.             _nop_();
  294.             _nop_();
  295.             Clr_DS1302_SCLK;
  296.             _nop_();
  297.             _nop_();
  298.             reg>>=1;
  299.             }
  300.             for(i=8;i>0;i--)
  301.             {
  302.             if(dat&0x01) Set_DS1302_SDA;
  303.             else Clr_DS1302_SDA;
  304.             _nop_();
  305.             _nop_();
  306.             Set_DS1302_SCLK;
  307.             _nop_();
  308.             _nop_();
  309.             Clr_DS1302_SCLK;
  310.             _nop_();
  311.             _nop_();
  312.             dat>>=1;
  313.             }
  314.             Clr_DS1302_RST;
  315.             _nop_();
  316.             _nop_();
  317.        }
  318. uchar DS1302_Read(uchar reg)//读取时间
  319.             {
  320.             uchar dat=0,i;
  321.             Clr_DS1302_RST;
  322.             _nop_();
  323.             _nop_();
  324.             Clr_DS1302_SCLK;
  325.             _nop_();
  326.             _nop_();
  327.             Set_DS1302_RST;
  328.             _nop_();
  329.             _nop_();
  330.             for(i=8;i>0;i--)
  331.             {

  332.             if(reg&0x01) Set_DS1302_SDA;
  333.             else Clr_DS1302_SDA;
  334.             _nop_();
  335.             _nop_();
  336.             Set_DS1302_SCLK;
  337.             _nop_();
  338.             _nop_();
  339.             Clr_DS1302_SCLK;
  340.             _nop_();
  341.             _nop_();
  342.             reg>>=1;
  343.             }
  344.             
  345.             for(i=8;i>0;i--)
  346.             {
  347.             dat>>=1;
  348.             if(DS1302_SDA) dat|=0x80;
  349.             Set_DS1302_SCLK;
  350.             _nop_();
  351.             _nop_();
  352.             Clr_DS1302_SCLK;
  353.             _nop_();
  354.             _nop_();
  355.             }
  356.             Clr_DS1302_RST;
  357.             _nop_();
  358.             _nop_();
  359.             return(dat);
  360.             }

  361. void DS1302_Init(void)//初始化DS1302
  362.             {
  363.             DS1302_Write(DS1302_CONTROL_Reg,0x00);//关闭写保护
  364.             DS1302_Write(DS1302_SEC_Reg,0x80);//暂停
  365.             DS1302_Write(DS1302_CHARGER_Reg,0xa9);//涓流充电
  366.             DS1302_Write(DS1302_YEAR_Reg,0x04); //年
  367.             DS1302_Write(DS1302_MONTH_Reg,0x12); //月
  368.             DS1302_Write(DS1302_DATE_Reg,0x09); //日
  369.             DS1302_Write(DS1302_DAY_Reg,0x04); //周
  370.             DS1302_Write(DS1302_HR_Reg,0x10); //时
  371.             DS1302_Write(DS1302_MIN_Reg,0x25); //分
  372.             DS1302_Write(DS1302_SEC_Reg,0x00); //秒
  373.             DS1302_Write(DS1302_CONTROL_Reg,0x80);//打开写保护
  374.             }
  375. void ReadTime(void)//读取时间
  376.             {
  377.             uchar dat;
  378.             dat=DS1302_Read(DS1302_YEAR_Reg);//年
  379.             year0=dat&0x0f;
  380.             year1=dat>>4;
  381.             dat=DS1302_Read(DS1302_MONTH_Reg);//月
  382.             month=dat;
  383.             dat=DS1302_Read(DS1302_DATE_Reg);//日
  384.             date=dat;
  385.             dat=DS1302_Read(DS1302_DAY_Reg);//周
  386.             day=dat;
  387.             dat=DS1302_Read(DS1302_HR_Reg);//时
  388.             hour=dat;
  389.             dat=DS1302_Read(DS1302_MIN_Reg);//分
  390.             minute=dat;
  391.             dat=DS1302_Read(DS1302_SEC_Reg);//秒
  392.             second=dat;
  393.             }

复制代码


评分

参与人数 3黑币 +34 收起 理由
tieq1952 + 12 赞一个!
h832ea + 12 赞一个!
zhaok2013 + 10 很给力!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:114694 发表于 2016-4-17 12:18 | 只看该作者
感谢分享,大致看了一下,增强了继续学习的信心。
回复

使用道具 举报

板凳
ID:114802 发表于 2016-4-17 19:54 | 只看该作者
不错的东西,
回复

使用道具 举报

地板
ID:121508 发表于 2016-5-17 17:53 | 只看该作者
很有用呢,谢谢啦
回复

使用道具 举报

5#
ID:149790 发表于 2016-11-23 21:21 | 只看该作者
非常用呢,谢谢啦
回复

使用道具 举报

6#
ID:104838 发表于 2016-11-24 00:30 | 只看该作者
很好,很需要
回复

使用道具 举报

7#
ID:168553 发表于 2017-3-12 11:05 | 只看该作者
不错,不错。。
回复

使用道具 举报

8#
ID:168553 发表于 2017-3-12 11:08 | 只看该作者
非常的不错,
回复

使用道具 举报

9#
ID:168553 发表于 2017-3-14 13:55 | 只看该作者
很好的文章。
回复

使用道具 举报

10#
ID:184498 发表于 2017-4-2 08:57 | 只看该作者
学习的样板工程,增加我的信心!
回复

使用道具 举报

11#
ID:249545 发表于 2017-11-26 16:17 | 只看该作者
用18B20+MCU做的简易自动加热控制器,温度在0-100度之间可调.好作品!
回复

使用道具 举报

12#
ID:225105 发表于 2018-3-11 01:08 | 只看该作者
感谢分享,收藏
回复

使用道具 举报

13#
ID:200801 发表于 2018-4-18 09:18 来自手机 | 只看该作者
求水位检测详细资料
回复

使用道具 举报

14#
ID:83305 发表于 2018-4-18 20:33 | 只看该作者
谢谢l楼主分享
回复

使用道具 举报

15#
ID:253767 发表于 2018-4-19 07:58 | 只看该作者
谢谢分享,已经下载
回复

使用道具 举报

16#
ID:347701 发表于 2018-6-10 09:39 | 只看该作者
不错不错
回复

使用道具 举报

17#
ID:228293 发表于 2018-7-23 14:30 | 只看该作者
谢谢共享
回复

使用道具 举报

18#
ID:412814 发表于 2018-11-9 21:02 | 只看该作者
感谢楼主分享,下载了慢慢研究
回复

使用道具 举报

19#
ID:104760 发表于 2018-11-19 12:36 | 只看该作者
引脚程序对不上号
回复

使用道具 举报

20#
ID:71347 发表于 2018-11-21 20:56 | 只看该作者
程序完整版电路图求分享。
回复

使用道具 举报

21#
ID:434358 发表于 2018-11-27 17:26 | 只看该作者
程序完整版电路图求分享。
回复

使用道具 举报

22#
ID:276416 发表于 2018-11-29 13:50 | 只看该作者
要是能加个手机控制就更完美了,感谢分享
回复

使用道具 举报

23#
ID:116022 发表于 2019-3-31 07:18 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

24#
ID:508977 发表于 2019-4-10 18:18 | 只看该作者
超赞  厉害
回复

使用道具 举报

25#
ID:508977 发表于 2019-4-10 18:22 | 只看该作者
赞一个!
回复

使用道具 举报

26#
ID:419063 发表于 2019-4-28 16:58 | 只看该作者
不错的,顶一下,哪位能将一下硅胶或不锈钢型两芯水位及温度传感器检测原理?
回复

使用道具 举报

27#
ID:1033940 发表于 2024-1-14 20:40 | 只看该作者
电阻型4档水位传感器需要ADC转化吧,图上好么没看到有ADC和传感器连接说明啊。看程序预览用的是中断,有人跑成功过么?
回复

使用道具 举报

28#
ID:1084716 发表于 2024-1-15 03:12 | 只看该作者
非常详细、不错不错
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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