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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 10249|回復(fù): 13
打印 上一主題 下一主題
收起左側(cè)

高精度溫控器

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
DIY高精度溫度控制器(AT89S51-AT89S52)

  溫度測(cè)量范圍0-99.9攝氏度,設(shè)置上限報(bào)警溫度、下限報(bào)警溫度,當(dāng)超出上下限時(shí)會(huì)報(bào)警,電源電壓VCC為5V,DS18B20也可以根據(jù)需要用屏蔽電纜引出來。K1為進(jìn)入/退出設(shè)置鍵;K2為增加鍵;K3為減少鍵,值得注意的是,要在K1K2K3并聯(lián)一個(gè)103到104PF的電容.

  1. DS18B20.c:
  2. /******************************************************************
  3. 程序名稱:DS18B20溫度測(cè)量、報(bào)警系統(tǒng)
  4. 簡(jiǎn)要說明:DS18B20溫度計(jì),溫度測(cè)量范圍0~99.9攝氏度
  5.     可設(shè)置上限報(bào)警溫度、下限報(bào)警溫度
  6.     即高于上限值或者低于下限值時(shí)蜂鳴器報(bào)警
  7.     默認(rèn)上限報(bào)警溫度為38℃、默認(rèn)下限報(bào)警溫度為5℃
  8.     報(bào)警值可設(shè)置范圍:最低上限報(bào)警值等于當(dāng)前下限報(bào)警值
  9.     最高下限報(bào)警值等于當(dāng)前上限報(bào)警值
  10.     將下限報(bào)警值調(diào)為0時(shí)為關(guān)閉下限報(bào)警功能   
  11. 編    寫:JiangX.net
  12. 最后更新:09/04/16晚于寢室
  13. ******************************************************************/
  14. #include <AT89X52.h>
  15. #include "DS18B20.h"   
  16. #define uint unsigned int
  17. #define uchar unsigned char   //宏定義
  18. #define SET  P3_1    //定義調(diào)整鍵
  19. #define DEC  P3_2    //定義減少鍵
  20. #define ADD  P3_3    //定義增加鍵
  21. #define BEEP P3_7    //定義蜂鳴器
  22. bit shanshuo_st;    //閃爍間隔標(biāo)志
  23. bit beep_st;     //蜂鳴器間隔標(biāo)志
  24. sbit DIAN = P2^7;        //小數(shù)點(diǎn)
  25. uchar x=0;      //計(jì)數(shù)器
  26. signed char m;     //溫度值全局變量
  27. uchar n;      //溫度值全局變量
  28. uchar set_st=0;     //狀態(tài)標(biāo)志
  29. signed char shangxian=38;  //上限報(bào)警溫度,默認(rèn)值為38
  30. signed char xiaxian=5;   //下限報(bào)警溫度,默認(rèn)值為5
  31. uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  32. /*****延時(shí)子程序*****/
  33. void Delay(uint num)
  34. {
  35. while( --num );
  36. }
  37. /*****初始化定時(shí)器0*****/
  38. void InitTimer(void)
  39. {
  40.   TMOD=0x1;
  41.   TH0=0x3c;
  42.   TL0=0xb0;     //50ms(晶振12M)
  43. }
  44. /*****定時(shí)器0中斷服務(wù)程序*****/
  45. void timer0(void) interrupt 1
  46. {
  47. TH0=0x3c;
  48. TL0=0xb0;
  49. x++;
  50. }
  51. /*****外部中斷0服務(wù)程序*****/
  52. void int0(void) interrupt 0
  53. {

  54. EX0=0;      //關(guān)外部中斷0
  55. if(DEC==0&&set_st==1)
  56. {
  57.   shangxian--;
  58.   if(shangxian<xiaxian)shangxian=xiaxian;
  59. }
  60. else if(DEC==0&&set_st==2)
  61. {
  62.   xiaxian--;
  63.   if(xiaxian<0)xiaxian=0;
  64. }
  65. }
  66. /*****外部中斷1服務(wù)程序*****/
  67. void int1(void) interrupt 2
  68. {
  69. EX1=0;      //關(guān)外部中斷1
  70. if(ADD==0&&set_st==1)
  71. {
  72.   shangxian++;
  73.   if(shangxian>99)shangxian=99;
  74. }
  75. else if(ADD==0&&set_st==2)
  76. {
  77.   xiaxian++;
  78.   if(xiaxian>shangxian)xiaxian=shangxian;
  79. }  
  80. }
  81. /*****讀取溫度*****/
  82. void check_wendu(void)
  83. {
  84. uint a,b,c;
  85. c=ReadTemperature()-5;  //獲取溫度值并減去DS18B20的溫漂誤差
  86. a=c/100;     //計(jì)算得到十位數(shù)字
  87. b=c/10-a*10;    //計(jì)算得到個(gè)位數(shù)字
  88. m=c/10;      //計(jì)算得到整數(shù)位
  89. n=c-a*100-b*10;    //計(jì)算得到小數(shù)位
  90. if(m<0){m=0;n=0;}   //設(shè)置溫度顯示上限
  91. if(m>99){m=99;n=9;}   //設(shè)置溫度顯示上限   
  92. }
  93. /*****顯示開機(jī)初始化等待畫面*****/
  94. Disp_init()   
  95. {
  96. P2 = 0xbf;      //顯示-
  97. P1 = 0xf7;
  98. Delay(200);
  99. P1 = 0xfb;
  100. Delay(200);   
  101. P1 = 0xfd;
  102. Delay(200);
  103. P1 = 0xfe;
  104. Delay(200);
  105. P1 = 0xff;         //關(guān)閉顯示
  106. }
  107. /*****顯示溫度子程序*****/
  108. Disp_Temperature()     //顯示溫度
  109. {
  110. P2 =0xc6;      //顯示C
  111. P1 = 0xf7;
  112. Delay(300);
  113. P2 =LEDData[n];    //顯示個(gè)位
  114. P1 = 0xfb;
  115. Delay(300);
  116. P2 =LEDData[m%10];    //顯示十位
  117. DIAN = 0;         //顯示小數(shù)點(diǎn)
  118. P1 = 0xfd;
  119. Delay(300);
  120. P2 =LEDData[m/10];    //顯示百位
  121. P1 = 0xfe;
  122. Delay(300);
  123. P1 = 0xff;         //關(guān)閉顯示
  124. }
  125. /*****顯示報(bào)警溫度子程序*****/
  126. Disp_alarm(uchar baojing)
  127. {
  128. P2 =0xc6;      //顯示C
  129. P1 = 0xf7;
  130. Delay(200);
  131. P2 =LEDData[baojing%10]; //顯示十位
  132. P1 = 0xfb;
  133. Delay(200);
  134. P2 =LEDData[baojing/10]; //顯示百位
  135. P1 = 0xfd;
  136. Delay(200);
  137. if(set_st==1)P2 =0x89;
  138. else if(set_st==2)P2 =0xc7; //上限H、下限L標(biāo)示
  139. P1 = 0xfe;
  140. Delay(200);
  141. P1 = 0xff;         //關(guān)閉顯示
  142. }
  143. /*****報(bào)警子程序*****/
  144. void Alarm()
  145. {
  146. if(x>=10){beep_st=~beep_st;x=0;}
  147. if((m>=shangxian&&beep_st==1)||(m<xiaxian&&beep_st==1))BEEP=0;
  148. else BEEP=1;
  149. }
  150. /*****主函數(shù)*****/
  151. void main(void)
  152. {
  153.     uint z;
  154. InitTimer();    //初始化定時(shí)器
  155. EA=1;      //全局中斷開關(guān)
  156. TR0=1;
  157. ET0=1;      //開啟定時(shí)器0
  158. IT0=1;        
  159. IT1=1;
  160. check_wendu();
  161. check_wendu();
  162. for(z=0;z<300;z++)
  163. {
  164.   Disp_init();        
  165.   }
  166. while(1)
  167.   {
  168.   if(SET==0)
  169.   {
  170.    Delay(2000);
  171.    do{}while(SET==0);
  172.    set_st++;x=0;shanshuo_st=1;
  173.    if(set_st>2)set_st=0;
  174.   }
  175.   if(set_st==0)
  176.   {
  177.    EX0=0;    //關(guān)閉外部中斷0
  178.    EX1=0;    //關(guān)閉外部中斷1
  179.     check_wendu();
  180.       Disp_Temperature();
  181.    Alarm();   //報(bào)警檢測(cè)
  182.   }
  183.   else if(set_st==1)
  184.   {
  185.    BEEP=1;    //關(guān)閉蜂鳴器
  186.    EX0=1;    //開啟外部中斷0
  187.    EX1=1;    //開啟外部中斷1
  188.    if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
  189.    if(shanshuo_st) {Disp_alarm(shangxian);}
  190.   }
  191.   else if(set_st==2)
  192.   {
  193.    BEEP=1;    //關(guān)閉蜂鳴器
  194.    EX0=1;    //開啟外部中斷0
  195.    EX1=1;    //開啟外部中斷1
  196.    if(x>=10){shanshuo_st=~shanshuo_st;x=0;}
  197.    if(shanshuo_st) {Disp_alarm(xiaxian);}
  198.   }
  199.     }
  200. }
  201. /*****END*****/
  202. DS18B20.h:
  203. #include <AT89X52.h>
  204. #define  DQ  P3_6     //定義DS18B20總線I/O
  205. /*****延時(shí)子程序*****/
  206. void Delay_DS18B20(int num)
  207. {
  208.   while(num--) ;
  209. }
  210. /*****初始化DS18B20*****/
  211. void Init_DS18B20(void)
  212. {
  213.   unsigned char x=0;
  214.   DQ = 1;         //DQ復(fù)位
  215.   Delay_DS18B20(8);    //稍做延時(shí)
  216.   DQ = 0;         //單片機(jī)將DQ拉低
  217.   Delay_DS18B20(80);   //精確延時(shí),大于480us
  218.   DQ = 1;         //拉高總線
  219.   Delay_DS18B20(14);
  220.   x = DQ;           //稍做延時(shí)后,如果x=0則初始化成功,x=1則初始化失敗
  221.   Delay_DS18B20(20);
  222. }
  223. /*****讀一個(gè)字節(jié)*****/
  224. unsigned char ReadOneChar(void)
  225. {
  226.   unsigned char i=0;
  227.   unsigned char dat = 0;
  228.   for (i=8;i>0;i--)
  229.   {
  230.     DQ = 0;     // 給脈沖信號(hào)
  231.     dat>>=1;
  232.     DQ = 1;     // 給脈沖信號(hào)
  233.     if(DQ)
  234.     dat|=0x80;
  235.     Delay_DS18B20(4);
  236.   }
  237.   return(dat);
  238. }
  239. /*****寫一個(gè)字節(jié)*****/
  240. void WriteOneChar(unsigned char dat)
  241. {
  242.   unsigned char i=0;
  243.   for (i=8; i>0; i--)
  244.   {
  245.     DQ = 0;
  246.     DQ = dat&0x01;
  247.     Delay_DS18B20(5);
  248.     DQ = 1;
  249.     dat>>=1;
  250.   }
  251. }
  252. /*****讀取溫度*****/
  253. unsigned int ReadTemperature(void)
  254. {
  255.   unsigned char a=0;
  256.   unsigned char b=0;
  257.   unsigned int t=0;
  258.   float tt=0;
  259.   Init_DS18B20();
  260.   WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  261.   WriteOneChar(0x44);  //啟動(dòng)溫度轉(zhuǎn)換
  262.   Init_DS18B20();
  263.   WriteOneChar(0xCC);  //跳過讀序號(hào)列號(hào)的操作
  264.   WriteOneChar(0xBE);  //讀取溫度寄存器
  265.   a=ReadOneChar();     //讀低8位
  266.   b=ReadOneChar();    //讀高8位
  267.   t=b;
  268.   t<<=8;
  269.   t=t|a;
  270.   tt=t*0.0625;
  271.   t= tt*10+0.5;     //放大10倍輸出并四舍五入
  272.   return(t);
  273. }
  274.   /*****END*****/
