找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3286|回复: 2
收起左侧

stc15w单片机ds18b20和tm1637温度计源程序

  [复制链接]
ID:499469 发表于 2019-12-21 16:50 | 显示全部楼层 |阅读模式
单片机stc15w通用温度探头ds18b20  接P3^6
显示屏tm1637  4位数码管SCL=P3^1;SDA=P3^0;
晶振11.0592
实测正常 负温度和100度以上显示特殊
当温度大于100度是:        第一位十位   第二位 个位  第三位十分位   第四位显示A
当温度大于0小于100度时:第一位十位   第二位 个位  第三位十分位   第四位百分位
当温度小于0:                  第一位十位   第二位 个位  第三位十分位   第四位显示-

实测工作电流0.018A 电压5v  
准备再做一个无线串口通信的温度计 有兴趣的留言

制作出来的实物图如下:
51hei图片_20191221164549.jpg 51hei图片_20191221164558.jpg
单片机源程序如下:
  1. //单只DS18B20的温度检测,测温范围-55 —— +125度。
  2. #include "STC15W4K.H"
  3. #include "DS18b20.h"
  4. #include "myfun.h"
  5. #include "TM1637.h"
  6. unsigned char str[6];                   // 最长字符10字节,比如:-123.4567/0
  7. unsigned char zf;
  8. //****************温度数据处理函数************************/
  9. void gettemp()                           //读取温度值
  10. {                     
  11.          unsigned int temp0,temp;      // 存放小数、整数、符号,10000倍小数值
  12.          temp=DS18B20_ReadTemperature();         // 从18B20中读取2字节原始温度值
  13.           
  14.          if ((temp&0xf800)!=0)                   // 如果是负温,将补码取反加1变为原码
  15.          {
  16.                  temp=~temp        +1;
  17.                  zf=1;                 //负值
  18.      temp0=temp*0.0625*100+0.5;       
  19.                 }       
  20.          
  21.          else            //温度>0
  22.           {       
  23.                         zf=0;                 //正值
  24.                         temp0=temp*0.0625*100+0.5;
  25.                 }
  26.                  str[1]=temp0 / 10000;
  27.                 str[2]=temp0 % 10000 / 1000;
  28.                 str[3]=temp0 % 1000 / 100;
  29.                 str[4]=temp0 % 100 / 10;
  30.                 str[5]=temp0 % 10;               
  31. }
  32. void xsled(void)   //送显示
  33. {
  34.     SDA=1;
  35.     SCL=1;
  36.     start_IIC(); //调用开始信号
  37.     WriteByte(0x44);//写命令40H(数据设置)
  38.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令

  39.         switch(zf)
  40.         {
  41.                 case 0:    //正值
  42.                              if (str[1]==0)
  43.                                          {
  44.                                          write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
  45.                        write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管 个位
  46.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位
  47.            write_LEDSROM(0xC3,xsbcdbuf[str[5]]);//第四个数码管  小数2位
  48.                                    }
  49.                                          else
  50.                                          {
  51.                                          write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示十位
  52.                        write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管 个位
  53.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位
  54.            write_LEDSROM(0xC3,xsbcdbuf[11]);//第四个数码管 显示 A               
  55.                                          }
  56.                                                  break;
  57.                 case 1:   //负值
  58.                              write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一个数码管显示 十位
  59.                                    write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二个数码管  个位
  60.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三个数码管  小数1位       
  61.            write_LEDSROM(0xC3,0x40);//第四个数码管  -
  62.                                          break;       
  63.         }
  64.    
  65.     IIC_delay();
  66.     start_IIC(); //调用开始信号
  67.     WriteByte(0x8a); //送开屏命令,(8BH),亮度可以根据低三位调节。//显示亮度
  68.     stop_IIC(); //调用结束信号,一个字节命令发送完毕,可以发送下一个命令
  69. }
  70. void port_mode()            // 端口模式
  71. {
  72.         P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00;
  73.         P4M1=0x00; P4M0=0x00;P5M1=0x00; P5M0=0x00;P6M1=0x00; P6M0=0x00;P7M1=0x00; P7M0=0x00;
  74. }
  75. void main()
  76. {
  77.         unsigned char *s="Now temp is:";
  78.         port_mode();                      // 所有IO口设为准双向弱上拉方式。
  79.         DS18B20_SetResolution(3);     // 设置DS18B20的分辨率为12位(默认值,新器件可以不作任何设置)
  80.         while(1)
  81.         {               
  82.                 gettemp();
  83.                 xsled();
  84.                 delay60us();
  85.         }
  86. }
复制代码

所有资料51hei提供下载:
TM1637&18b20测温.zip (74.03 KB, 下载次数: 197)

评分

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

查看全部评分

回复

使用道具 举报

ID:995171 发表于 2021-12-25 19:34 | 显示全部楼层
兄弟,我手上有个TM1650的模块,数码管是共阴的,用你这程序的话要怎么改?
回复

使用道具 举报

ID:408809 发表于 2022-11-17 14:35 | 显示全部楼层
哈哈......咋们用的同一款手机
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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