找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2855|回复: 1
打印 上一主题 下一主题
收起左侧

基于单片机的DS18B20液晶显示的温度测温

[复制链接]
跳转到指定楼层
楼主
包括proteus仿真和程序


资料下载:
LCD1602温度测量.rar (71.36 KB, 下载次数: 69)

程序源码:
  1. /*******************************************
  2. 程序功能:利用单线制DS18B20温度传感器
  3.           LED数码管显示当前的温度值
  4. ********************************************/
  5. #include <reg51.h>                 //DS18B20温度传感器程序
  6. #include "LCD1602.h"
  7. #include "stdio.h"


  8. sbit DQ=P3^6; //数据传输线接单片机的相应的引脚
  9. unsigned char tempL=0; //设全局变量
  10. unsigned char tempH=0;

  11. unsigned int sdata =0;
  12. unsigned long value;
  13.   float m ;
  14. float temper=0;
  15. bit  fg=1;        //温度正负标志

  16. //******************延时子程序 *******************************

  17. //这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时

  18. //************************************************************
  19. void delay(unsigned char i)
  20. {
  21. for(i;i>0;i--);
  22. }


  23. //***********************************************************

  24. //                     延时子程序

  25. //************************************************************
  26. void Delay1ms(unsigned int count)
  27. {
  28.         unsigned int i,j;
  29.         for(i=0;i<count;i++)
  30.         for(j=0;j<120;j++);
  31. }




  32. //*****************************初始化程序 *********************************//

  33. Init_DS18B20(void)
  34. {
  35. unsigned char x=0;
  36. DQ=1; //DQ先置高
  37. delay(8); //稍延时
  38. DQ=0; //发送复位脉冲
  39. delay(80); //延时(>480us)
  40. DQ=1; //拉高数据线
  41. delay(5); //等待(15~60us)
  42. x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1
  43. delay(20);
  44. }


  45. //**********读一个字节************//

  46. ReadOneChar(void)  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
  47. {
  48. unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
  49. unsigned char dat=0;
  50. for (i=8;i>0;i--) //一个字节有8位
  51. {
  52. DQ=1;
  53. delay(1);
  54. DQ=0;
  55. dat>>=1;
  56. DQ=1;
  57. if(DQ)
  58. dat|=0x80;
  59. delay(4);
  60. }
  61. return(dat);
  62. }



  63. //*********************** **写一个字节**************************//

  64. WriteOneChar(unsigned char dat)
  65. {
  66.   unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,
  67.   for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。
  68.   {
  69.    DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。
  70.    DQ=dat&0x01;
  71.    delay(5);
  72.    DQ=1;
  73.    dat>>=1;
  74.   }
  75.   delay(4);
  76. }


  77. //读温度值(低位放tempL;高位放tempH;)
  78. ReadTemperature(void)
  79. {
  80. Init_DS18B20(); //初始化
  81. WriteOneChar(0xcc); //跳过读序列号的操作
  82. WriteOneChar(0x44); //启动温度转换
  83. delay(125); //转换需要一点时间,延时
  84. Init_DS18B20(); //初始化
  85. WriteOneChar(0xcc); //跳过读序列号的操作
  86. WriteOneChar(0xbe); //读温度寄存器(头两个值分别为温度的低位和高位)
  87. tempL=ReadOneChar(); //读出温度的低位LSB
  88. tempH=ReadOneChar(); //读出温度的高位MSB

  89.   if(tempH>0x7f)      //最高位为1时温度是负
  90.     {
  91.          tempL=~tempL;         //补码转换,取反加一
  92.         tempH=~tempH+1;      
  93.          fg=0;            //读取温度为负时fg=0
  94.     }
  95.   temper= ((tempH*256) +tempL)*0.0625;

  96. }






  97. //**************************** //主程序


  98. main()
  99. {
  100.    unsigned int value = 0;
  101.    unsigned char buffer[40];
  102.   
  103.    while (1)
  104.     {
  105.       
  106.                 LCD_Initial();
  107.              GotoXY(0,0);
  108.              Print("  temperature");
  109.        
  110.              while(1)
  111.               {  
  112.                    ReadTemperature() ;
  113.                    GotoXY(3,1);  
  114.                     if (fg==1)
  115.                         {
  116.                       sprintf(buffer,"+%6.3f",temper);
  117.                       Print(buffer);
  118.                       Delay1ms(200);
  119.                          }

  120.                          if (fg==0)
  121.                         {
  122.                       sprintf(buffer,"-%6.3f",temper);
  123.                       Print(buffer);
  124.                       Delay1ms(200);
  125.                          }
  126.               }            
  127.         }
  128. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:301302 发表于 2018-4-3 09:54 | 只看该作者
感谢楼主的分享,DS18B20调好几天了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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