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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17251|回復: 14
收起左側

基于51單片機的溫度控制系統設計與制作 含PCB電路圖與代碼

  [復制鏈接]
ID:372961 發表于 2019-1-19 23:21 | 顯示全部樓層 |閱讀模式
本裝置可以模擬溫度報警系統,可以進行目標溫度和警報溫度的設計,未達到目標溫度模擬加熱的Led燈會出現一閃一閃的情況,達到設定的目標溫度會停止模擬加熱,當當前溫度高于設定的警報溫度時,蜂鳴器會進行報警。具體使用說明見設計書,還有就是有一點,不太會畫PCB,所以可以不用打開PCB
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
微信截圖_20190119231028.png

制作出來的實物圖如下:
微信圖片_20190119231538.jpg

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
0.png 0.png 0.png
以下是主函數部分單片機代碼:
  1. /*2018年9月12日10:19:01*/

  2. #include<reg51.h>
  3. #include"lcd.h"
  4. #include"temp.h"
  5. #include"general.h"
  6. #include"ds1302.h"

  7. /*******************************************************************************
  8. * 函數名         : main
  9. * 函數功能   :進入目標溫度和報警溫度設置頁面后,需要返回溫度顯示頁面,必須先返回萬年歷頁面,此時再按溫度顯示鍵,方可進入溫度顯示頁面
  10. * 輸入           : 無
  11. * 輸出                  : 無
  12. *******************************************************************************/
  13. //全局函數
  14. void LcdDisplay(int);
  15. void DS1302_LcdDisplay();
  16. void RES();//結果運算函數
  17. void aim();
  18. void alarm();
  19. void change_temp();


  20. //--定義全局變量
  21. typedef unsigned int u16;
  22. unsigned char Runmodel = Calendar;
  23. unsigned char Temp[] = "Temperature";                           //溫度
  24. unsigned char Date[] = "calendar";                        //萬年歷
  25. unsigned char  Aim_tp[] = "AIM_TEMP";
  26. unsigned char Alarm_tp[] = "Alarm_tp";
  27. unsigned char Aim_temp = 27;                //目標溫度初始值
  28. unsigned char Alarm_temp = 95;   //報警溫度初始值
  29. unsigned char Aim_h,Aim_l,Alarm_h,Alarm_l,Alarm_mh;
  30. int Now_temp;

  31. //IO口設定
  32. #define GPIO_KEY P1
  33. sbit K1 = P2^0;        //選擇按鍵1,進入萬年歷模式
  34. sbit K2 = P2^1;        //選擇按鍵2,進入溫度測量模式
  35. sbit K3 = P2^2; //選擇按鍵3,進行目標溫度和最高溫度警報設置
  36. sbit K4 = P1^0;        //自加按鍵
  37. sbit K5 = P1^1;        //自減按鍵
  38. sbit led = P2^3;
  39. sbit beep=P1^5;  //蜂鳴器響應
  40. sbit reset = P3^2; //復位按鍵
  41. void delay(u16 i)
  42. {
  43.      while(i--);      
  44. }
  45.         
  46. void main()
  47. {
  48.         unsigned char i = 0;
  49.         Isrint();
  50.         LcdInit();                         //初始化LCD1602
  51.         while(1)
  52.         {
  53.                 Runmodel = Run_Model();
  54.                 if(K3 == PutDown)
  55.                 {
  56.                         Delay10ms(1);
  57.                         if(K3 == PutDown)
  58.                         {
  59.                                 LcdWriteCom(0x01);
  60.                                 LcdWriteCom(0x83);
  61.                                 for(i = 0;i<8;i++)
  62.                                 LcdWriteData(Aim_tp[i]);                        //第一次按下K3進行目標溫度設定
  63.                                 LcdWriteCom(0xc5);
  64.                                 aim();
  65.                                 LcdWriteData(Aim_h);
  66.                                 LcdWriteData(Aim_l);
  67.                                 LcdWriteData(0xdf);
  68.                                 LcdWriteData('C');
  69.                                 while(1)
  70.                                 {
  71.                                         Delay10ms(10);                                 //這里必須加個延遲,不然溫度會一下子加三下
  72.                                         if(K4 == PutDown)                        //設置目標溫度進行自加
  73.                                         {
  74.                                                 Delay10ms(2);
  75.                                                 if(K4 == PutDown)
  76.                                                 {        
  77.                                                         Aim_temp++;                   //設置目標溫度進行自加
  78.                                                         aim();
  79.                                                         LcdWriteCom(0xc5);
  80.                                                         LcdWriteData(Aim_h);
  81.                                                         LcdWriteData(Aim_l);
  82.                                                         LcdWriteData(0xdf);
  83.                                                         LcdWriteData('C');
  84.                                                 }
  85.                                         }
  86.                                        
  87.                                         if(K5 == PutDown)                  //設置目標溫度進行自減
  88.                                         {
  89.                                                 Delay10ms(1);
  90.                                                 if(K5 == PutDown)
  91.                                                 {
  92.                                                         Aim_temp--;
  93.                                                         aim();
  94.                                                         LcdWriteCom(0xc5);
  95.                                                         LcdWriteData(Aim_h);
  96.                                                         LcdWriteData(Aim_l);
  97.                                                 }
  98.                                         }
  99.                                        
  100.                                         if(K3 == PutDown)
  101.                                         {
  102.                                                 Delay10ms(1);
  103.                                                 if(K3 == PutDown)
  104.                                                 {
  105.                                                         LcdWriteCom(0x01); //清屏,進入下一個警報溫度設置頁面
  106.                                                         LcdWriteCom(0x83);
  107.                                                         for(i = 0;i<8;i++)
  108.                                                         LcdWriteData(Alarm_tp[i]);
  109.                                                         LcdWriteCom(0xc5);
  110.                                                         alarm();
  111.                                                         LcdWriteData(Alarm_mh);
  112.                                                         LcdWriteData(Alarm_h);
  113.                                                 LcdWriteData(Alarm_l);
  114.                                                         LcdWriteData(0xdf);
  115.                                                         LcdWriteData('C');
  116.                                                         while(1)
  117.                                                         {
  118.                                                                 Delay10ms(10);
  119.                                                                 if(K4 == PutDown)
  120.                                                                 {
  121.                                                                         Delay10ms(1);
  122.                                                                         if(K4 == PutDown)
  123.                                                                         {
  124.                                                                                 Alarm_temp++;
  125.                                                                                 alarm();
  126.                                                                                 LcdWriteCom(0xc5);
  127.                                                                                 LcdWriteData(Alarm_mh);
  128.                                                                                 LcdWriteData(Alarm_h);
  129.                                                                         LcdWriteData(Alarm_l);
  130.                                                                                 LcdWriteData(0xdf);
  131.                                                                     LcdWriteData('C');
  132.                                                                         }
  133.                                                                 }
  134.                                                 
  135.                                                                 if(K5 == PutDown)
  136.                                                                 {
  137.                                                                         Delay10ms(1);
  138.                                                                         if(K5 == PutDown)
  139.                                                                         {
  140.                                                                                 Alarm_temp--;
  141.                                                                                 alarm();
  142.                                                                                 LcdWriteCom(0xc5);
  143.                                                                                 LcdWriteData(Alarm_mh);
  144.                                                                                 LcdWriteData(Alarm_h);
  145.                                                                         LcdWriteData(Alarm_l);
  146.                                                                                 LcdWriteData(0xdf);
  147.                                                                     LcdWriteData('C');
  148.                                                                         }
  149.                                                                 }

  150.                                                                 if(K1 == PutDown)
  151.                                                                 {
  152.                                                                         Delay10ms(1);
  153.                                                                         if(K1 == PutDown)
  154.                                                                         {
  155.                                                                                 Runmodel = Calendar;
  156.                                                                                 break;
  157.                                                                         }        
  158.                                                                 }
  159.                                                         }
  160.                                                 }
  161.                                         }
  162.                                         if(K1 == PutDown)
  163.                                         {
  164.                                                 Delay10ms(1);
  165.                                                 if(K1 == PutDown)
  166.                                                 {
  167.                                                         Runmodel = Calendar;
  168.                                                         break;
  169.                                                 }        
  170.                                         }           
  171.                                 }
  172.                         }
  173.                 }

  174.                 if(Runmodel == Calendar)                                        //萬年歷模式
  175.                 {
  176.                         LcdWriteCom(0x01);
  177.                         LcdWriteCom(0x83);
  178.                         for(i=0; i<8;i++)
  179.                         LcdWriteData(Date[i]);
  180.                         Ds1302Init();
  181.                         LcdWriteCom(0x01);
  182.                         while(1)
  183.                         {
  184.                           Ds1302ReadTime();
  185.                   DS1302_LcdDisplay();
  186.                           Runmodel = Run_Model();
  187.                           if(Runmodel == Temp_test|| K3 == PutDown)
  188.                           break;
  189.                         }
  190.                 }
  191.         
  192.             if(Runmodel == Temp_test)                //溫度測試模式
  193.                 {
  194.                         LcdWriteCom(0x01);
  195.                         LcdWriteCom(0x83);        
  196.                         for(i=0; i<11;i++)
  197.                         LcdWriteData(Temp[i]);
  198.                         LcdWriteCom(0xca);
  199.                         LcdWriteData(0xdf);
  200.                         LcdWriteData('C');                                                 //攝氏度
  201.                         while(1)
  202.                         {
  203.                           LcdDisplay(Ds18b20ReadTemp());
  204.         //                Delay1ms(1000);//1s鐘刷一次
  205.                   Now_temp = Ds18b20ReadTemp();
  206.                           change_temp();
  207.                           if(Now_temp< Aim_temp)                                          //如果目前溫度低于目標溫度,那么將開啟加熱模式
  208.                           {
  209.                                 EA = 1;
  210.                           }
  211.                           if( Now_temp> Aim_temp)                         //如果目前溫度高于目標溫度,那么將關閉加熱模式
  212.                           {
  213.                                   led =1;
  214.                                 EA = 0;
  215.                           }
  216.                           if(Now_temp >= Alarm_temp)
  217.                       {
  218.                                 while(1)
  219.                                 {
  220.                                          beep=~beep;
  221.                                      delay(10);
  222.                                          if(Now_temp < Alarm_temp)
  223.                                           break;
  224.                                 }
  225.                           }
  226.                           if(K1 == PutDown)
  227.                           {
  228.                                         Delay10ms(1);
  229.                                         if(K1 == PutDown)
  230.                                         {
  231.                                                 Runmodel = Calendar;
  232.                                                 LcdWriteCom(0x01);  //清屏,這里不能用初始化!
  233.                                                 break;
  234.                                         }
  235.                                        
  236.                                                             
  237.                                 }
  238.                           if(K3 == PutDown)
  239.                           {
  240.                                         Delay10ms(1);
  241.                                         if(K3 == PutDown)
  242.                                         {
  243.                                                 break;
  244.                                         }        
  245.                           }        
  246.                           
  247.                         }
  248.                 }

  249.                
  250.   }
  251. }

  252. /*******************************************************************************
  253. * 函數名         : LcdDisplay()
  254. * 函數功能                   : LCD顯示讀取到的溫度
  255. * 輸入           : v
  256. * 輸出                  : 無
  257. *******************************************************************************/

  258. void LcdDisplay(int temp)          //lcd顯示
  259. {
  260.    
  261.           unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
  262.           float tp;  
  263.           if(temp< 0)                                //當溫度值為負數
  264.           {
  265.                   LcdWriteCom(0xc3);                //寫地址 80表示初始地址
  266.             LcdWriteData('-');                  //顯示負
  267.                 //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  268.                 temp=temp-1;
  269.                 temp=~temp;
  270.                 tp=temp;
  271.                 temp=tp*0.0625*100+0.5;        
  272.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  273.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  274.                 //算由?.5,還是在小數點后面。

  275.           }
  276.           else
  277.           {                        
  278.                   LcdWriteCom(0xc3);                //寫地址 80表示初始地址
  279.             LcdWriteData('+');                 //顯示正
  280.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
  281.                 //如果溫度是正的那么,那么正數的原碼就是補碼它本身
  282.                 temp=tp*0.0625*100+0.5;        
  283.                 //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
  284.                 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
  285.                 //算加上0.5,還是在小數點后面。
  286.         }
  287.         datas[0] = temp / 10000;
  288.         datas[1] = temp % 10000 / 1000;
  289.         datas[2] = temp % 1000 / 100;
  290.         datas[3] = temp % 100 / 10;
  291.         datas[4] = temp % 10;

  292.         LcdWriteCom(0xc4);                  //寫地址 80表示初始地址
  293.         LcdWriteData('0'+datas[0]); //百位

  294.         
  295.         LcdWriteCom(0xc5);                 //寫地址 80表示初始地址
  296.         LcdWriteData('0'+datas[1]); //十位

  297.         LcdWriteCom(0xc6);                //寫地址 80表示初始地址
  298.         LcdWriteData('0'+datas[2]); //個位

  299.         LcdWriteCom(0xc7);                //寫地址 80表示初始地址
  300.         LcdWriteData('.');                 //顯示 ‘.’

  301.         LcdWriteCom(0xc8);                 //寫地址 80表示初始地址
  302.         LcdWriteData('0'+datas[3]); //顯示小數點  

  303.         LcdWriteCom(0xc9);                 //寫地址 80表示初始地址
  304.         LcdWriteData('0'+datas[4]); //顯示小數點  
  305. }

  306. void DS1302_LcdDisplay()
  307. {
  308.         LcdWriteCom(0x80+0X40);
  309.         LcdWriteData('0'+TIME[2]/16);                                //時
  310.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  311.         LcdWriteData(':');
  312.         LcdWriteData('0'+TIME[1]/16);                                //分
  313.         LcdWriteData('0'+(TIME[1]&0x0f));        
  314.         LcdWriteData(':');
  315.         LcdWriteData('0'+TIME[0]/16);                                //秒
  316.         LcdWriteData('0'+(TIME[0]&0x0f));

  317.         LcdWriteCom(0x80);
  318.         LcdWriteData('2');
  319.         LcdWriteData('0');
  320.         LcdWriteData('0'+TIME[6]/16);                        //年
  321.         LcdWriteData('0'+(TIME[6]&0x0f));
  322.         LcdWriteData('-');
  323.         LcdWriteData('0'+TIME[4]/16);                        //月
  324.         LcdWriteData('0'+(TIME[4]&0x0f));
  325.         LcdWriteData('-');
  326.         LcdWriteData('0'+TIME[3]/16);                        //日
  327.         LcdWriteData('0'+(TIME[3]&0x0f));
  328.         LcdWriteCom(0x8D);
  329.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                        
  330. }

  331. void aim()
  332. {
  333.     Aim_h = (Aim_temp)/10 + '0';           //必選加個'0',不然沒用
  334.     Aim_l = Aim_temp%10 + '0';
  335. }

  336. void alarm()
  337. {
  338.         Alarm_mh = Alarm_temp/100 + '0';
  339.         Alarm_h = (Alarm_temp%100)/10 + '0';           //必選加個'0',不然沒用
  340.     Alarm_l = Alarm_temp%10 + '0';
  341. }

  342. void change_temp()                                                          //必要的轉換,將返回的tp進行轉化
  343. {
  344.         Now_temp = Now_temp*0.0625*100+0.5;
  345.         Now_temp = (Now_temp/10000)*100+(Now_temp%10000/1000)*10+(Now_temp%1000/100);
  346. }

