找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機水溫控制系統(tǒng)Proteus仿真程序 LCD1602顯示

  [復(fù)制鏈接]
ID:474538 發(fā)表于 2020-5-22 23:44 | 顯示全部樓層 |閱讀模式
基于單片機的溫度控制系統(tǒng)資料水溫控制系統(tǒng)
1.采用液晶顯示當(dāng)前溫度值,溫度上限和溫度下限;
2.采用DS18B20溫度傳感器測溫;
3.按鍵可以設(shè)置報警值,當(dāng)溫度超過設(shè)定的上限或低于下限(顯示比例:32%,雙擊查同時相應(yīng)的繼電器吸合
4.加鍵和減鍵?稍O(shè)置上下限溫度控制范圍;
5.溫度測量范圍0到99.9攝氏度,精度為0.1攝氏度;

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1UANP@5SI)Y@G]N$QYEVB96.png XFONMG4U(O_MET~BH~]WK`I.png G3]XN8@G@R0I63QYC4M%6$B.png $@07Z7T9}%PEWHDBFFGG]CP.png

單片機源程序如下:
  1. #include<reg52.h>
  2. #include"1602.h"
  3. #include"ds18b20.h"
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. sbit speaker=P1^5;                  //定義蜂鳴器
  7. sbit red=P2^0;                          //定義報警燈
  8. //sbit green=P2^1;
  9. sbit key1=P3^0;                          //定義溫度按鍵
  10. sbit key2=P3^1;                          //定義時間按鍵

  11. uint tem;                                  //定義采集溫度
  12. int htem,time;                          //定義溫度、時間
  13. int cnt1=1,cnt2=1;                  //定義計數(shù)變量
  14. int min,i;
  15. uchar mode=0;                          //定義模式變量
  16. uchar code t3[]={"high temp:     C"};
  17. uchar code t4[]={"time:        MIN"};


  18. //延時函數(shù)
  19. void delay1(uint i)
  20. {
  21.         while(i--);        
  22. }


  23. //顯示函數(shù)1
  24. void display(uint dat,uchar add)
  25. {
  26. uchar bai,shi ,ge;
  27. bai=dat/100;
  28. shi=dat%100/10;
  29. ge=dat%10;                                                                                   
  30. writelcd_cmd(add);
  31. writelcd_dat(bai+0x30);
  32. writelcd_dat(shi+0x30);
  33. writelcd_cmd(add+3);
  34. writelcd_dat(ge+0x30);
  35. }


  36. //顯示函數(shù)2
  37. void display2(uint dat,uchar add)
  38. {
  39. uchar bai,shi ;
  40. bai=dat/100;
  41. shi=dat%100/10;
  42. //ge=dat%10;                                                                                   
  43. writelcd_cmd(add);
  44. writelcd_dat(shi+0x30);
  45. writelcd_dat(bai+0x30);
  46. writelcd_cmd(add+3);
  47. //writelcd_dat(ge+0x30);
  48. }


  49. //顯示函數(shù)3
  50. void display3(uint dat,uchar add)
  51. {
  52. uchar ge;
  53. //bai=dat/100;
  54. //shi=dat%100/10;
  55. ge=dat%10;                                                                                   
  56. writelcd_cmd(add);
  57. //writelcd_dat(shi+0x30);
  58. //writelcd_dat(bai+0x30);
  59. //writelcd_cmd(add+3);
  60. writelcd_dat(ge+0x30);
  61. }


  62. //按鍵掃描函數(shù)
  63. void keyscan()
  64. {  uchar i,j;
  65.    writelcd_cmd(0x80);
  66.    for(i=0;i<16;i++)
  67.    {writelcd_dat(t3[i]);}
  68.    writelcd_cmd(0xc0);
  69.    for(j=0;j<16;j++)
  70.    {writelcd_dat(t4[j]);}
  71.    
  72.    
  73.    while(mode!=0)
  74.    {
  75. display2(htem,0x8b);
  76. display3(time,0xca);
  77.    while(mode!=0)
  78.    {
  79.            switch(mode)
  80.            {
  81.            case 1:writelcd_cmd(0xc0+10);writelcd_cmd(0x0f);break;
  82.            case 2:writelcd_cmd(0x80+11);writelcd_cmd(0x0f);break;
  83.            default:mode=0;break;
  84.            }
  85.           if(key1==0&&mode==1)
  86.           {
  87.             
  88.                   delay(50);
  89.                   if(key1==0)
  90.                 {  
  91.                    cnt1++;
  92.                    while(key1==0);
  93.                    switch(cnt1%10)
  94.                    {
  95.                            case 1:time=1;min=1000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //1分鐘
  96.                 case 2:time=2;min=2000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //2分鐘
  97.                 case 3:time=3;min=3000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //3分鐘
  98.                         case 4:time=4;min=4000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //4分鐘
  99.                         case 5:time=5;min=5000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //5分鐘
  100.                         case 6:time=6;min=6000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //6分鐘
  101.                         case 7:time=7;min=7000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //7分鐘
  102.                         case 8:time=8;min=8000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //8分鐘
  103.                         case 9:time=9;min=9000;display3(time,0xca);writelcd_cmd(0xca+11);break;                         //9分鐘
  104.                         
  105.                         default:break;        
  106.                    }        
  107.                 }
  108.           }

  109.          
  110.           if(key2==0&&mode==2)
  111.           {
  112.           delay(10);
  113.           if(key2==0)
  114.                   {
  115.                    cnt2++;
  116.                    while(key2==0);
  117.                    switch(cnt2%4)
  118.                    {
  119.                     case 1:htem=20;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //20攝氏度
  120.                     case 2:htem=50;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //50攝氏度
  121.                     case 3:htem=80;display2(htem,0x8b);writelcd_cmd(0x80+11);break;                  //80攝氏度
  122.                     default:break;
  123.                    }
  124.                   }
  125.           }
  126.    }
  127.   }
  128.   lcd_init();
  129. }


  130. //中斷初始化函數(shù)
  131. void init()
  132. {
  133.   lcd_init();                   //lcd初始化
  134.    speaker=1;
  135.    red=0;
  136.    mode=0;
  137.    htem=20;
  138.    time=1;
  139.    EA=1;                                //總中斷開啟
  140.    EX0=1;                                //外部中斷0允許
  141.    ET0=1;                                //定時器0允許
  142.    TMOD=0X01;                        //定時中斷0,模式1
  143.    IT0=1;                                //下降沿觸發(fā)
  144.    TH0=0Xee;                        //0.5us
  145.    TL0=0X00;
  146.    //TR0=0;
  147. }



  148. //主函數(shù)
  149. void main()
  150. {  
  151.     red=0;
  152.          init();                  //中斷初始化
  153.         while(1)
  154.         {  
  155.                 if(mode!=0)
  156.                 {keyscan();}

  157.              else if(mode==0)
  158.                 {        
  159.                     delay(100);
  160.                     tmpchange();
  161.                         tem=tmp();                         //溫度值獲取

  162.                         if(tem>=(htem*10))                //高于設(shè)定溫度
  163.                         {
  164.                           TR0=1;                                //中斷開啟
  165.                           red=1;                                  //報警燈亮                                            
  166.                         }
  167.                         else                                     //低于設(shè)定溫度
  168.                         {
  169.                         TR0=0;                                        //中斷關(guān)閉
  170.             red=0;                                //報警燈滅
  171.                         }
  172.                         
  173.                         delay(10);
  174.                     display(tem,0xca);
  175.                     delay(100);
  176.                         TR0=0;
  177.                           
  178.                 }
  179.         }
  180. }



  181. //外部中斷服務(wù)函數(shù)
  182. void exter()interrupt 0
  183. {
  184. delay(50);                 //按鍵消抖
  185. if(P3^2==0)
  186. mode++;                        
  187. mode=mode%4 ;         //每按4次置0
  188. }


  189. //定時中斷服務(wù)函數(shù)
  190. void timer0()interrupt 1
  191. {
  192. TH0=0Xee;                 //重裝載
  193. TL0=0X00;
  194. min--;
  195. if(min<=0)                 //計時時間到
  196. {
  197.    red=1;         //報警燈閃爍
  198.    delay(200);
  199.    speaker=~speaker;delay1(1);          //蜂鳴器報警
  200.    TR0=0;                 //定時中斷關(guān)閉
  201. }

  202. }
復(fù)制代碼

所有資料51hei提供下載(求大神指點,如何加入pid啊):
PID溫度控制.zip (126.37 KB, 下載次數(shù): 297)

回復(fù)

使用道具 舉報

ID:754600 發(fā)表于 2020-5-31 10:37 來自手機 | 顯示全部樓層
樓主把你這個繼電器后面加一個OVEN,程序改一下,能夠看出具體加熱?
回復(fù)

使用道具 舉報

ID:941784 發(fā)表于 2021-6-21 18:00 | 顯示全部樓層
請問樓主有proteus運行代碼嗎?不是C語言的
回復(fù)

使用道具 舉報

ID:982706 發(fā)表于 2021-11-19 22:52 | 顯示全部樓層
mzyyyds 發(fā)表于 2021-6-21 18:00
請問樓主有proteus運行代碼嗎?不是C語言的

用keil轉(zhuǎn)換一下不就行了
回復(fù)

使用道具 舉報

ID:1026734 發(fā)表于 2022-5-16 10:27 來自手機 | 顯示全部樓層
Proteus仿真是7.5版本的
回復(fù)

使用道具 舉報

ID:923472 發(fā)表于 2022-6-2 20:33 | 顯示全部樓層
有人知道,這個時間設(shè)置的分鐘數(shù)是用來干什么的嗎
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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