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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3448|回復: 0
收起左側

基于DS18B20的溫度傳感器設計 有程序詳細解釋

[復制鏈接]
ID:135253 發表于 2016-9-19 21:09 | 顯示全部樓層 |閱讀模式
基于DS18B20的溫度傳感器設計,有程序詳細解釋,適合初學者。

效果圖

效果圖


  1. /*******************************************************************
  2.                                                 基于DS18B20的溫度傳感器設計
  3.                                                 版本號:    V1.0;2016.9.19
  4.                                                 溫度傳感器:DS18B20
  5.                                                 顯示方式:   LCD1602
  6. ********************************************************************/
  7. #include<reg52.h>
  8. #include <intrins.h>
  9. #define uchar unsigned char
  10. #define uint unsigned int

  11. sbit DQ=P1^6;//ds18b20與單片機連接口
  12. sbit RS=P1^0;
  13. sbit RW=P1^1;
  14. sbit EN=P1^2;
  15. sbit BEEP = P1^7;

  16. uchar code str1[]={" Temperature is   "};
  17. uchar code str2[]={"     designer:    "};
  18. uchar code str3[]={"     xzf586"       };
  19. uchar data disdata[5];
  20. uchar p=0;
  21. uint tvalue;//溫度值
  22. uchar tflag;//溫度正負標志

  23. /*******************************************************************
  24.                                                 lcd1602程序
  25. 1:延時
  26. 2:讀數據(因為沒有忙檢測,本程序沒有)
  27. 3:忙檢測(本程序沒有)
  28. 4: 寫指令
  29. 5:寫數據
  30. 6: 初始化
  31. ********************************************************************/

  32. void delay1ms(uint ms)//延時1毫秒
  33. {
  34.         uint i,j;
  35.         for(i=0;i<ms;i++)
  36.         for(j=0;j<114;j++);
  37. }

  38. void wr_com(uchar com)//寫指令//
  39. {
  40.         delay1ms(1);
  41.         RS=0;
  42.         RW=0;
  43.         EN=0;
  44.         P0=com;
  45.         delay1ms(1);
  46.         EN=1;
  47.         delay1ms(1);
  48.         EN=0;
  49. }
  50. void wr_dat(uchar dat)//寫數據//
  51. {
  52.         delay1ms(1);
  53.         RS=1;
  54.         RW=0;
  55.         EN=0;
  56.         P0=dat;
  57.         delay1ms(1);
  58.         EN=1;
  59.         delay1ms(1);
  60.         EN=0;
  61. }
  62. void lcd_init()//初始化設置//
  63. {
  64.         wr_com(0x38);delay1ms(5);
  65.         wr_com(0x08);delay1ms(5);
  66.         wr_com(0x01);delay1ms(5);
  67.         wr_com(0x06);delay1ms(5);
  68.         wr_com(0x0c);delay1ms(5);
  69. }


  70. /***************************************************
  71.                                                 報警程序
  72. ****************************************************/
  73. void baojing(void)
  74. {
  75.       unsigned int j;
  76.           BEEP=0;
  77.       for (j = 49; j > 0; j--)//響30ms
  78.        {
  79.          BEEP = ~BEEP; //輸出頻率800Hz
  80.          delay1ms(10); //延時310us
  81.          }
  82.              BEEP=0;
  83.    }

  84. void display(uchar *p)//顯示//
  85. {
  86.         while(*p!='\0')
  87.         {
  88.                 wr_dat(*p);
  89.                 p++;
  90.                 delay1ms(1);
  91.         }
  92. }                                                                        
  93. void init_play()//初始化顯示
  94. {
  95.         lcd_init();
  96.         wr_com(0x80);
  97.         display(str2);
  98.         wr_com(0xc0);
  99.         display(str3);
  100.         delay1ms(3000);
  101.         lcd_init();
  102.         wr_com(0x80);
  103.         display(str1);
  104. }


  105. /*******************************************************************
  106.                                                 ds18b20程序
  107. 1:延時
  108. 2:復位
  109. 3:讀數據
  110. 4: 寫數據
  111. 5:讀取溫度值并轉換(正負)
  112. ********************************************************************/

  113. void delay_18B20(uint i)//延時1微秒
  114. {
  115.    while(i--);
  116. }

  117. void ds1820rst()/*ds1820復位*/
  118. {

  119.         DQ = 1;          //DQ復位
  120.         delay_18B20(4); //延時
  121.         DQ = 0;          //DQ拉低
  122.         delay_18B20(100); //精確延時大于480us
  123.         DQ = 1;          //拉高
  124.         delay_18B20(40);
  125. }

  126. uchar ds1820rd()/*讀數據*/
  127. {
  128.         uchar i=0;
  129.         uchar dat = 0;
  130.         for (i=8;i>0;i--)
  131.         {  
  132.                 DQ = 0; //給脈沖信號
  133.             dat>>=1;   //相當于0輸入最高位
  134.             DQ = 1; //給脈沖信號
  135.             if(DQ)
  136.             dat|=0x80; //  等價于dat=dat|0x80,dat和0x80做“或”的運算,意思是最高位置1,其它位保持不變,即1輸入最高位
  137.             delay_18B20(10);
  138.         }
  139.    return(dat);
  140. }

  141. void ds1820wr(uchar wdata)/*寫數據*/
  142. {
  143.         uchar i=0;
  144.         for (i=8; i>0; i--)
  145.         {
  146.                 DQ = 0;
  147.                 DQ = wdata&0x01; //前7位置0,最后一位保持不變,輸出
  148.                 delay_18B20(10);
  149.                 DQ = 1;
  150.                 wdata>>=1;                 //倒數第二位到最后一位,繼續上面過程,輸出
  151.         }
  152. }


  153. /*******************************************************************
  154.                                                 ds18b20溫度值規則
  155. 1:b=0000 0111 1101 0000=64+32+16+8+4+1=125度 最大
  156. 2:b=0000 0001 1101 0001=16+8+4+1+2^(-4)=29.0625度
  157. 3:b=0000 0000 0000 0000=0度
  158. 4: b=1111 1111 1111 1000轉換 前五位=1,說明負值,其絕對值為取反加1,即0000 0000 0111+1=0000 0000 1000=2^(-1)=0.5
  159. 5:b=1111 1100 1001 0000轉換 絕對值為取反加1,即0011 0110 1111+1=0011 0111 0000=-55 最小
  160. 6:15~11是符號位,都為1就是零下;都0就是零上,后10~0 這11位,是溫度的實際數據,這個數據乘0.0625就得到溫度了(正溫度算法)
  161. ********************************************************************/
  162. read_temp()/*讀取溫度值并轉換*/
  163. {
  164.         uint a,b;
  165.         ds1820rst();           //復位
  166.         ds1820wr(0xcc);//*跳過讀序列號*/
  167.         ds1820wr(0x44);//*啟動溫度轉換*/
  168.         ds1820rst();   
  169.         ds1820wr(0xcc);//*跳過讀序列號*/
  170.         ds1820wr(0xbe);//*讀取溫度*/
  171.         a=ds1820rd();  //第一次讀的低八位,例如125度,則 a=0000 0000 1101 0000
  172.         b=ds1820rd();  //第二次讀的高八位,例如125度,則 b=0000 0000 0000 0111
  173.         tvalue=b;                //下面三句是將這兩次讀的合起來
  174.         tvalue<<=8;                 //若是125,則tvalue<<=8,即tvalue=0000 0111 0000 0000
  175.         tvalue=tvalue|a; //tvalue|a=0000 0111 0000 0000 | 0000 0000 1101 0000=0000 0111 1101 0000
  176. if(tvalue<0x08ff)         //若tvalue是正的,則tvalue<0000 0111 1111 1111,前五位符號都是0
  177.                 tflag=0;
  178.         else
  179.         {
  180.                 tvalue=~tvalue+1;  //負值,取反加1
  181.                 tflag=1;
  182.         }                                                                                                         
  183.         tvalue=tvalue*(0.0625)*10;//溫度值擴大10倍,精確到1位小數,注意到負溫度已經轉換了,因此可以這樣算
  184.         return(tvalue);
  185. }
  186. /*******************************************************************/
  187. void ds1820disp()//溫度值顯示
  188. {
  189.         uchar flagdat;
  190.         disdata[0]=tvalue/1000+0x30;//百位數,0的ASCII碼是0x30,以此類推
  191.         disdata[1]=tvalue%1000/100+0x30;//十位數
  192.         disdata[2]=tvalue%100/10+0x30;//個位數
  193.         disdata[3]=tvalue%10+0x30;//小數位
  194.         if(tflag==0)
  195.                 //flagdat=0x20;//正溫度不顯示符號,空格的ASCII碼是0x20
  196.                 flagdat=0x2b;//正溫度顯示正號,正號的ASCII碼是0x2b
  197.         else
  198.         flagdat=0x2d;//負溫度顯示負號:-

  199.         if(disdata[0]==0x30)  //注意0的ASCII碼是0x30,空格的ASCII碼是0x20
  200.         {
  201.                 disdata[0]=0x20;//如果百位為0,不顯示
  202.                 if(disdata[1]==0x30)
  203.                 {
  204.                         disdata[1]=0x20;//如果百位為0,十位為0也不顯示
  205.                 }
  206.         }
  207.         wr_com(0xc0+4);         //LCD第二行,空4格
  208.         wr_dat(flagdat);//顯示符號位
  209.         wr_com(0xc1+4);
  210.         wr_dat(disdata[0]);//顯示百位
  211.         wr_com(0xc2+4);
  212.         wr_dat(disdata[1]);//顯示十位
  213.         wr_com(0xc3+4);
  214.         wr_dat(disdata[2]);//顯示個位
  215.         wr_com(0xc4+4);
  216.         wr_dat(0x2e);//顯示小數點
  217.         wr_com(0xc5+4);
  218.         wr_dat(disdata[3]);//顯示小數位
  219.         wr_com(0xc6+4);
  220.     wr_dat(0x43);           //C的ASCII碼是0x43
  221. }
  222. //********************主程序***********************************//
  223. void main()
  224. {         
  225.         BEEP=0;
  226.         init_play();//初始化顯示
  227.         while(1)
  228.         {         
  229.                 read_temp();//讀取溫度
  230.                 ds1820disp();//顯示
  231.                 if(read_temp()>950||read_temp()<860)         //報警溫度 86~95之間,因為前面乘以10
  232.                 {  
  233.                         baojing() ;
  234.                 }
  235.                 delay1ms(1)        ;
  236.         }
  237. }