復制代碼

0.png

全部資料51hei下載地址:
溫控.zip (2.37 MB, 下載次數: 575)

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:648989 發表于 2019-11-29 00:30 | 顯示全部樓層
問題已經解決了,就是1602的連接問題,我重新找了一個板子自帶的程序,下進去,將1602調試好了之后,再下程序就可以了,我是直接將1602插到板子上的,用線連接的還是不行,對比一下,估計應該是線與可調電阻其中的一個有問題,盡量將可調電阻連上應該就可以了,還有非常感謝樓主的幫助
回復

使用道具 舉報

ID:474333 發表于 2019-2-26 21:57 | 顯示全部樓層
你好   能聯系你么
回復

使用道具 舉報

ID:372961 發表于 2019-5-11 15:23 | 顯示全部樓層
t1230 發表于 2019-5-8 22:00
仿真是什么版本?

???用的是proteus6.0的版本嗎
回復

使用道具 舉報

ID:648989 發表于 2019-11-28 20:43 | 顯示全部樓層
仿真正常,為啥連接實物不行呢,程序能下進去,板子型號stc89c52
回復

使用道具 舉報

ID:648989 發表于 2019-11-28 20:44 | 顯示全部樓層
1602能點亮,但就是沒顯示
回復

使用道具 舉報

