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

        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.

        返回頂部
        国产精品永久免费| 国产精品亚洲αv天堂无码| 精品无码一区二区三区爱欲九九| 国产精品久久精品| 大桥未久磁力迅雷链接中文字幕| 久久久久国产成人精品亚洲午夜| 尤物国产在线精品福利一区| 免费人妻精品一区二区三区| 亚洲精品一二区| 精品无人区无码乱码大片国产| 2023国产精品自拍| 久久精品国产亚洲精品| 亚洲日韩精品无码专区网站| 国产精品超碰12396| 欧美精品手机在线播放| A级精品国产片在线观看| 免费精品无码AV片在线观看| 就去吻亚洲精品国产欧美| 色欧美性video视频| 日本高清在线精品一区二区三区| 国产亚洲精品资源在线26u| 久久国产乱子伦免费精品| 欧美精品/日韩精品/国产精品 | 国产精品偷伦视频免费观看了| 久久这里有精品视频| 亚洲精品成人无限看| 亚洲国产婷婷综合在线精品| 精品无码三级在线观看视频| 一本一本久久a久久综合精品蜜桃| 国产精品91av| 四虎精品影库4HUTV四虎| 日韩精品国产自在欧美| 欧美精品欧美人与动人物牲交| 99久久免费只有精品国产| 91精品免费久久久久久久久| 最新国产在线精品观看| 精品在线免费观看| 国产精品视频网站你懂得| 蜜臀精品无码AV在线播放| 精品国产第一国产综合精品| 久久久久久青草大香综合精品|