復(fù)制代碼







1K42462a-1.jpg (153.66 KB, 下載次數(shù): 253)

1K42462a-1.jpg

1K42424I-0.jpg (83.44 KB, 下載次數(shù): 281)

1K42424I-0.jpg

DS18B20.zip

2.55 KB, 下載次數(shù): 126, 下載積分: 黑幣 -5

源程序

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏10 分享淘帖 頂3 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:109908 發(fā)表于 2016-3-22 01:32 | 只看該作者
請(qǐng)問你的源程序去上哪里找的呢?我寫程序的功夫不好
回復(fù)

使用道具 舉報(bào)

板凳
ID:109908 發(fā)表于 2016-3-22 01:35 | 只看該作者
我現(xiàn)在要用單片機(jī)實(shí)現(xiàn)語音控制,熱釋電紅外檢測(cè),溫度檢測(cè),WiFi聯(lián)網(wǎng)等功能,但是不知道哪里能找到相關(guān)的源程序
回復(fù)

使用道具 舉報(bào)

地板
ID:109977 發(fā)表于 2016-3-22 13:33 | 只看該作者
圖片怎么發(fā)啊
回復(fù)

使用道具 舉報(bào)

5#
ID:108622 發(fā)表于 2016-4-7 18:58 | 只看該作者
為了弄溫度計(jì)試試
回復(fù)