ID:679379 發表于 2020-1-2 09:53 | 顯示全部樓層
感謝樓主提供詳細資料
回復

使用道具 舉報

ID:692660 發表于 2020-2-13 11:49 | 顯示全部樓層
謝謝樓主分享!
回復

使用道具 舉報

ID:707877 發表于 2020-3-27 17:15 | 顯示全部樓層
樓主,這個不能進行按鍵設置目標溫度吧
回復

使用道具 舉報

ID:694401 發表于 2020-3-31 13:19 | 顯示全部樓層
樓主  能私聊嗎?
回復

使用道具 舉報

ID:729938 發表于 2020-4-20 14:56 | 顯示全部樓層
你好,下載的打不開啊
回復

使用道具 舉報

ID:747418 發表于 2020-5-19 10:16 來自手機 | 顯示全部樓層
LCD為什么沒顯示
回復

使用道具 舉報

ID:779690 發表于 2020-6-15 11:06 | 顯示全部樓層
還不錯
回復

使用道具 舉報

ID:761905 發表于 2020-9-16 22:24 | 顯示全部樓層

檢查一下接口
回復

使用道具 舉報

ID:315554 發表于 2020-9-19 17:39 | 顯示全部樓層
很好,學習一下,謝謝分享,看自己有沒有辦法改成顯示到十位即可,
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合一区二区三区 | 欧美午夜影院 | 91久久精品国产免费一区 | 久久噜噜噜精品国产亚洲综合 | 成人在线视频免费观看 | 狠狠久久 | 国产午夜精品一区二区三区四区 | 婷婷二区 | 国产精品性做久久久久久 | 亚洲欧洲色视频 | 欧美在线一区二区三区 | 免费天天干 | av乱码| 国产精品精品视频一区二区三区 | 国产福利在线 | 国产精品免费大片 | 成人av资源在线 | 天天草天天干天天 | 一级黄色片网址 | 日韩免费高清视频 | 欧美午夜久久 | 午夜精品一区二区三区在线观看 | 拍拍无遮挡人做人爱视频免费观看 | 免费特黄视频 | 亚州午夜精品 | 91综合在线视频 | 国内91在线 | 久久成人一区 | 日韩精品久久久久久 | 在线一区 | 国产欧美日韩一区 | 亚洲日本乱码在线观看 | 久久精品亚洲 | 精品久久久久久 | 久久九| 一区二区三 | 成人国产精品一级毛片视频毛片 | 欧美一区二区在线观看视频 | 精品一区二区三区入口 | 2一3sex性hd| 中文字幕在线免费观看 |