找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2745|回复: 0
收起左侧

单片机单只18B20测温程序(使用Float处理数据)

[复制链接]
ID:110653 发表于 2016-3-29 01:11 | 显示全部楼层 |阅读模式


DS18B20是一种很常用的数字温度传感器,温度检测范围是-55~+125度,手册 说明在-10~+85度范围内检测误差为±0.5度,作者在自己的产品中随机抽样验证 了几只传感器,在-25度误差0.1度,+25度与+50度误差小于0.1度,可见这种传感 器实际精度是很高的,传感器引脚如图19-1所示,工作电压范围是3.0~5.5V,通 常使用+5V,电源接反或接错一般是不会损坏传感器的,对于单只DS18B20的使用,我们按图19-2连接即可。







电路和介绍详见:http://www.51hei.com/bbs/dpj-47286-1.html(在这贴附件中可下载完整的源码压缩包)
主程序如下(部分预览):
  1. /****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
  2. ★★★★★★★★★★★★★★★★★★★★★★★★
  3. 《51单片机轻松入门-基于STC15W4K系列》 一书已经由北航出版社正式出版发行。
  4.   作者亲手创作的与教材配套的51双核实验板(2个MCU)对程序下载、调试、仿真方便,不需要外部
  5.   仿真器与编程器,这种设计方式彻底解决了系统中多个最高优先级谁也不能让谁的中断竞争问题。
  6.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  7.         验证信息:STC15单片机
  8.   邮箱:xgliyouquan@126.com
  9.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  10. //单只DS18B20的温度检测,测温范围-55 —— +125度,1602液晶显示。
  11. #include "STC15W4K.H"
  12. #include <stdio.h>             // sprintf函数需用
  13. #include "DS18b20.h"
  14. #include "myfun.h"
  15. #include "LCD1602.h"
  16. bit flag;                      // flag=0表示正温,flag=1表示负温。
  17. unsigned char str[10];                   // 最长字符10字节,比如:-123.4567/0
  18.         
  19. //****************温度数据处理函数************************/
  20. void gettemp()                           // 读取温度值
  21. {                     
  22.         int temp;                           // 存放18B20中读出的2字节原始数据
  23.         float Temperature;                                         // 存放最终温度值
  24.         temp=DS18B20_ReadTemperature();         // 从18B20中读取2字节原始温度值
  25.         Temperature=temp*0.0625;
  26.         sprintf(str,"%0.6f",Temperature);         // 保留6位小数
  27. }
  28. void port_mode()            // 端口模式
  29. {
  30.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  31.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  32. }
  33. void main()
  34. {
  35.         unsigned char xPos,yPos;
  36.         unsigned char *s="Now temp is:";
  37.         port_mode();                      // 所有IO口设为准双向弱上拉方式。
  38.         xPos=0;                              // xPos表示水平右移字符数(0-15)
  39.         yPos=0;                              // yPos表示垂直下移字符数(0-1)
  40.         delay100ms();                 // 等待LCD1602上电时内部复位
  41.         LCD1602_Init();
  42.         WriteString(xPos,yPos,s);          // X坐标、Y坐标、字符串,屏幕左上角为坐标原点        
  43.         DS18B20_SetResolution(3);     // 设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)
  44.         while(1)
  45.         {
  46.                 gettemp();
  47.                 WriteString(0,1,str);
  48.                 SetCur(NoCur);                  //  有显示无光标
  49.         }
  50. }
复制代码

mufun.c文件:
  1. #include "myfun.h"
  2. #include "string.h"
  3. /****************《51单片机轻松入门-基于STC15W4K系列》配套例程 *************
  4. ★★★★★★★★★★★★★★★★★★★★★★★★
  5. 《51单片机轻松入门-基于STC15W4K系列》 一书已经由北航出版社正式出版发行。
  6.   作者亲手创作的与教材配套的51双核实验板(2个MCU)对程序下载、调试、仿真方便,不需要外部
  7.   仿真器与编程器,这种设计方式彻底解决了系统中多个最高优先级谁也不能让谁的中断竞争问题。
  8.   QQ群:STC51-STM32(3) :515624099 或 STC51-STM32(2):99794374。
  9.         验证信息:STC15单片机
  10.   邮箱:xgliyouquan@126.com
  11.   ★★★★★★★★★★★★★★★★★★★★★★★★*/

  12. void delay2us(void)               // 22.118400MHz
  13. {
  14.         unsigned char i,j,k;
  15.         for(i=1;i>0;i--)        // 注意后面没分号
  16.         for(j=1;j>0;j--)        // 注意后面没分号
  17.         for(k=5;k>0;k--);     
  18. }

  19. void delay4us(void)               // 22.118400MHz
  20. {
  21.         unsigned char i,j,k;
  22.         for(i=1;i>0;i--)        // 注意后面没分号
  23.         for(j=1;j>0;j--)        // 注意后面没分号
  24.         for(k=16;k>0;k--);     
  25. }

  26. void delay60us(void)            // 22.118400MHz
  27. {
  28.         unsigned char i,j,k;
  29.         for(i=1;i>0;i--)        // 注意后面没分号
  30.         for(j=5;j>0;j--)        // 注意后面没分号
  31.         for(k=64;k>0;k--);     
  32. }

  33. void delay75us(void)            // 22.118400MHz
  34. {
  35.         unsigned char i,j,k;
  36.         for(i=1;i>0;i--)        // 注意后面没分号
  37.         for(j=2;j>0;j--)        // 注意后面没分号
  38.         for(k=204;k>0;k--);     
  39. }
  40. void delay500us(void)            // 22.118400MHz
  41. {
  42.         unsigned char i,j,k;
  43.         for(i=1;i>0;i--)        // 注意后面没分号
  44.         for(j=11;j>0;j--)       // 注意后面没分号
  45.         for(k=249;k>0;k--);     
  46. }
  47. void delay720us(void)           // 22.118400MHz
  48. {
  49.         unsigned char i,j,k;
  50.         for(i=1;i>0;i--)        // 注意后面没分号
  51.         for(j=16;j>0;j--)       // 注意后面没分号
  52.         for(k=247;k>0;k--);     
  53. }
  54. void delay100ms(void)            // 22.1184MHz
  55. {
  56.         unsigned char i,j,k;
  57.         for(i=19;i>0;i--)              // 注意后面没分号
  58.         for(j=223;j>0;j--)      // 注意后面没分号
  59.         for(k=129;k>0;k--);   
  60. }

  61. void delay760ms(void)
  62. {
  63.         unsigned char i,j,k;
  64.         for(i=65;i>0;i--)      // 注意后面没分号
  65.         for(j=252;j>0;j--)     // 注意后面没分号
  66.         for(k=255;k>0;k--);   
  67. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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