微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 硬件电路设计 > 电子元器件 > 关于18B20

关于18B20

时间:10-02 整理:3721RD 点击:

程序可以运行,用的数码管是串行YL-2  晶振11MHZ  但就是温度显示出来的数值不正确。
附上程序。求各位大神帮帮忙

  1. #include <AT89x51.H>
  2. #define uchar unsigned char
  3. uchar xsm=0;
  4. unsigned int tcount;
  5. static unsigned char second,minute;
  6. uchar code xsfseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xa7};
  7. uchar code xssegbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
  8. uchar xsdisbuf[8]={0,0,0,0,0,0,0,0};
  9. sbit DQ=P2^7; //数据传输线接单片机的相应的引脚
  10. uchar tempL=0; //临时变量低位(无符号字符变量)
  11. uchar tempH=0; //临时变量高位
  12. unsigned int tempa; //温度值(整型变量)

  13. void DS18_delay(int useconds)//延时函数
  14. {
  15. int s;
  16. for (s=0; s<useconds;s++);
  17. }
  18. void xssdata(void)
  19. {unsigned char xsb=0,xsc,xsnum;
  20. if(xsm!=8)
  21. {
  22. if(xsb==0)
  23. {
  24. xsb++;
  25. xsnum=xssegbit[xsm];
  26. for(xsc=0;xsc<8;xsc++)
  27. {P3_2=0;
  28. P3_3=xsnum&0x80;
  29. xsnum<<=1;
  30. P3_2=1;
  31. }
  32. }
  33. if(xsb==1)
  34. {
  35. xsb--;
  36. if(xsm==2)
  37. { xsnum=xsfseg[xsdisbuf[xsm]]-0x80;}
  38. else
  39. {xsnum=xsfseg[xsdisbuf[xsm]];}
  40. for(xsc=0;xsc<8;xsc++)
  41. { P3_2=0;
  42. P3_3=xsnum&0x80;
  43. xsnum<<=1;
  44. P3_2=1;
  45. }
  46. xsm++;
  47. }
  48. }
  49. if(xsm==8)
  50. {xsm=0;
  51. }
  52. }
  53. //数据传输//
  54. //延时0.1ms个单位//
  55. void delay (unsigned char xsh)
  56. { while(xsh--);
  57. }
  58. //延时0.1ms个单位//


  59. //数据输出//
  60. void xsout(void)
  61. {P3_4=0;
  62. delay(40);
  63. P3_4=1;
  64. }
  65. //数据输出//

  66. //按键控制//

  67. unsigned char Init_DS18B20(void)
  68. {
  69. unsigned char x=0;

  70. DQ=0; //发送复位脉冲
  71. DS18_delay(29); //延时(>480ms)
  72. DQ=1; //拉高数据线
  73. DS18_delay(3); //等待(15~60ms) 等待存在脉冲
  74. x=DQ; //获得存在信号(用于判断是否有器件)
  75. DS18_delay(25); // 等待时间隙结束
  76. return(x); //返回存在信号,0 = 器件存在, 1 = 无器件
  77. }
  78. ReadOneChar(void)//读一个字节
  79. {
  80. unsigned char i=0;
  81. unsigned char dat=0;
  82. for (i=8;i>0;i--)
  83. {
  84. DQ=1;
  85. DS18_delay(1);
  86. DQ=0;
  87. dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
  88. DQ=1;
  89. if(DQ)
  90. dat|=0x80;
  91. DS18_delay(4);
  92. }
  93. return(dat);
  94. }
  95. void WriteOneChar(unsigned char dat)//有参函数,功能是"写",而写的内容就是括号内的参数
  96. {
  97. unsigned char i=0;
  98. for(i=8;i>0;i--)
  99. {
  100. DQ=0;
  101. DQ=dat&0x01;
  102. DS18_delay(5);
  103. DQ=1;
  104. dat>>=1;//复合赋值运算,等效dat=dat>>1(dat=dat右移一位后的值)
  105. }
  106. delay(4);
  107. }
  108. unsigned int ReadTemperature(void)//返回读取的温度.
  109. {
  110. Init_DS18B20(); //初始化,调用初始化函数
  111. WriteOneChar(0xcc); //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号)
  112. WriteOneChar(0x44); //启动温度转换,调用写函数,写0x44指令码(启动温度转换)
  113. DS18_delay(125); //转换需要一点时间,延时
  114. Init_DS18B20(); //初始化,调用初始化函数
  115. WriteOneChar(0xcc); //跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号)
  116. WriteOneChar(0xbe); //调用写函数,写0xbe指令码,读温度寄存器(头两个值分别为温度的低位和高位)
  117. tempL=ReadOneChar(); //读出温度的低位LSB
  118. tempH=ReadOneChar(); //读出温度的高位MSB
  119. //tempa=tempL*0.625+0.5; //温度转换,扩大100返回
  120. // DS18_delay(20);
  121. tempH<<=8; //高八位右移8位
  122. tempH=tempH|tempL; //合并
  123. tempa=tempH*0.625+0.5; //得到真实温度
  124. //tempa=tempL+tempH;
  125. //t=b;
  126. //t<<=8;
  127. //t=t|a;
  128. //tt=t*0.0625; //将温度的高位与低位合并
  129. // t= tt*10+0.5; //对结果进行4舍5入
  130. return(tempa);//运算结果返回到函数
  131. }
  132. void xsbcon(void)
  133. {
  134. unsigned int temp;
  135. temp=ReadTemperature()>>1;
  136. xsdisbuf[0]=10;
  137. xsdisbuf[1]=(temp/100)%10;
  138. xsdisbuf[2]=(temp/10)%10;
  139. xsdisbuf[3]=temp%10;
  140. }

  141. void main()
  142. {
  143. TMOD=0x02;
  144. TH0=0x06;
  145. TL0=0x06;
  146. TR0=1;
  147. ET0=1;
  148. EA=1;
  149. xsbcon(); //温度送入缓冲区
  150. while(1)
  151. {
  152. if(second==1)
  153. {
  154. ET0=0;
  155. EA=0;
  156. xsbcon();
  157. second=0;
  158. ET0=1;
  159. EA=1;
  160. }
  161. xssdata(); //将缓冲区数据送去寄存器
  162. xsout();
  163. }
  164. }
  165. void t0(void) interrupt 1 using 0
  166. {
  167. tcount++;
  168. if(tcount==4000)
  169. {
  170. tcount=0;
  171. second++ ;
  172. }
  173. }

复制代码






自己解决了这个问题,要考虑使用芯片是18B20还是1820,一个是输出12位有效一个是9位有效。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top