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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6612|回復: 5
打印 上一主題 下一主題
收起左側

51單片機水溫控制系統Proteus仿真程序 LCD1602顯示

  [復制鏈接]
跳轉到指定樓層
樓主
基于單片機的溫度控制系統資料水溫控制系統
1.采用液晶顯示當前溫度值,溫度上限和溫度下限;
2.采用DS18B20溫度傳感器測溫;
3.按鍵可以設置報警值,當溫度超過設定的上限或低于下限(顯示比例:32%,雙擊查同時相應的繼電器吸合
4.加鍵和減鍵。可設置上下限溫度控制范圍;
5.溫度測量范圍0到99.9攝氏度,精度為0.1攝氏度;

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機源程序如下:
  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;                  //定義計數變量
  14. int min,i;
  15. uchar mode=0;                          //定義模式變量
  16. uchar code t3[]={"high temp:     C"};
  17. uchar code t4[]={"time:        MIN"};


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


  23. //顯示函數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. //顯示函數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. //顯示函數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. //按鍵掃描函數
  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. //中斷初始化函數
  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;                                //下降沿觸發
  144.    TH0=0Xee;                        //0.5us
  145.    TL0=0X00;
  146.    //TR0=0;
  147. }



  148. //主函數
  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))                //高于設定溫度
  163.                         {
  164.                           TR0=1;                                //中斷開啟
  165.                           red=1;                                  //報警燈亮                                            
  166.                         }
  167.                         else                                     //低于設定溫度
  168.                         {
  169.                         TR0=0;                                        //中斷關閉
  170.             red=0;                                //報警燈滅
  171.                         }
  172.                         
  173.                         delay(10);
  174.                     display(tem,0xca);
  175.                     delay(100);
  176.                         TR0=0;
  177.                           
  178.                 }
  179.         }
  180. }



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


  189. //定時中斷服務函數
  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;                 //定時中斷關閉
  201. }

  202. }
復制代碼

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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:754600 發表于 2020-5-31 10:37 來自手機 | 只看該作者
樓主把你這個繼電器后面加一個OVEN,程序改一下,能夠看出具體加熱?
回復

使用道具 舉報

板凳
ID:941784 發表于 2021-6-21 18:00 | 只看該作者
請問樓主有proteus運行代碼嗎?不是C語言的
回復

使用道具 舉報

地板
ID:982706 發表于 2021-11-19 22:52 | 只看該作者
mzyyyds 發表于 2021-6-21 18:00
請問樓主有proteus運行代碼嗎?不是C語言的

用keil轉換一下不就行了
回復

使用道具 舉報

5#
ID:1026734 發表于 2022-5-16 10:27 來自手機 | 只看該作者
Proteus仿真是7.5版本的
回復

使用道具 舉報

6#
ID:923472 發表于 2022-6-2 20:33 | 只看該作者
有人知道,這個時間設置的分鐘數是用來干什么的嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩在线小视频 | 成人高清视频在线观看 | 一区二区国产在线 | 亚洲一区二区久久久 | 日韩在线精品强乱中文字幕 | 国产亚洲一区在线 | 天堂资源最新在线 | 中文字幕在线一区二区三区 | 国产精品国产自产拍高清 | 欧美日韩国产一区二区三区 | 久久免费大片 | 三级视频久久 | 欧美激情久久久 | 黄色日批视频 | www.玖玖玖 | 亚洲精选一区二区 | 国产高清视频在线播放 | 毛片在线免费播放 | 久草中文在线 | 国产精品久久久久久久久久久久 | 伊人精品久久久久77777 | 国产精品91视频 | 欧美日韩一区二区在线播放 | 国产精品成人69xxx免费视频 | 亚洲精品乱码8久久久久久日本 | 中文字幕一区在线观看视频 | 在线国产中文字幕 | 成人午夜 | 欧美一区二区三区在线 | 国产精品视频久久 | 亚洲一区二区精品视频在线观看 | 日韩国产一区二区三区 | 91免费福利在线 | 久久久久久综合 | 国产乱码久久久久久 | 日韩精品久久久久 | 日韩中文字幕免费在线观看 | 黄色毛片一级 | 免费国产一区二区 | 日韩a视频 | 91在线视频 |