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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數字溫度控制系統設計資料

  [復制鏈接]
跳轉到指定樓層
樓主
基于51單片機控制的數字溫度控制系統

單片機源程序如下:

  1. #include <reg52.h>                        // 包含頭文件
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  5. sbit DQ = P1^1;                                                // DS18B20傳感器的引腳定義
  6. sbit w1 = P2^4;                                         // 數碼管第1位的控制引腳
  7. sbit w2 = P2^5;                                                // 數碼管第2位的控制引腳
  8. sbit w3 = P2^6;                                                // 數碼管第3位的控制引腳
  9. sbit w4 = P2^7;                                                 // 數碼管第4位的控制引腳
  10. sbit Buzzer  = P1^0;                        // 蜂鳴器引腳
  11. sbit JdqLow  = P2^0;                        // 溫度過低繼電器控制(加熱)
  12. sbit JdqHig  = P2^1;                        // 溫度過高繼電器控制(降溫)
  13. sbit LedLow  = P2^2;                        // 溫度低指示燈
  14. sbit LedHig  = P2^3;                        // 溫度高指示燈
  15. sbit KeySet  = P3^2;                        // 設置按鍵
  16. sbit KeyDown = P3^3;                        // 減按鍵
  17. sbit KeyUp   = P3^4;                        // 加按鍵



  18. /*   數碼管的顯示值:  0    1    2    3    4    5     6   7    8    9    -   */
  19. uchar code Array1[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40 };

  20. /*                     0.   1.   2.   3.   4.   5.    6.  7.   8.   9.  */
  21. uchar code Array2[]={ 0xBf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef };


  22. uchar Buff[4];                                        // 顯示緩沖區
  23. uchar ShowID=1;                                        // 當前顯示的是哪一個數碼管

  24. int AlarmLow=150;                                // 默認報警的溫度下限值是15度
  25. int AlarmHig=300;                                // 默認報警的溫度上限值是30度


  26. /*********************************************************/
  27. // 毫秒級的延時函數,time是要延時的毫秒數
  28. /*********************************************************/
  29. void DelayMs(uint time)
  30. {
  31.         uint i,j;
  32.         for(i=0;i<time;i++)
  33.                 for(j=0;j<112;j++);
  34. }


  35. /*********************************************************/
  36. // 延時15微秒
  37. /*********************************************************/
  38. void Delay15us(void)
  39. {
  40.         _nop_();
  41.         _nop_();
  42.         _nop_();
  43.         _nop_();
  44.         _nop_();
  45.         _nop_();
  46.         _nop_();
  47.         _nop_();
  48.         _nop_();
  49.         _nop_();
  50.         _nop_();
  51.         _nop_();
  52.         _nop_();
  53.         _nop_();
  54.         _nop_();
  55. }


  56. /*********************************************************/
  57. // 復位DS18B20(初始化)
  58. /*********************************************************/
  59. void DS18B20_ReSet(void)
  60. {
  61.         uchar i;
  62.         DQ=0;

  63.         i=240;
  64.         while(--i);

  65.         DQ=1;

  66.         i=30;
  67.         while(--i);

  68.         while(~DQ);

  69.         i=4;
  70.         while(--i);
  71. }


  72. /*********************************************************/
  73. // 向DS18B20寫入一個字節
  74. /*********************************************************/
  75. void DS18B20_WriteByte(uchar dat)
  76. {
  77.         uchar j;
  78.         uchar btmp;
  79.         
  80.         for(j=0;j<8;j++)
  81.         {
  82.                 btmp=0x01;
  83.                 btmp=btmp<<j;
  84.                 btmp=btmp&dat;
  85.                
  86.                 if(btmp>0)                // 寫1
  87.                 {
  88.                         DQ=0;
  89.                         Delay15us();
  90.                         DQ=1;
  91.                         Delay15us();
  92.                         Delay15us();
  93.                         Delay15us();
  94.                         Delay15us();
  95.                 }
  96.                 else                        // 寫0
  97.                 {
  98.                         DQ=0;
  99.                         Delay15us();
  100.                         Delay15us();
  101.                         Delay15us();
  102.                         Delay15us();
  103.                         DQ=1;
  104.                         Delay15us();
  105.                 }
  106.         }
  107. }


  108. /*********************************************************/
  109. // 讀取溫度值
  110. /*********************************************************/
  111. int DS18B20_ReadTemp(void)
  112. {
  113.         uchar j;
  114.         int b,temp=0;        

  115.         DS18B20_ReSet();                                                        // 產生復位脈
  116.         DS18B20_WriteByte(0xcc);                        // 忽略ROM指令
  117.         DS18B20_WriteByte(0x44);                        // 啟動溫度轉換指令

  118.         DS18B20_ReSet();                                                        // 產生復位脈
  119.         DS18B20_WriteByte(0xcc);                        // 忽略ROM指令
  120.         DS18B20_WriteByte(0xbe);                        // 讀取溫度指令

  121.         for(j=0;j<16;j++)                                                        // 讀取溫度數量
  122.         {                                                
  123.                 DQ=0;
  124.                 _nop_();
  125.                 _nop_();
  126.                 DQ=1;        
  127.                 Delay15us();
  128.                 b=DQ;
  129.                 Delay15us();
  130.                 Delay15us();
  131.                 Delay15us();
  132.                 b=b<<j;
  133.                 temp=temp|b;
  134.         }
  135.         
  136.         temp=temp*0.0625*10;                                        // 合成溫度值并放大10倍                                       
  137.         
  138.         return (temp);                                                                // 返回檢測到的溫度值
  139. }


  140. /*********************************************************/
  141. // 定時器初始化
  142. /*********************************************************/
  143. void TimerInit()
  144. {
  145.         TMOD = 0x01;                                        // 使用定時器0,工作方式1         
  146.         TH0  = 248;                                                // 給定時器0的TH0裝初值
  147.         TL0  = 48;                                                // 給定時器0的TL0裝初值
  148.         ET0  = 1;                                                        // 定時器0中斷使能
  149.         EA   = 1;                                                        // 打開總中斷
  150.         TR0         = 1;                                                        // 啟動定時器0
  151. }


  152. /*********************************************************/
  153. // 顯示溫度值
  154. /*********************************************************/
  155. void ShowTemp(int dat)
  156. {
  157.         if(dat<0)                                                                                                // 負號
  158.         {
  159.                 Buff[0]=Array1[10];
  160.                 dat=0-dat;
  161.         }
  162.         else                                                                                                                // 百位
  163.         {
  164.                 Buff[0]=Array1[dat/1000];
  165.         }
  166.         
  167.         Buff[1]=Array1[dat%1000/100];                // 十位
  168.         Buff[2]=Array2[dat%100/10];                        // 個位
  169.         Buff[3]=Array1[dat%10];                                        // 小數后一位
  170. }


  171. /*********************************************************/
  172. // 報警判斷
  173. /*********************************************************/
  174. void AlarmJudge(int dat)
  175. {
  176.         if(dat<AlarmLow)                                // 判斷溫度是否過低
  177.         {
  178.                 LedLow=0;                                                        // 溫度低指示燈亮
  179.                 LedHig=1;                                                        // 溫度高指示燈滅
  180.                 JdqLow=0;                                                        // 溫度過低的繼電器閉合(開始加熱)
  181.                 JdqHig=1;                                                        // 溫度過高的繼電器斷開(停止降溫)
  182.                 Buzzer=0;                                                        // 蜂鳴器報警
  183.         }
  184.         else if(dat>AlarmHig)                // 判斷溫度是否過高
  185.         {
  186.                 LedLow=1;                                                        // 溫度低指示燈滅
  187.                 LedHig=0;                                                        // 溫度高指示燈亮
  188.                 JdqLow=1;                                                        // 溫度過低的繼電器斷開(停止加熱)
  189.                 JdqHig=0;                                                        // 溫度過高的繼電器閉合(開始降溫)
  190.                 Buzzer=0;                                                        // 蜂鳴器報警
  191.         }
  192.         else                                                                                // 溫度正常
  193.         {
  194.                 LedLow=1;                                                        // 溫度低指示燈滅
  195.                 LedHig=1;                                                        // 溫度高指示燈滅
  196.                 JdqLow=1;                                                        // 溫度過低的繼電器斷開(停止加熱)
  197.                 JdqHig=1;                                                        // 溫度過高的繼電器斷開(停止降溫)
  198.                 Buzzer=1;                                                        // 蜂鳴器停止報警
  199.         }
  200. }


  201. /*********************************************************/
  202. // 按鍵掃描
  203. /*********************************************************/
  204. void KeyScanf()
  205. {
  206.         if(KeySet==0)                                                                        // 如果設置按鍵被按下
  207.         {
  208.                 /* 設置溫度下限 */
  209.                 LedLow=0;                                                                                // 點亮綠色燈(代表當前正在設置溫度下限)
  210.                 LedHig=1;                                                                                // 熄滅紅色燈
  211.                 Buzzer=1;                                                                                // 關閉蜂鳴器
  212.                 ShowTemp(AlarmLow);                                        // 顯示溫度下限值
  213.                 DelayMs(10);                                                                // 延時去抖
  214.                 while(!KeySet);                                                        // 等待按鍵釋放
  215.                 DelayMs(10);                                                                // 延時去抖
  216.                
  217.                 while(1)
  218.                 {
  219.                         if(KeyDown==0)                                                                // 如果“減”按鍵被按下
  220.                         {
  221.                                 if(AlarmLow>-550)                                                // 判斷當前溫度下限是否大于-55度
  222.                                 {
  223.                                         AlarmLow--;                                                                // 溫度下限值減去0.1度
  224.                                         ShowTemp(AlarmLow);                                // 刷新顯示改變后的溫度下限值
  225.                                         DelayMs(200);                                                        // 延時
  226.                                 }
  227.                         }
  228.                         
  229.                         if(KeyUp==0)                                                                        // 如果“加”按鍵被按下                                       
  230.                         {
  231.                                 if(AlarmLow<1250)                                                // 判斷當前溫度下限是否小于125度
  232.                                 {
  233.                                         AlarmLow++;                                                                // 溫度下限值加上0.1度
  234.                                         ShowTemp(AlarmLow);                                // 刷新顯示改變后的溫度下限值
  235.                                         DelayMs(200);                                                        // 延時
  236.                                 }
  237.                         }
  238.                         
  239.                         if(KeySet==0)                                                                        // 如果“設置”按鍵被按下
  240.                         {
  241.                                 break;                                                                                        // 退出溫度下限值的設置,準備進入上限值的設置
  242.                         }
  243.                 }
  244.                
  245.                 /* 設置溫度上限 */
  246.                 LedLow=1;                                                                                // 熄滅綠色燈
  247.                 LedHig=0;                                                                                // 點亮紅色燈(代表當前正在設置溫度上限)
  248.                 ShowTemp(AlarmHig);                                        // 顯示溫度上限值
  249.                 DelayMs(10);                                                                // 延時去抖
  250.                 while(!KeySet);                                                        // 等待按鍵釋放
  251.                 DelayMs(10);                                                                // 延時去抖
  252.                
  253.                 while(1)
  254.                 {
  255.                         if(KeyDown==0)                                                        // 如果“減”按鍵被按下                                                        
  256.                         {
  257.                                 if(AlarmHig>-550)                                        // 判斷當前溫度上限是否大于-55度
  258.                                 {
  259.                                         AlarmHig--;                                                        // 溫度上限值減去0.1度
  260.                                         ShowTemp(AlarmHig);                        // 刷新顯示改變后的溫度上限值
  261.                                         DelayMs(200);                                                // 延時
  262.                                 }
  263.                         }
  264.                         
  265.                         if(KeyUp==0)                                                                // 如果“加”按鍵被按下                                       
  266.                         {
  267.                                 if(AlarmHig<1250)                                        // 判斷當前溫度上限是否小于125度
  268.                                 {
  269.                                         AlarmHig++;                                                        // 溫度上限值加上0.1度
  270.                                         ShowTemp(AlarmHig);                        // 刷新顯示改變后的溫度上限值
  271.                                         DelayMs(200);
  272.                                 }
  273.                         }
  274.                         
  275.                         if(KeySet==0)                                                                // 如果“設置”按鍵被按下
  276.                         {
  277.                                 break;                                                                                // 準備退出設置模式
  278.                         }
  279.                 }
  280.                
  281.                 /* 退出設置模式 */
  282.                 LedLow=1;                                                                        // 熄滅綠燈
  283.                 LedHig=1;                                                                        // 熄滅紅燈
  284.                 DelayMs(10);                                                        // 延時去抖
  285.                 while(!KeySet);                                                // 等待按鍵釋放
  286.                 DelayMs(10);                                                        // 延時去抖
  287.         }
  288. }


  289. /*********************************************************/
  290. // 主函數
  291. /*********************************************************/
  292. void main()
  293. {
  294.         int temp;
  295.         uchar i;
  296.         
  297.         TimerInit();                                                                                // 定時器0的初始化(數碼管的動態掃描)
  298.         
  299.         Buff[0]=Array1[0];                                                        // 剛上電顯示4個0
  300.         Buff[1]=Array1[0];
  301.         Buff[2]=Array1[0];
  302.         Buff[3]=Array1[0];
  303.         
  304.         for(i=0;i<8;i++)                                                                // 由于傳感器剛上電讀出的溫度不穩定,因此先進行幾次溫度的讀取并丟棄
  305.         {
  306.                 DS18B20_ReadTemp();
  307.                 DelayMs(120);
  308.         }
  309.         
  310.         while(1)
  311.         {
  312.                 EA=0;                                                                                                        // 屏蔽中斷
  313.                 temp=DS18B20_ReadTemp();                        // 讀取溫度值
  314.                 EA=1;                                                                                                        // 恢復中斷
  315.                
  316.                 ShowTemp(temp);                                                                // 顯示溫度值
  317.                
  318.                 AlarmJudge(temp);                                                        // 判斷是否需要報警
  319.                
  320.                 for(i=0;i<100;i++)                                                // 延時并進行按鍵掃描
  321.                 {
  322.                         KeyScanf();                                       
  323.                         DelayMs(10);                                                               
  324.                 }
  325.         }
  326. }
  327. ……………………

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

