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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數(shù)字溫度控制系統(tǒng)設(shè)計資料

  [復(fù)制鏈接]
ID:372407 發(fā)表于 2018-7-16 12:27 | 顯示全部樓層 |閱讀模式
基于51單片機控制的數(shù)字溫度控制系統(tǒng) 03.jpg 03、溫度過高.jpg 04、溫度過低.jpg 02、溫度檢測.jpg 01、未上電.jpg

單片機源程序如下:

  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;                                         // 數(shù)碼管第1位的控制引腳
  7. sbit w2 = P2^5;                                                // 數(shù)碼管第2位的控制引腳
  8. sbit w3 = P2^6;                                                // 數(shù)碼管第3位的控制引腳
  9. sbit w4 = P2^7;                                                 // 數(shù)碼管第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;                        // 設(shè)置按鍵
  16. sbit KeyDown = P3^3;                        // 減按鍵
  17. sbit KeyUp   = P3^4;                        // 加按鍵



  18. /*   數(shù)碼管的顯示值:  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];                                        // 顯示緩沖區(qū)
  23. uchar ShowID=1;                                        // 當前顯示的是哪一個數(shù)碼管

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


  26. /*********************************************************/
  27. // 毫秒級的延時函數(shù),time是要延時的毫秒數(shù)
  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. // 復(fù)位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寫入一個字節(jié)
  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();                                                        // 產(chǎn)生復(fù)位脈
  116.         DS18B20_WriteByte(0xcc);                        // 忽略ROM指令
  117.         DS18B20_WriteByte(0x44);                        // 啟動溫度轉(zhuǎn)換指令

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

  121.         for(j=0;j<16;j++)                                                        // 讀取溫度數(shù)量
  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];                                        // 小數(shù)后一位
  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)                                                                        // 如果設(shè)置按鍵被按下
  207.         {
  208.                 /* 設(shè)置溫度下限 */
  209.                 LedLow=0;                                                                                // 點亮綠色燈(代表當前正在設(shè)置溫度下限)
  210.                 LedHig=1;                                                                                // 熄滅紅色燈
  211.                 Buzzer=1;                                                                                // 關(guān)閉蜂鳴器
  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)                                                                        // 如果“設(shè)置”按鍵被按下
  240.                         {
  241.                                 break;                                                                                        // 退出溫度下限值的設(shè)置,準備進入上限值的設(shè)置
  242.                         }
  243.                 }
  244.                
  245.                 /* 設(shè)置溫度上限 */
  246.                 LedLow=1;                                                                                // 熄滅綠色燈
  247.                 LedHig=0;                                                                                // 點亮紅色燈(代表當前正在設(shè)置溫度上限)
  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)                                                                // 如果“設(shè)置”按鍵被按下
  276.                         {
  277.                                 break;                                                                                // 準備退出設(shè)置模式
  278.                         }
  279.                 }
  280.                
  281.                 /* 退出設(shè)置模式 */
  282.                 LedLow=1;                                                                        // 熄滅綠燈
  283.                 LedHig=1;                                                                        // 熄滅紅燈
  284.                 DelayMs(10);                                                        // 延時去抖
  285.                 while(!KeySet);                                                // 等待按鍵釋放
  286.                 DelayMs(10);                                                        // 延時去抖
  287.         }
  288. }


  289. /*********************************************************/
  290. // 主函數(shù)
  291. /*********************************************************/
  292. void main()
  293. {
  294.         int temp;
  295.         uchar i;
  296.         
  297.         TimerInit();                                                                                // 定時器0的初始化(數(shù)碼管的動態(tài)掃描)
  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++)                                                                // 由于傳感器剛上電讀出的溫度不穩(wěn)定,因此先進行幾次溫度的讀取并丟棄
  305.         {
  306.                 DS18B20_ReadTemp();
  307.                 DelayMs(120);
  308.         }
  309.         
  310.         while(1)
  311.         {
  312.                 EA=0;                                                                                                        // 屏蔽中斷
  313.                 temp=DS18B20_ReadTemp();                        // 讀取溫度值
  314.                 EA=1;                                                                                                        // 恢復(fù)中斷
  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黑下載附件…………
復(fù)制代碼

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

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:108622 發(fā)表于 2018-7-17 20:53 | 顯示全部樓層
這個下載試試好用不,論壇下載過2個都點有問題不完美
回復(fù)

使用道具 舉報

ID:108622 發(fā)表于 2018-7-19 15:46 | 顯示全部樓層
這個沒有記憶功能
回復(fù)

使用道具 舉報

ID:393819 發(fā)表于 2018-9-5 16:08 來自手機 | 顯示全部樓層
樓主有高清圖嗎,看清引腳就行
回復(fù)

使用道具 舉報

ID:369315 發(fā)表于 2018-9-6 11:12 | 顯示全部樓層
這個沒有記憶功能
回復(fù)

使用道具 舉報

ID:396811 發(fā)表于 2018-9-12 09:13 | 顯示全部樓層
非常不錯
回復(fù)

使用道具 舉報

ID:462745 發(fā)表于 2019-1-7 17:29 | 顯示全部樓層
不錯哦
回復(fù)

使用道具 舉報

ID:511662 發(fā)表于 2019-4-20 14:57 | 顯示全部樓層
請問仿真還在嗎,學習下,師兄
回復(fù)

使用道具 舉報

ID:511662 發(fā)表于 2019-4-20 15:20 | 顯示全部樓層
請問有仿真嗎,參考學習下
回復(fù)

使用道具 舉報

ID:753799 發(fā)表于 2020-5-18 10:23 | 顯示全部樓層

有仿真么,可以參考一下么
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 狠狠干狠狠操 | 午夜视频免费在线观看 | 婷婷综合久久 | 人人擦人人| 久久久久亚洲 | 成人免费三级电影 | 91在线观看免费视频 | 欧美男人天堂 | 无码一区二区三区视频 | 一区二区三区在线 | 在线免费观看黄网 | 中文无吗| 天天操夜夜骑 | 婷婷精品 | 污书屋 | 999免费观看视频 | 激情一区二区三区 | 免费成人国产 | 国产一区| 91av在线视频观看 | 欧美精品久久久 | 伊人久久免费 | 久久视频精品 | 久久久久亚洲精品 | 一级做a爰片性色毛片16美国 | 久草99 | 欧美日韩亚洲三区 | 亚洲网站在线观看 | 日日夜夜操天天干 | 欧洲亚洲一区 | 特一级毛片| 久久中文字幕在线 | 中文字幕亚洲一区 | av在线免费看网址 | 精品国产一区一区二区三亚瑟 | 成人免费大片黄在线播放 | 四季久久免费一区二区三区四区 | 久草在线免费资源 | 日韩中文字幕一区二区 | 一级片毛片 | 天天操天天摸天天爽 |