找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2887|回复: 1
收起左侧

基于DS18B20和51单片机的温度采集系统仿真和源码

[复制链接]
ID:338648 发表于 2018-5-26 13:08 | 显示全部楼层 |阅读模式
这是我最近做的一个项目。
用DS18B20单总线检测温度;
用STC89C51编程,
用4位数码管显示温度值;
亲测效果良好;
资料中有程序源代码,还有PROTEUS仿真。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #define  uchar unsigned char
  3. #define uint unsigned int
  4. uchar m,n,p;
  5. sbit DQ=P3^4;//定义DS18b20的管脚

  6. sbit L1=P3^0;//定义控制数码管的管脚
  7. sbit L2=P3^1;
  8. sbit L3=P3^2;
  9. sbit L4=P3^3;
  10. sbit LS=P3^6;
  11. unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
  12. 0x82,0xF8,0x80,0x90,0x7f,0xbf,0xa7};//0-9数字,后面为". - C"

  13. void Delay_DS18B20(int num)
  14. {
  15. while(num--) ;
  16. }

  17. void Init_DS18B20(void)
  18. {
  19. unsigned char x=0;
  20. DQ = 1; //DQ复位
  21. Delay_DS18B20(8); //稍做延时
  22. DQ = 0; //单片机将DQ拉低
  23. Delay_DS18B20(80); //精确延时,大于480us
  24. DQ = 1; //拉高总线
  25. Delay_DS18B20(14);
  26. x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  27. Delay_DS18B20(20);
  28. }

  29. unsigned char ReadOneChar(void)
  30. {
  31. unsigned char i=0;
  32. unsigned char dat = 0;
  33. for (i=8;i>0;i--)
  34. {
  35. DQ = 0; // 给脉冲信号
  36. dat>>=1;
  37. DQ = 1; // 给脉冲信号
  38. if(DQ)
  39. dat|=0x80;
  40. Delay_DS18B20(4);
  41. }
  42. return(dat);
  43. }

  44. void WriteOneChar(unsigned char dat)
  45. {
  46. unsigned char i=0;
  47. for (i=8; i>0; i--)
  48. {
  49. DQ = 0;
  50. DQ = dat&0x01;
  51. Delay_DS18B20(5);
  52. DQ = 1;
  53. dat>>=1;
  54. }
  55. }

  56. unsigned int ReadTemperature(void)
  57. {
  58. unsigned char a=0;
  59. unsigned char b=0;
  60. unsigned int t=0;
  61. float tt=0;
  62. Init_DS18B20();
  63. WriteOneChar(0xCC); //跳过读序号列号的操作
  64. WriteOneChar(0x44); //启动温度转换
  65. Init_DS18B20();
  66. WriteOneChar(0xCC); //跳过读序号列号的操作
  67. WriteOneChar(0xBE); //读取温度寄存器
  68. a=ReadOneChar(); //读低8位
  69. b=ReadOneChar(); //读高8位
  70. t=b;
  71. t<<=8;
  72. t=t|a;
  73. tt=t*0.0625;
  74. t= tt*10+0.5; //放大10倍输出并四舍五入
  75. return(t);
  76. }

  77. void display()//数码管扫描函数
  78. {
  79. P2=table[m];
  80. L1=1;//暂未1,如用三极管驱动要改为0
  81. Delay_DS18B20(250);
  82. L1=0;//后关闭显示

  83. P2=table[n];
  84. //P1=table[10];//第二位后显示中间点
  85. L2=1;
  86. Delay_DS18B20(250);
  87. L2=0;
  88. P2=table[10];
  89. L2=1;
  90. Delay_DS18B20(250);
  91. L2=0;

  92. P2=table[p];//小数部分
  93. L3=1;
  94. Delay_DS18B20(250);
  95. L3=0;

  96. P2=table[12];
  97. L4=1;
  98. Delay_DS18B20(250);
  99. L4=0;
  100. }
  101. /*主函数部分程序*/
  102. void main()//主函数
  103. {
  104. unsigned int j;
  105. while(1)
  106. {
  107. j=ReadTemperature();//读取温度
  108. m=j/100;//分离出十位
  109. n=(j%100)/10;//分离出个位
  110. p=j%10;//分离出小数位
  111. display();//扫描数码管
  112. }
  113. }
复制代码

所有资料51hei提供下载:
基于DS18B20和单片机的温度检测.zip (67.55 KB, 下载次数: 54)
回复

使用道具 举报

ID:337888 发表于 2018-5-31 15:28 | 显示全部楼层
仿真的怎么打开?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表