分享

好热呀,没有温度计可不行,自己做个温度计18B20+2051单片机+数码管(小儿科)

 快乐读书法 2015-12-06
 本帖最后由 huxiao 于 2015-1-24 14:39 编辑

西安这鬼天气,这几天真的好热呀,估计也在30多度
这几天也没什么事情干,做个温度计吧,好坏不说知道有多热。
很简单得,18B20+AT89C2051+数码管
用洞洞板好了,电路不复杂。
这个是我每次用洞洞板前必须要做的工作,用cad先把走线布一下,这样焊起来就方便多了。
焊接完得正面是这个样子得:

显示数字的用前面三个数码管,最后一个反过来用,可以显示摄氏度符号。
背面的镀锡走线是这个垃圾效果:

上电测试温度显示:


最后把程序给大家,线路看着程序走,数码管是共阳的。
  1. #include<reg51.h>
  2. #define leddata P1
  3. sbit led0=P3^7;
  4. sbit led1=P3^0;
  5. sbit led2=P3^1;
  6. sbit DQ=P3^5;
  7. typedef unsigned char byte;
  8. byte i;
  9. unsigned char code tab2[]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};//小数部分显示数据
  10. unsigned char code tab1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};//LED段码表,根据自己硬件修改
  11.                            // 0,   1,   2,   3,   4,   5,    6,   7, 8,   9, off
  12. void delays(unsigned char k)
  13. {
  14. unsigned char i,j;
  15. for(i=0;i<k;i++)
  16. for(j=0;j<50;j++);
  17. }
  18. //*********** 18B20驱动 **************************
  19. void delay(unsigned char i)
  20. {
  21. while(--i);
  22. }
  23. //复位
  24. byte ow_reset(void)
  25. {
  26. byte presence;
  27. DQ=0;        //拉低总线
  28. delay(250);    // 保持 480us
  29. delay(250);
  30. DQ = 1;       // 释放总线
  31. delay(30);     // 等待回复
  32. presence = DQ; // 读取信号
  33. delay(250);    // 等待结束信号
  34. return(presence); // 返回   0:正常 1:不存在
  35. }   
  36. //从 1-wire 总线上读取一个字节
  37. byte read_byte(void)
  38. {
  39. byte i;
  40. byte value = 0;
  41. for (i=8;i>0;i--)
  42. {
  43.     value>>=1;
  44.     DQ = 0;
  45.     DQ = 1;
  46.     delay(2);
  47.     if(DQ)value|=0x80;
  48.     delay(6);
  49. }
  50. return(value);
  51. }
  52. //向 1-WIRE 总线上写一个字节
  53. void write_byte(char val)
  54. {
  55. byte i;
  56. for (i=8; i>0; i--) // 一次写一位
  57. { DQ=1;
  58.     DQ=0;
  59.     DQ = val&0x01;
  60.     delay(30);
  61.     DQ = 1;
  62.     val=val/2;
  63. }
  64. delay(70);
  65. }

  66. unsigned int Read_Temperature(void)
  67. {  
  68. union
  69. {
  70. unsigned char c[2];
  71. unsigned int x;
  72. }temp;
  73. temp.x=0x0000;
  74. i=ow_reset();
  75. if(!i)
  76. {
  77. write_byte(0xCC);    //Skip ROM
  78. write_byte(0xBE);    //Read Scratch Pad
  79. temp.c[1]=read_byte(); //Start read data
  80. temp.c[0]=read_byte(); //read two byte data from device
  81. ow_reset();        //reset
  82. write_byte(0xCC);    //Skip ROM
  83. write_byte(0x44);    //Start Conversion
  84. }
  85. return temp.x;
  86. }
  87. //***************************
  88. void main(void)
  89. {   unsigned int j;
  90. unsigned char p,q,n0,n1,n2;
  91. while(1)
  92. {
  93. j=Read_Temperature();
  94. q=(unsigned char)(j&0x000f);
  95. p=(unsigned char)(j>>4)-2;
  96. n0=p/10;
  97. n1=p%10;
  98. n2=tab2[q];
  99. led0=0;leddata=tab1[n0];delays(30);led0=1;
  100. led1=0;leddata=tab1[n1]&0x7f;delays(30);led1=1;
  101. led2=0;leddata=tab1[n2];delays(20);led2=1;
  102. }
  103. }
复制代码

超级简单吧,所以这个小儿科,给初学者一个参考,高手就不要给我拍砖了,不然我要被打死了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多