久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9162|回復: 13
收起左側

單片機智能熱水器設計方案 含仿真與源碼及視頻講解

  [復制鏈接]
ID:361393 發表于 2018-6-28 23:12 | 顯示全部樓層 |閱讀模式
這是我設計的智能熱水器的控制方案基本功能:將水溫控制在一個0到99攝氏度的溫度上,同時還具有無水自動加水,水滿停止加水以及延時和紅外控制的功能。
里面包含:
1源代碼
2器件清單
3系統仿真
單片機智能熱水器仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

仿真視頻講解:
0.png

0.png

單片機源程序如下:
  1. //程序頭函數
  2. #include <reg52.h>
  3. //顯示函數
  4. #include <display.h>
  5. //宏定義
  6. #define uint unsigned int
  7. #define uchar unsigned char

  8. //管腳聲明
  9. sbit jdq= P1^0;        //加熱繼電器
  10. sbit shui=P1^3;//加水繼電器
  11. sbit Feng = P2^6; //蜂鳴器
  12. //按鍵
  13. sbit Key1=P1^4;         //設置
  14. sbit Key2=P1^5;         //加
  15. sbit Key3=P1^6;         //減
  16. sbit Key4=P1^7;         //確定         
  17. sbit shang=P3^7;//上限
  18. sbit xia=P3^6;//下限

  19. sbit DQ=P2^2;                             //定義DS18B20總線I/O
  20. signed char w,bj,bjx,bjd;                                     //溫度值全局變量
  21. uchar c;                                //溫度值全局變量
  22. bit bdata flag=0,flag_BJ,flag_off=1,que;
  23. //時間計算
  24. #define Imax 14000    //此處為晶振為11.0592時的取值,
  25. #define Imin 8000    //如用其它頻率的晶振時,
  26. #define Inum1 145    //要改變相應的取值。
  27. #define Inum2 700
  28. #define Inum3 3000
  29. //解碼變量
  30. unsigned char Im[4]={0x00,0x00,0x00,0x00};

  31. //全局變量
  32. uchar f;
  33. unsigned char m,Tc;
  34. unsigned char IrOK;

  35. //設置變量

  36. uchar xx=29;
  37. //下限
  38. uchar sx=35;
  39. //上限
  40. int ds=0;
  41. uchar Mode=0;

  42. void delay(uint z)
  43. {
  44.         uint i,j;
  45.         for(i=0;i<z;i++)
  46.         for(j=0;j<121;j++);
  47. }
  48. /**************************************************************************************************
  49. **************************溫度工作程序*************************************************************
  50. **************************************************************************************************/
  51. /*****延時子程序*****/
  52. void Delay_DS18B20(int num)
  53. {
  54.   while(num--) ;
  55. }
  56. /*****初始化DS18B20*****/
  57. void Init_DS18B20(void)
  58. {
  59.   unsigned char x=0;
  60.   DQ = 1;         //DQ復位
  61.   Delay_DS18B20(8);    //稍做延時
  62.   DQ = 0;         //單片機將DQ拉低
  63.   Delay_DS18B20(8);   //精確延時,大于480us
  64.   DQ = 1;         //拉高總線
  65.   Delay_DS18B20(14);
  66.   x = DQ;           //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
  67.   Delay_DS18B20(20);
  68. }
  69. /*****讀一個字節*****/
  70. unsigned char ReadOneChar(void)
  71. {
  72.   unsigned char i=0;
  73.   unsigned char dat = 0;
  74.   for (i=8;i>0;i--)
  75.   {
  76.     DQ = 0;     // 給脈沖信號
  77.     dat>>=1;
  78.     DQ = 1;     // 給脈沖信號
  79.     if(DQ)
  80.     dat|=0x80;
  81.     Delay_DS18B20(4);
  82.   }
  83.   return(dat);
  84. }
  85. /*****寫一個字節*****/
  86. void WriteOneChar(unsigned char dat)
  87. {
  88.   unsigned char i=0;
  89.   for (i=8; i>0; i--)
  90.   {
  91.     DQ = 1;
  92.     DQ = dat&0x10;
  93.     Delay_DS18B20(5);
  94.     DQ = 0;
  95.     dat>>=1;
  96.   }
  97. }
  98. /*****讀取溫度*****/
  99. unsigned int ReadTemperature(void)
  100. {
  101.   unsigned char a=0;
  102.   unsigned char b=0;
  103.   unsigned int t=0;
  104.   float tt=0;
  105.   Init_DS18B20();
  106.   WriteOneChar(0xC1);  //跳過讀序號列號的操作
  107.   WriteOneChar(0x44);  //啟動溫度轉換
  108.   Init_DS18B20();
  109.   WriteOneChar(0xC1);  //跳過讀序號列號的操作
  110.   WriteOneChar(0xBE);  //讀取溫度寄存器
  111.   a=ReadOneChar();     //讀低8位
  112.   b=ReadOneChar();    //讀高8位
  113.   t=b;
  114.   t<<=8;
  115.   t=t|a;
  116.   tt=t*0.00625;
  117.   t= tt*10+0.5;     //放大10倍輸出并四舍五入
  118.   return(t);
  119. }


  120. /*****讀取溫度*****/
  121. void check_wendu(void)
  122. {
  123.         c=ReadTemperature()-5;                          //獲取溫度值并減去DS18B20的溫漂誤差
  124.         w=c/10;                                                      //計算得到整數位
  125.         if(w<0){w=0;}                                   //設置溫度顯示上限
  126.         if(w>99){w=99;}                                   //設置溫度顯示上限   
  127. }
  128. /**************************************************************************************************
  129. ***************************************************************************************************
  130. **************************************************************************************************/


  131. /**************************************************************************************************
  132. ************************************按鍵工作程序***************************************************
  133. **************************************************************************************************/
  134. void Key()
  135. {
  136.         //模式選擇
  137.         if(Key1==0)
  138.         {
  139.                 while(Key1==0);
  140.                 Feng=0;
  141.                 Mode++;
  142.                 Display_wd();
  143.                 if(Mode==4)
  144.                 {
  145.                         Mode=1;
  146.                         Feng=1;
  147.                 }
  148.                    write_com(0x38);//屏幕初始化
  149.                    write_com(0x0d);//打開顯示 無光標 光標閃爍
  150.                    write_com(0x06);//當讀或寫一個字符是指針后一一位
  151.                 switch(Mode)
  152.                 {
  153.                         case 1:
  154.                         {
  155.                                 write_com(0x80+15);//位置
  156.                                 Feng=1;
  157.                                 break;
  158.                         }
  159.                         case 2:
  160.                         {
  161.                                 write_com(0x80+0x40+5);//位置
  162.                                 Feng=1;
  163.                                 break;
  164.                         }
  165.                         case 3:
  166.                         {
  167.                                 write_com(0x80+0x40+14);//位置
  168.                                 Feng=1;
  169.                                 break;
  170.                         }
  171.                 }
  172.         }
  173.         if(Key2==0&&Mode!=0)
  174.         {
  175.                 while(Key2==0);
  176.                 Feng=0;
  177.                 switch(Mode)
  178.                 {
  179.                         case 1:
  180.                         {
  181.                                 if(ds<999)
  182.                                 {
  183.                                         ds++;
  184.                                         write_com(0x80+13);
  185.                                         write_data('0'+ds/100);
  186.                                         write_data('0'+ds/10%10);
  187.                                         write_data('0'+ds%10);
  188.                                         write_com(0x80+15);//位置
  189.                                 }
  190.                                 Feng=1;
  191.                                 break;
  192.                         }
  193.                         case 2:
  194.                         {
  195.                                 if(sx<99-1)
  196.                                 {
  197.                                         sx++;
  198.                                         write_com(0x80+0x40+4);
  199.                                         write_data('0'+sx/10%10);
  200.                                         write_data('0'+sx%10);
  201.                                         write_com(0x80+0x40+5);//位置
  202.                                 }
  203.                                 Feng=1;
  204.                                 break;                                
  205.                         }
  206.                         case 3:
  207.                         {
  208.                                 if(xx<sx-1)
  209.                                 {
  210.                                         xx++;
  211.                                         write_com(0x80+0x40+13);
  212.                                         write_data('0'+xx/10%10);
  213.                                         write_data('0'+xx%10);
  214.                                         write_com(0x80+0x40+14);//位置
  215.                                 }
  216.                                 Feng=1;
  217.                                 break;                                
  218.                         }               
  219.                 }
  220.         }
  221.         if(Key3==0&&Mode!=0)
  222.         {
  223.                 while(Key3==0);
  224.                 Feng=0;
  225.                 switch(Mode)
  226.                 {
  227.                         case 1:
  228.                         {
  229.                                 if(ds>0)
  230.                                 {
  231.                                         ds--;
  232.                                         write_com(0x80+13);
  233.                                         write_data('0'+ds/100);
  234.                                         write_data('0'+ds/10%10);
  235.                                         write_data('0'+ds%10);
  236.                                         write_com(0x80+15);//位置
  237.                                 }
  238.                                 Feng=1;
  239.                                 break;
  240.                         }
  241.                         case 2:
  242.                         {
  243.                                 if(sx>xx+1)
  244.                                 {
  245.                                         sx--;
  246.                                         write_com(0x80+0x40+4);
  247.                                         write_data('0'+sx/10%10);
  248.                                         write_data('0'+sx%10);
  249.                                         write_com(0x80+0x40+5);//位置
  250.                                 }
  251.                                 Feng=1;
  252.                                 break;                                
  253.                         }
  254.                         case 3:
  255.                         {
  256.                                 if(xx>0)
  257.                                 {
  258.                                         xx--;
  259.                                         write_com(0x80+0x40+13);
  260.                                         write_data('0'+xx/10%10);
  261.                                         write_data('0'+xx%10);
  262.                                         write_com(0x80+0x40+14);//位置
  263.                                 }
  264.                                 Feng=1;
  265.                                 break;                                
  266.                         }               
  267.                 }
  268.         }
  269.         if(Key4==0)
  270.         {
  271.                 while(Key4==0);
  272.                 Feng=0;
  273.                 Mode=0;
  274.         //        write_com(0x38);//屏幕初始化
  275.         //        write_com(0x0c);//打開顯示 無光標 無光標閃爍
  276.                 Init1602();
  277.                 if(ds>0)
  278.                 {
  279.                         flag=1;
  280.                         jdq=1;
  281.                         TR1=1;
  282.                 }
  283.                 Feng=1;
  284.         }
  285.                 if(IrOK==1)
  286.                 {
  287.                         if(Im[2]==0x0d)        //遙控設置鍵
  288.                         {
  289.                                 Feng=0;
  290.                                 Mode++;
  291.                                 Display_wd();
  292.                                 if(Mode==4)
  293.                                 {
  294.                                         Mode=1;
  295.                                         Feng=1;
  296.                                 }
  297.                                    write_com(0x38);//屏幕初始化
  298.                                    write_com(0x0d);//打開顯示 無光標 光標閃爍
  299.                                    write_com(0x06);//當讀或寫一個字符是指針后一一位
  300.                                 switch(Mode)
  301.                                 {
  302.                                         case 1:
  303.                                         {
  304.                                                 write_com(0x80+15);//位置
  305.                                                 Feng=1;
  306.                                                 break;
  307.                                         }
  308.                                         case 2:
  309.                                         {
  310.                                                 write_com(0x80+0x40+5);//位置
  311.                                                 Feng=1;
  312.                                                 break;
  313.                                         }
  314.                                         case 3:
  315.                                         {
  316.                                                 write_com(0x80+0x40+14);//位置
  317.                                                 Feng=1;
  318.                                                 break;
  319.                                         }
  320.                                 }                                 
  321.                         }
  322.                         //+鍵
  323.                         else if(Im[2]==0x40)
  324.                         {
  325.                                 if(Mode!=0)
  326.                                 {
  327.                                         Feng=0;
  328.                                         switch(Mode)
  329.                                         {
  330.                                                 case 1:
  331.                                                 {
  332.                                                         if(ds<999)
  333.                                                         {
  334.                                                                 ds++;
  335.                                                                 write_com(0x80+13);
  336.                                                                 write_data('0'+ds/100);
  337.                                                                 write_data('0'+ds/10%10);
  338.                                                                 write_data('0'+ds%10);
  339.                                                                 write_com(0x80+15);//位置
  340.                                                         }
  341.                                                         Feng=1;
  342.                                                         break;
  343.                                                 }
  344.                                                 case 2:
  345.                                                 {
  346.                                                         if(sx<99-1)
  347.                                                         {
  348.                                                                 sx++;
  349.                                                                 write_com(0x80+0x40+4);
  350.                                                                 write_data('0'+sx/10%10);
  351.                                                                 write_data('0'+sx%10);
  352.                                                                 write_com(0x80+0x40+5);//位置
  353.                                                         }
  354.                                                         Feng=1;
  355.                                                         break;                                
  356.                                                 }
  357.                                                 case 3:
  358.                                                 {
  359.                                                         if(xx<sx-1)
  360.                                                         {
  361.                                                                 xx++;
  362.                                                                 write_com(0x80+0x40+13);
  363.                                                                 write_data('0'+xx/10%10);
  364.                                                                 write_data('0'+xx%10);
  365.                                                                 write_com(0x80+0x40+14);//位置
  366.                                                         }
  367.                                                         Feng=1;
  368.                                                         break;                                
  369.                                                 }               
  370.                                         }
  371.                                 }
  372.                         }
  373.                         //-鍵
  374.                         else if(Im[2]==0x19)
  375.                         {
  376.                                 if(Mode!=0)
  377.                                 {
  378.                                         Feng=0;
  379.                                         switch(Mode)
  380.                                         {
  381.                                                 case 1:
  382.                                                 {
  383.                                                         if(ds>0)
  384.                                                         {
  385.                                                                 ds--;
  386.                                                                 write_com(0x80+13);
  387.                                                                 write_data('0'+ds/100);
  388.                                                                 write_data('0'+ds/10%10);
  389.                                                                 write_data('0'+ds%10);
  390.                                                                 write_com(0x80+15);//位置
  391.                                                         }
  392.                                                         Feng=1;
  393.                                                         break;
  394.                                                 }
  395.                                                 case 2:
  396.                                                 {
  397.                                                         if(sx>xx+1)
  398.                                                         {
  399.                                                                 sx--;
  400.                                                                 write_com(0x80+0x40+4);
  401.                                                                 write_data('0'+sx/10%10);
  402.                                                                 write_data('0'+sx%10);
  403.                                                                 write_com(0x80+0x40+5);//位置
  404.                                                         }
  405.                                                         Feng=1;
  406.                                                         break;                                
  407.                                                 }
  408.                                                 case 3:
  409.                                                 {
  410.                                                         if(xx>0)
  411.                                                         {
  412.                                                                 xx--;
  413.                                                                 write_com(0x80+0x40+13);
  414.                                                                 write_data('0'+xx/10%10);
  415.                                                                 write_data('0'+xx%10);
  416.                                                                 write_com(0x80+0x40+14);//位置
  417.                                                         }
  418.                                                         Feng=1;
  419.                                                         break;                                
  420.                                                 }               
  421.                                         }
  422.                                 }
  423.                         }
  424.                         //確定鍵
  425.                         else if(Im[2]==0x15)
  426.                         {
  427.                                 Feng=0;
  428.                                 Mode=0;
  429.                                 Init1602();
  430.                                 if(ds>0)
  431.                                 {
  432.                                         flag=1;
  433.                                         jdq=1;
  434.                                         TR1=1;
  435.                                 }
  436.                                 Feng=1;
  437.                         }
  438.                         IrOK=0;         
  439.                 }
  440. }
  441. /**************************************************************************************************
  442. ***************************************************************************************************
  443. **************************************************************************************************/



  444. /**************************************************************************************************
  445. ************************************報警部分程序***************************************************
  446. **************************************************************************************************/
  447. void Alam()
  448. {
  449.         if(flag_BJ==1&&flag_off==1)
  450.         {
  451.                 Feng=0;
  452.                 delay(1000);
  453.                 Feng=1;
  454.                 flag_off=0;
  455. //                flag_BJ=0;
  456.         }
  457. }
  458. /**************************************************************************************************
  459. ***************************************************************************************************
  460. **************************************************************************************************/

  461. /**************************************************************************************************
  462. *********************************************主程序************************************************
  463. **************************************************************************************************/
  464. void main()
  465. {
  466.         Init1602();
  467.         EA=1;//打開中斷總開關
  468.         IT1=1;//下降沿有效
  469.         EX1=1;//外部中斷1開
  470.         ET1=1;//打開允許開關
  471.         TMOD=0x01;//設置工作方式
  472.         TL1=0x3c;
  473.         TH1=0xb0;//賦初值
  474.         TH0=0;//T0賦初值
  475.         TL0=0;
  476.         TR0=0;//t0開始計時
  477.         check_wendu();
  478.         delay(1000);
  479.         bjd=99;
  480.         bjx=0;                                 //這兩個變量的作用就是,防止溫度大范圍跳動造成加熱設備誤動作
  481.         while(1)
  482.         {        
  483.                 check_wendu();
  484.                 if(Mode==0)
  485.                 {        
  486.                         Display_1602(c,ds,sx,xx);
  487.                         if((xia==1)&&(shang==1)) //低于下限
  488.                         {
  489.                                  que=1;
  490.                                 shui=0;
  491.                                 jdq=1;
  492.                         }
  493.                         else
  494.                         {
  495.                                 que=0;
  496.                         }
  497.                         if((shang==0)&&(xia==0)) //高于上限
  498.                         {
  499.                                 shui=1;
  500.                                 if(flag_BJ==0)
  501.                                 flag_BJ=1;
  502.                         }
  503.                         if((shang==0)&&(xia==1)) //錯誤
  504.                         {
  505.                                 shui=1;
  506.                                 jdq=1;
  507.                                 Feng=0;
  508.                                 que=1;
  509.                         }
  510.                         if(flag==0)
  511.                         {
  512.                                 if((w<bjd)&&(w>bjx))
  513.                                 {
  514.                                         if(w>=sx)
  515.                                         {
  516.                                                 jdq=1;
  517.                                                 if(flag_BJ==0)
  518.                                                 flag_BJ=1;
  519.                                         }
  520.                                         else if((w<xx)&&(que==0))         
  521.                                         {
  522.                                                 jdq=0;
  523.                                                 if(flag_BJ==0)
  524.                                                 flag_BJ=1;
  525.                                         }
  526.                                         else
  527.                                         {
  528.                                                 flag_BJ=0;
  529.                                                 flag_off=1;
  530.                                         }
  531.                                         bjd=w+5;
  532.                                         bjx=w-5;
  533.                                 }
  534.                         }
  535.                 }
  536.                 Key();
  537.                 Alam();
  538.         }
  539. }
  540. /**************************************************************************************************
  541. ***************************************************************************************************
  542. **************************************************************************************************/


  543. /**************************************************************************************************
  544. ****************************************定時器工作程序*********************************************
  545. **************************************************************************************************/
  546. void time1() interrupt 3//定時器函數
  547. {
  548.         uint s;
  549.         TH1=0x3c;
  550.         TL1=0xb0;//重新賦初值
  551.         s++;
  552.         if(s==1200)        //s=20為1s鐘  1200為1分鐘
  553.         {
  554.                 s=0;
  555.                 ds--;
  556.                 if(ds==0)
  557.                 {
  558.                         flag=0;
  559.                         if(w>=sx)
  560.                         {
  561.                                 jdq=1;
  562.                                 if(flag_BJ==0)
  563.                                 flag_BJ=1;
  564.                         }
  565.                         else if((w<xx)&&(que==0))
  566. ……………………

  567. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

本人初學,僅供參考,存在錯誤和不足之處,請大家回帖多多指教,切勿照搬,文件下載:
新建文件夾.rar (2.31 MB, 下載次數: 363)

評分

參與人數 1黑幣 +8 收起 理由
ZONE-9 + 8 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:461751 發表于 2019-1-5 13:22 | 顯示全部樓層
nice啊
回復

使用道具 舉報

ID:461751 發表于 2019-1-12 16:47 | 顯示全部樓層
樓主,用你那程序仿真后,lcd第二行不顯示,溫度傳感器也無法調解溫度,能解釋一下原因不,非常感謝
回復

使用道具 舉報

ID:375715 發表于 2019-1-14 00:35 來自手機 | 顯示全部樓層
很好(▽)
回復

使用道具 舉報

ID:539513 發表于 2019-5-16 08:21 | 顯示全部樓層
太對了
回復

使用道具 舉報

ID:632048 發表于 2019-10-29 14:47 | 顯示全部樓層
很想學習單片機
回復

使用道具 舉報

ID:676474 發表于 2019-12-29 10:28 | 顯示全部樓層
有很大的用處
回復

使用道具 舉報

ID:686251 發表于 2020-2-28 12:09 | 顯示全部樓層
本帖最后由 Hopeful 于 2020-3-4 19:11 編輯

很好,就是那個c 運行到第二行沒有,也沒檢測到啥毛病
回復

使用道具 舉報

ID:447960 發表于 2020-3-22 13:21 | 顯示全部樓層
#include <display.h>這個為什么說找不到頭文件啊
回復

使用道具 舉報

ID:720111 發表于 2020-4-1 16:01 | 顯示全部樓層
這個沒有自動加水功能吧
回復

使用道具 舉報

ID:1029488 發表于 2022-5-25 09:48 | 顯示全部樓層
pandahu 發表于 2019-1-12 16:47
樓主,用你那程序仿真后,lcd第二行不顯示,溫度傳感器也無法調解溫度,能解釋一下原因不,非常感謝

他的代碼調用的芯片和你的不一樣
回復

使用道具 舉報

ID:1011458 發表于 2022-5-25 15:05 | 顯示全部樓層
實際應用效果如何
回復

使用道具 舉報

ID:1031404 發表于 2022-5-31 23:10 來自手機 | 顯示全部樓層
為什么這個原理圖溫度低于最低溫度的時候不會報警啊
回復

使用道具 舉報

ID:1047200 發表于 2022-12-16 09:06 來自手機 | 顯示全部樓層
樓主,這個紅外遙控無法使用是什么原因呀
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色在线网站 | 欧美日韩专区 | 人人人人爽 | 免费观看一级视频 | 美女黄视频网站 | 亚洲国产成人精品在线 | 国产乱码精品一区二区三区中文 | 国产美女网站 | 国产欧美一区二区三区免费 | 国产在线观看免费 | 亚洲欧洲国产视频 | 国产精品不卡 | 91大神在线看 | 欧美午夜精品 | 久久99久久99 | 91久久 | 亚洲一区二区精品视频 | 999国产精品视频 | 欧美a区| 国产欧美一区二区久久性色99 | 国产最新精品视频 | 一区二区在线不卡 | 国产精品久久久久永久免费观看 | 男女视频在线观看网站 | 欧美精产国品一二三区 | 在线观看av网站永久 | 久久毛片 | 欧美伦理一区 | 久久久网 | 综合五月婷 | 精品无码久久久久久国产 | 亚洲一区二区在线 | 中文字幕一区二区三区精彩视频 | 7777在线视频免费播放 | 久久久精品久久久 | 国产一区二区影院 | 中文字幕在线国产 | 精品一区电影 | 亚洲一区二区在线 | 亚洲第一成人影院 | 激情av|