找回密碼
         注冊會員
        搜索附件  

        DS18B20.rar

         

        我的DS18B20溫度總是顯示不正確,大家幫忙看看吧:
        我用的下面的程序,附件是打包的整個工程文件夾,有EE21開發板的朋友可以直接下載看看效果,我在屋子里穿著羽絨服,測出的溫度有19.5度,還請大家幫忙看看是哪里出了問題

        復制代碼
        1. #include"reg51.h"
        2. #define uchar unsigned char
        3. #define uint unsigned int
        4. sbit ds=P1^3;//DS18B20
        5. sbit dx=P1^4;//段選
        6. sbit wx=P1^5;//位選
        7. sbit led_cs=P1^6;//LED片選
        8. sbit lcd_en=P3^4;
        9. sbit lcd_rs=P3^5;
        10. uint temp;//整型的溫度數據
        11. float f_temp;//浮點型的溫度數據
        12. unsigned char code table[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
        13. 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//帶小數的段碼表
        14. unsigned char code table1[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
        15. 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};//不帶小數的段碼表
        16. void delay(uint z)//延時函數
        17. {
        18. uint x,y;
        19. for(x=z;x>0;x--)
        20. for(y=113;y>0;y--);
        21. }
        22. void dsreset(void)//DS18B20復位,初始化函數
        23. {
        24. uint i;
        25. ds=0;
        26. i=103;
        27. while(i>0)i--;
        28. ds=1;
        29. i=4;
        30. while(i>0)i--;
        31. }
        32. bit tempreadbit(void)//讀1位數據函數
        33. {
        34. uint i;
        35. bit dat;
        36. ds=0;i++;//i++ 起延時作用
        37. ds=1;i++;i++;
        38. dat=ds;
        39. i=8;while(i>0)i--;
        40. return (dat);
        41. }
        42. uchar tempread(void)//讀1個字節數據函數
        43. {
        44. uchar i,j,dat;
        45. dat=0;
        46. for(i=1;i<=8;i++)
        47. {
        48. j=tempreadbit();
        49. dat=(j<<7)|(dat>>1);//讀出的數據最低位在最前面,這樣剛好一個字節在DAT里
        50. }
        51. return(dat);
        52. }
        53. void tempwritebyte(uchar dat)//向18B20寫一個字節數據函數
        54. {
        55. uint i;
        56. uchar j;
        57. bit testb;
        58. for(j=1;j<=8;j++)
        59. {
        60. testb=dat&0x01;
        61. dat=dat>>1;
        62. if(testb)//寫1
        63. {
        64. ds=0;
        65. i++;i++;
        66. ds=1;
        67. i=8;while(i>0)i--;
        68. }
        69. else
        70. {
        71. ds=0;//寫0
        72. i=8;while(i>0)i--;
        73. ds=1;
        74. i++;i++;
        75. }
        76. }
        77. }
        78. void tempchange(void)//DS18B20開始獲取溫度并轉換
        79. {
        80. dsreset();
        81. delay(1);
        82. tempwritebyte(0xcc);// 寫跳過讀ROM指令
        83. tempwritebyte(0x44);// 寫溫度轉換指令
        84. }
        85. uint get_temp()//讀取寄存器中存儲的溫度數據
        86. {
        87. uchar a,b;
        88. dsreset();
        89. delay(1);
        90. tempwritebyte(0xcc);
        91. tempwritebyte(0xbe);
        92. a=tempread();//讀低8位
        93. b=tempread();//讀高8位
        94. temp=b;
        95. temp<<=8;//兩個字節組合為1個字
        96. temp=temp|a;
        97. f_temp=temp*0.0625;//溫度在寄存器中為12位 分辨率位0.0625°
        98. temp=f_temp*10+0.5;//乘以10表示小數點后面只取1位,加0.5是四舍五入
        99. f_temp=f_temp+0.05;
        100. return temp;//temp是整型
        101. }
        102. ////////////////////顯示程序//////////////////////////
        103. void display(uint t)
        104. {
        105. uchar A1,A2,A3;
        106. A1=t/100;
        107. A2=t%100/10;
        108. A3=t%100%10;
        109. P0=0X01; //選通第一位數碼管
        110. wx=1;
        111. wx=0;
        112. P0=table[A1];//顯示百位
        113. dx=1;
        114. dx=0;
        115. delay(1);
        116. P0=0xff;//關位碼
        117. dx=1;
        118. dx=0;
        119. P0=0x02;//選通第二位數碼管
        120. wx=1;
        121. wx=0;
        122. P0=table1[A2];//顯示十位
        123. dx=1;
        124. dx=0;
        125. delay(1);
        126. P0=0xff;//關位碼
        127. dx=1;
        128. dx=0;
        129. P0=0x04;//選通第三位數碼管
        130. wx=1;
        131. wx=0;
        132. P0=table[A3];//顯示個位
        133. dx=1;
        134. dx=0;
        135. delay(1);
        136. P0=0xff;//關位碼
        137. dx=1;
        138. dx=0;
        139. }
        140. void main()//主函數
        141. {
        142. led_cs=0;
        143. lcd_en=0;
        144. lcd_rs=0;
        145. delay(1); // 延時1ms
        146. tempchange(); // 啟動溫度轉換,需要750ms
        147. delay(500); // 延時1s
        148. get_temp(); // 讀取溫度
        149. while(1)
        150. {
        151. tempchange();
        152. display(get_temp());
        153. }
        154. }
        復制代碼


        QQ|手機版|MCU資訊論壇 ( 京ICP備18035221號-2 )|網站地圖

        GMT+8, 2025-5-2 20:26 , Processed in 0.040238 second(s), 8 queries , Redis On.

        Powered by Discuz! X3.5

        © 2001-2025 Discuz! Team.

        返回頂部
        国产精品无码A∨精品影院| 国产欧美精品一区二区三区| 亚洲动漫精品无码av天堂| 亚洲欧美国产精品专区久久| 亚洲А∨精品天堂在线| 欧美性精品hd在线观看| 日韩国产精品无码一区二区三区| 国产成人精品一区二区三区免费| 精品久久久久久久| 精品国产高清在线拍| 最新国产在线精品观看| 乱色精品无码一区二区国产盗| 99久久精品日本一区二区免费| 国产成人精品一区二区秒拍| 欧美精品亚洲精品日韩专区va| 国产欧美精品一区二区色综合| 永久无码精品三区在线4| 骚片AV蜜桃精品一区| 国产午夜精品理论片久久影视| 国模和精品嫩模私拍视频| 丝袜美腿精品一区二区三| 精品久久久久久久无码| 亚洲精品欧美综合在线| 欧美日韩综合精品| 久久亚洲精品成人av无码网站| 欧美精品国产一区二区| 日本国产精品久久| 亚洲AV永久纯肉无码精品动漫| 国产精品嫩草视频永久网址| 精品成人av一区二区三区| 美女扒开粉嫩的尿口| freesexvideos精品老师毛多| 国产精品无码久久综合网| 日本精品高清一区二区不卡| 精品人妻无码一区二区色欲产成人| 99R在线精品视频在线播放| 欲帝精品福利视频导航| 国产精品无码专区| 国产精品自产拍高潮在线观看| 中文精品久久久久人妻不卡 | 欧美精品福利视频|