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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

高精度DS18B20溫控器的單片機程序源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:74868 發表于 2018-7-10 09:45 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
DS18B20.c:
  1. /******************************************************************
  2. 程序名稱:DS18B20溫度測量、報警系統
  3. 簡要說明:DS18B20溫度計,溫度測量范圍0~99.9攝氏度
  4.     可設置上限報警溫度、下限報警溫度
  5.     即高于上限值或者低于下限值時蜂鳴器報警
  6.     默認上限報警溫度為38℃、默認下限報警溫度為5℃
  7.     報警值可設置范圍:最低上限報警值等于當前下限報警值
  8.     最高下限報警值等于當前上限報警值
  9.     將下限報警值調為0時為關閉下限報警功能   
  10. 最后更新:09/04/16晚于寢室
  11. ******************************************************************/
  12. #include <AT89X52.h>
  13. #include "DS18B20.h"   
  14. #define uint unsigned int
  15. #define uchar unsigned char   //宏定義
  16. #define SET  P3_1    //定義調整鍵
  17. #define DEC  P3_2    //定義減少鍵
  18. #define ADD  P3_3    //定義增加鍵
  19. #define BEEP P3_7    //定義蜂鳴器
  20. bit shanshuo_st;    //閃爍間隔標志
  21. bit beep_st;     //蜂鳴器間隔標志
  22. sbit DIAN = P2^7;        //小數點
  23. uchar x=0;      //計數器
  24. signed char m;     //溫度值全局變量
  25. uchar n;      //溫度值全局變量
  26. uchar set_st=0;     //狀態標志
  27. signed char shangxian=38;  //上限報警溫度,默認值為38
  28. signed char xiaxian=5;   //下限報警溫度,默認值為5
  29. uchar code  LEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
  30. /*****延時子程序*****/
  31. void Delay(uint num)
  32. {
  33. while( --num );
  34. }
  35. /*****初始化定時器0*****/
  36. void InitTimer(void)
  37. {
  38.   TMOD=0x1;
  39.   TH0=0x3c;
  40.   TL0=0xb0;     //50ms(晶振12M)
  41. }
  42. /*****定時器0中斷服務程序*****/
  43. void timer0(void) interrupt 1
  44. {
  45. TH0=0x3c;
  46. TL0=0xb0;
  47. x++;
  48. }
  49. /*****外部中斷0服務程序*****/
  50. void int0(void) interrupt 0
  51. {

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



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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜精品久久久久久久久久久久久 | 国产成人短视频在线观看 | 超碰天天| 久草视频网站 | 视频在线一区 | 欧美综合在线观看 | 一级毛片在线播放 | 午夜伦理影院 | 免费成人在线网站 | 国产精品国产精品国产专区不卡 | 日本91av视频 | 亚洲欧美国产视频 | 亚洲高清在线 | 久久久久久久久久久91 | 91久久婷婷 | 欧美亚洲国产日韩 | 国产成人精品一区二区 | 精品国产乱码久久久久久丨区2区 | 免费在线黄色av | 中文字幕日韩在线 | 欧美一区二区在线看 | 一二三四在线视频观看社区 | 久久草在线视频 | 亚洲成人三级 | 欧美成人精品一区二区三区 | 岛国精品 | 99成人在线视频 | 男人天堂久久 | 中文字幕11页 | 亚洲一区二区在线视频 | 国产一级免费视频 | 中日av| 国产伦精品一区二区 | 欧美高清免费 | 日本中文字幕在线观看 | 免费一级网站 | 凹凸日日摸日日碰夜夜 | 精品九九在线 | 99爱在线观看 | 天天干天天玩天天操 | 欧美aaaaaaaa |