所有資料51hei提供下載:
程序(Keil版).zip (47.54 KB, 下載次數: 117)


評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:108622 發表于 2018-7-17 20:53 | 只看該作者
這個下載試試好用不,論壇下載過2個都點有問題不完美
回復

使用道具 舉報

板凳
ID:108622 發表于 2018-7-19 15:46 | 只看該作者
這個沒有記憶功能
回復

使用道具 舉報

地板
ID:393819 發表于 2018-9-5 16:08 來自手機 | 只看該作者
樓主有高清圖嗎,看清引腳就行
回復

使用道具 舉報

5#
ID:369315 發表于 2018-9-6 11:12 | 只看該作者
這個沒有記憶功能
回復

使用道具 舉報

6#
ID:396811 發表于 2018-9-12 09:13 | 只看該作者
非常不錯
回復

使用道具 舉報

7#
ID:462745 發表于 2019-1-7 17:29 | 只看該作者
不錯哦
回復

使用道具 舉報

8#
ID:511662 發表于 2019-4-20 14:57 | 只看該作者
請問仿真還在嗎,學習下,師兄
回復

使用道具 舉報

9#
ID:511662 發表于 2019-4-20 15:20 | 只看該作者
請問有仿真嗎,參考學習下
回復

使用道具 舉報

