找回密码
 注册会员
搜索附件  

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-1-10 21:40 , Processed in 0.040324 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

返回顶部