復制代碼
0.png
0.png

基于DS18B20的溫度傳感器設計.rar

28.61 KB, 下載次數: 22, 下載積分: 黑幣 -5

程序

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一区二区三区四区五区六区 | 日韩欧美中文在线 | 日本在线播放一区二区 | 午夜a区 | 成人午夜精品 | 欧美亚洲另类丝袜综合网动图 | 毛片电影 | 久久丁香| 蜜桃av一区二区三区 | 欧美成人免费在线 | 精品久久久久久久久亚洲 | 国产精品亚洲一区二区三区在线观看 | 91原创视频 | 精品免费国产一区二区三区四区 | 精品久久一区 | 最新91在线 | 91av大全| 国产清纯白嫩初高生视频在线观看 | 欧美日韩黄色一级片 | 天天躁天天操 | 成人av网站在线观看 | 成人免费网视频 | 最新91在线 | 一区二区影院 | 热99视频 | 国产成人免费视频网站视频社区 | 国产日韩一区二区三区 | 久久91视频| 一区二区三区四区国产 | 一区二区免费看 | 美女视频一区二区 | 亚洲 欧美 另类 综合 偷拍 | 欧美精品第一区 | 国产精品精品久久久久久 | 丁香久久 | 黄网站免费在线 | 精品久久久久久久久久久 | 日韩精品无码一区二区三区 | 欧美毛片免费观看 | 91看片网 | 精品国产一区二区三区久久狼黑人 |