使用道具 舉報(bào)

6#
ID:104838 發(fā)表于 2016-4-8 21:59 | 只看該作者
頂下,希望有用
回復(fù)

使用道具 舉報(bào)

7#
ID:124699 發(fā)表于 2016-11-29 16:35 | 只看該作者
為什么就有一個(gè)hex文件, 不放一整套的原程序和仿真上來
回復(fù)

使用道具 舉報(bào)

8#
ID:161033 發(fā)表于 2017-4-12 14:42 | 只看該作者
頂一下,要是有電路圖源文件就好了。
回復(fù)

使用道具 舉報(bào)

9#
ID:406847 發(fā)表于 2018-11-2 20:36 | 只看該作者
不錯(cuò),我親自試了,能用。
回復(fù)

使用道具 舉報(bào)

10#
ID:319688 發(fā)表于 2018-11-22 10:14 來自手機(jī) | 只看該作者
if(m<0){m=0;n=0;}   //設(shè)置溫度顯示上限
回復(fù)

使用道具 舉報(bào)

11#
ID:319688 發(fā)表于 2018-11-22 10:15 來自手機(jī) | 只看該作者
if(m<0){m=0;n=0;}   //設(shè)置溫度顯示上限        樓主,這里應(yīng)該是設(shè)置溫度下限
回復(fù)

