找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 20808|回復(fù): 28
收起左側(cè)

太陽能自動電加熱控制器程序+電路圖

  [復(fù)制鏈接]
ID:113276 發(fā)表于 2016-4-10 22:42 | 顯示全部樓層 |閱讀模式
PCB圖
SCH圖
北方由于冬季較長,太陽能幾乎處于廢棄狀態(tài),于是自己用MCU作了這款簡易自動加熱熱控制器,本款加熱器還可以做其他方面如水溫,室內(nèi)測溫,各種家電設(shè)備測溫,測溫范圍0-100。很實用。

源程序更新:
太陽能熱水器智能控制,它以89C52單片機為核心,配合電阻型4檔水位傳感器、負溫度系數(shù)NTC熱敏電阻溫度傳感器、8255A擴展鍵盤和顯示器件、驅(qū)動電路(電磁閥、電加熱、報警)等外圍器件, 完成對太陽能熱水器容器內(nèi)的水位、水溫測量、顯示等
全部源碼下載: 太陽能熱水器智能控制系統(tǒng)程序.rar (2.84 KB, 下載次數(shù): 208)

以下是部分程序預(yù)覽:

  1. //太陽能熱水器智能控制系統(tǒng)程序:
  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. /*聲明調(diào)用函數(shù)*/
  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. /*定義調(diào)用存儲單元*/
  78. /*顯示緩沖區(qū)(依次為高位低位)*/

  79. uchar BUFFER[3]={0,0,0};
  80. uchar WTLV;//水位值
  81. uchar TMP;//水溫值
  82. uchar WTLVSET;//水位設(shè)定值
  83. uchar TMPSET;//水溫設(shè)定值
  84. uchar buf[4]={0,0,0,0};
  85. /*數(shù)碼管顯示編碼"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;//初始化外部驅(qū)動口
  100. DS1302_Init();
  101.        EA=1;//開外部中斷
  102.            IT0=1;//外部中斷下降沿觸發(fā)
  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) //設(shè)置水位
  141.                                 {
  142.                                    if(WTLVSET==4)
  143.                                         WTLVSET=0;
  144.                                         else
  145.                                         WTLVSET+=WTLVSET;
  146.                             BUFFER[0]=WTLVSET;//顯示設(shè)置水位
  147.                    display();
  148.                                    
  149.                                 }
  150.                 if(key==0x04)//電加熱
  151.                                         {
  152.                                           P1_0=1;
  153.                                         }  
  154.                 if(key==0x08)//設(shè)置溫度
  155.                                       {

  156.                                         if(TMPSET>=80)
  157.                                              TMPSET=30;
  158.                                             else
  159.                                              TMPSET=TMPSET+10;//增加十度
  160.                                  BUFFER[0]=TMPSET; 顯示設(shè)置水溫
  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;           //顯示緩沖區(qū)首址
  241.       uchar delay;       //顯示延時
  242.       uchar disp;        //顯示內(nèi)容
  243.       uchar digit;       //定義數(shù)碼管顯示位
  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);//關(guān)閉寫保護
  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.             }

復(fù)制代碼


評分

參與人數(shù) 3黑幣 +34 收起 理由
tieq1952 + 12 贊一個!
h832ea + 12 贊一個!
zhaok2013 + 10 很給力!

查看全部評分

回復(fù)

使用道具 舉報

ID:114694 發(fā)表于 2016-4-17 12:18 | 顯示全部樓層
感謝分享,大致看了一下,增強了繼續(xù)學(xué)習(xí)的信心。
回復(fù)

使用道具 舉報

ID:114802 發(fā)表于 2016-4-17 19:54 | 顯示全部樓層
不錯的東西,
回復(fù)

使用道具 舉報

ID:121508 發(fā)表于 2016-5-17 17:53 | 顯示全部樓層
很有用呢,謝謝啦
回復(fù)

使用道具 舉報

ID:149790 發(fā)表于 2016-11-23 21:21 | 顯示全部樓層
非常用呢,謝謝啦
回復(fù)

使用道具 舉報

ID:104838 發(fā)表于 2016-11-24 00:30 | 顯示全部樓層
很好,很需要
回復(fù)

使用道具 舉報

ID:168553 發(fā)表于 2017-3-12 11:05 | 顯示全部樓層
不錯,不錯。。
回復(fù)

使用道具 舉報

ID:168553 發(fā)表于 2017-3-12 11:08 | 顯示全部樓層
非常的不錯,
回復(fù)

使用道具 舉報

ID:168553 發(fā)表于 2017-3-14 13:55 | 顯示全部樓層
很好的文章。
回復(fù)

使用道具 舉報

ID:184498 發(fā)表于 2017-4-2 08:57 | 顯示全部樓層
學(xué)習(xí)的樣板工程,增加我的信心!
回復(fù)

使用道具 舉報

ID:249545 發(fā)表于 2017-11-26 16:17 | 顯示全部樓層
用18B20+MCU做的簡易自動加熱控制器,溫度在0-100度之間可調(diào).好作品!
回復(fù)

使用道具 舉報

ID:225105 發(fā)表于 2018-3-11 01:08 | 顯示全部樓層
感謝分享,收藏
回復(fù)

使用道具 舉報

ID:200801 發(fā)表于 2018-4-18 09:18 來自手機 | 顯示全部樓層
求水位檢測詳細資料
回復(fù)

使用道具 舉報

ID:83305 發(fā)表于 2018-4-18 20:33 | 顯示全部樓層
謝謝l樓主分享
回復(fù)

使用道具 舉報

ID:253767 發(fā)表于 2018-4-19 07:58 | 顯示全部樓層
謝謝分享,已經(jīng)下載
回復(fù)

使用道具 舉報

ID:347701 發(fā)表于 2018-6-10 09:39 | 顯示全部樓層
不錯不錯
回復(fù)

使用道具 舉報

ID:228293 發(fā)表于 2018-7-23 14:30 | 顯示全部樓層
謝謝共享
回復(fù)

使用道具 舉報

ID:412814 發(fā)表于 2018-11-9 21:02 | 顯示全部樓層
感謝樓主分享,下載了慢慢研究
回復(fù)

使用道具 舉報

ID:104760 發(fā)表于 2018-11-19 12:36 | 顯示全部樓層
引腳程序?qū)Σ簧咸?/td>
回復(fù)

使用道具 舉報

ID:71347 發(fā)表于 2018-11-21 20:56 | 顯示全部樓層
程序完整版電路圖求分享。
回復(fù)

使用道具 舉報

ID:434358 發(fā)表于 2018-11-27 17:26 | 顯示全部樓層
程序完整版電路圖求分享。
回復(fù)

使用道具 舉報

ID:276416 發(fā)表于 2018-11-29 13:50 | 顯示全部樓層
要是能加個手機控制就更完美了,感謝分享
回復(fù)

使用道具 舉報

ID:116022 發(fā)表于 2019-3-31 07:18 來自手機 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

ID:508977 發(fā)表于 2019-4-10 18:18 | 顯示全部樓層
超贊  厲害
回復(fù)

使用道具 舉報

ID:508977 發(fā)表于 2019-4-10 18:22 | 顯示全部樓層
贊一個!
回復(fù)

使用道具 舉報

ID:419063 發(fā)表于 2019-4-28 16:58 | 顯示全部樓層
不錯的,頂一下,哪位能將一下硅膠或不銹鋼型兩芯水位及溫度傳感器檢測原理?
回復(fù)

使用道具 舉報

ID:1033940 發(fā)表于 2024-1-14 20:40 | 顯示全部樓層
電阻型4檔水位傳感器需要ADC轉(zhuǎn)化吧,圖上好么沒看到有ADC和傳感器連接說明啊?闯绦蝾A(yù)覽用的是中斷,有人跑成功過么?
回復(fù)

使用道具 舉報

ID:1084716 發(fā)表于 2024-1-15 03:12 | 顯示全部樓層
非常詳細、不錯不錯
回復(fù)

使用道具 舉報

ID:1131130 發(fā)表于 2024-8-31 10:02 | 顯示全部樓層
學(xué)習(xí)的樣板工程,增加我的信心!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表