找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单只18B20测温程序带负温度(LCD1602写单字符方式)

[复制链接]
跳转到指定楼层
楼主


单片机源程序如下:
  1. //单只DS18B20的温度检测,测温范围-55 —— +125度,1602液晶显示。
  2. #include "STC15W4K.H"
  3. #include "DS18b20.h"
  4. #include "myfun.h"
  5. #include "LCD1602.h"
  6. bit flag;                              // flag=0表示正温,flag=1表示负温。
  7. unsigned char baiw,shiw,gew;           // 百位、十位、个位 ASCII码
  8. unsigned char point_1,point_2,point_3,point_4;    // 小数点后1、2、3、4位ASCII码
  9.         
  10. //****************温度数据处理函数************************/
  11. void gettemp()                           //读取温度值
  12. {                     
  13.          unsigned int temp0,temp1,temp;      // 存放小数、整数、符号,10000倍小数值
  14.          unsigned char temh,teml;                  // 存放原始高字节与低字节         
  15.          temp=DS18B20_ReadTemperature();         // 从18B20中读取2字节原始温度值
  16.          flag=0;
  17.          if ((temp&0xf800)!=0)                   // 如果是负温,将补码取反加1变为原码
  18.          {
  19.                  temp=~temp        +1;
  20.                  flag=1;
  21.          }        
  22.          temh=temp/256;                                   // 高字节(5位符号+3位数据)
  23.          teml=temp%256;                                   // 低字节(4位整数+4位小数)
  24.          
  25.          temp0=teml&0x0F;              // 4 位小数
  26.      temp1=(temh<<4)|(teml>>4);    // 8 位整数(最高一位符号0不用管)      
  27.      baiw=temp1/100+48;            // 百位ASCII码         
  28.      shiw=(temp1%100)/10+48;       // 十位 ASCII码
  29.      gew=(temp1%100)%10+48;            // 个位 ASCII码  
  30.      temp=temp0*625;               // 将结果中的小数乘以分辨温度0.0625
  31.                                                             // 扩大10000倍进行输出,不用浮点,同样可以保留4位小数精度
  32.          point_1=temp/1000+48;                   // 小数点后1位ASCII码
  33.          point_2=(temp%1000)/100+48;   // 小数点后2位ASCII码
  34.          point_3=(temp%100)/10+48;           // 小数点后3位ASCII码
  35.          point_4=temp%10+48;                   // 小数点后4位ASCII码
  36. }

  37. void port_mode()            // 端口模式
  38. {
  39.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  40.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  41. }

  42. void main()
  43. {
  44.         unsigned char xPos,yPos;
  45.         unsigned char *s="Now temp is:";
  46.         port_mode();                      // 所有IO口设为准双向弱上拉方式。
  47.         xPos=0;                              // xPos表示水平右移字符数(0-15)
  48.         yPos=0;                              // yPos表示垂直下移字符数(0-1)
  49.         delay100ms();                 // 等待LCD1602上电时内部复位
  50.         LCD1602_Init();
  51.         WriteString(xPos,yPos,s);          // X坐标、Y坐标、字符串,屏幕左上角为坐标原点        
  52.         DS18B20_SetResolution(3); //设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)
  53.         while(1)
  54.         {
  55.                 gettemp();
  56.                 if(flag)      // 负温度
  57.                 {
  58.                         WriteChar(0,1,'-');
  59.                 }
  60.                 if(!flag)     // 正温度
  61.                 {
  62.                         WriteChar(0,1,'+');
  63.                 }               
  64.                 WriteChar(1,1,baiw);
  65. ……………………

  66. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
单只18B20测温(1602写单字符方式).rar (57.38 KB, 下载次数: 11)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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