使用道具 舉報(bào)

12#
ID:436591 發(fā)表于 2018-12-28 16:49 | 只看該作者
準(zhǔn)備著手做一個(gè)這個(gè)溫控器
回復(fù)

使用道具 舉報(bào)

13#
ID:387638 發(fā)表于 2019-1-19 23:44 | 只看該作者
一樓的碼源可以用的,復(fù)制的時(shí)候要分二部分復(fù)制,c源和ds18b20.h要分開復(fù)制,可順利編輯
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品国产精品国产专区不卡 | 国产免费观看久久黄av片涩av | 一区亚洲 | 妖精视频一区二区三区 | 欧美激情亚洲 | 国产成都精品91一区二区三 | 国产精品大片在线观看 | 亚洲色欲色欲www | 在线视频91| 日韩在线免费视频 | 久久久婷| 91精品国产综合久久婷婷香蕉 | 日本不卡高清视频 | 日韩aⅴ视频 | av毛片 | 欧美日韩中文在线 | 91精品国产91久久久久久 | 日韩插插 | 亚洲精品久久久一区二区三区 | 日本久久精品视频 | 一级黄色片美国 | 7777精品伊人久久精品影视 | 中文字幕一区在线观看视频 | av在线影院 | 婷婷久久精品一区二区 | 最新国产精品 | 国产成人免费视频 | 不卡视频在线 | 中文字幕在线播放第一页 | 人人做人人澡人人爽欧美 | 91久久国产综合久久 | 国家一级黄色片 | 午夜影院在线免费观看视频 | 在线看91 | 97久久久久久久久 | 国产a区 | 欧美激情综合网 | 日本特黄特色aaa大片免费 | 日韩三级在线 | 99热.com| 免费在线h视频 |