10#
ID:753799 發表于 2020-5-18 10:23 | 只看該作者

有仿真么,可以參考一下么
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人精品福利 | 97色免费视频 | 国产精品69久久久久水密桃 | 免费黄色在线 | 久久这里只有精品首页 | 免费成人在线网站 | 7777在线视频 | 欧美激情99| 免费观看黄网站 | 久久精品免费观看 | 永久免费在线观看 | 国产日韩欧美激情 | 成人伊人| 操操日 | 奇米av | 国产精品免费视频一区 | 亚洲综合国产 | 天天看天天摸天天操 | 国产成人99久久亚洲综合精品 | 久久日韩精品一区二区三区 | 日韩高清www | 国产成人精品免费视频大全最热 | 久久久久久亚洲精品 | 亚洲欧美一区二区三区在线 | 午夜影视大全 | 岛国毛片在线观看 | 午夜看片 | 国外成人免费视频 | 国产 日韩 欧美 在线 | 日本羞羞影院 | 日韩一区精品 | 国产黄色在线观看 | 日韩在线不卡视频 | 成人啊啊啊 | 久久一日本道色综合久久 | 激情五月婷婷在线 | 成人美女免费网站视频 | 精品久久一区 | 91中文字幕在线 | 欧美精品一区三区 | 激情欧美一区二区三区中文字幕 |