找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4161|回復(fù): 2
收起左側(cè)

stc15w單片機(jī)ds18b20和tm1637溫度計(jì)源程序

  [復(fù)制鏈接]
ID:499469 發(fā)表于 2019-12-21 16:50 | 顯示全部樓層 |閱讀模式
單片機(jī)stc15w通用溫度探頭ds18b20  接P3^6
顯示屏tm1637  4位數(shù)碼管SCL=P3^1;SDA=P3^0;
晶振11.0592
實(shí)測正常 負(fù)溫度和100度以上顯示特殊
當(dāng)溫度大于100度是:        第一位十位   第二位 個(gè)位  第三位十分位   第四位顯示A
當(dāng)溫度大于0小于100度時(shí):第一位十位   第二位 個(gè)位  第三位十分位   第四位百分位
當(dāng)溫度小于0:                  第一位十位   第二位 個(gè)位  第三位十分位   第四位顯示-

實(shí)測工作電流0.018A 電壓5v  
準(zhǔn)備再做一個(gè)無線串口通信的溫度計(jì) 有興趣的留言

制作出來的實(shí)物圖如下:
51hei圖片_20191221164549.jpg 51hei圖片_20191221164558.jpg
單片機(jī)源程序如下:
  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字節(jié),比如:-123.4567/0
  7. unsigned char zf;
  8. //****************溫度數(shù)據(jù)處理函數(shù)************************/
  9. void gettemp()                           //讀取溫度值
  10. {                     
  11.          unsigned int temp0,temp;      // 存放小數(shù)、整數(shù)、符號(hào),10000倍小數(shù)值
  12.          temp=DS18B20_ReadTemperature();         // 從18B20中讀取2字節(jié)原始溫度值
  13.           
  14.          if ((temp&0xf800)!=0)                   // 如果是負(fù)溫,將補(bǔ)碼取反加1變?yōu)樵a
  15.          {
  16.                  temp=~temp        +1;
  17.                  zf=1;                 //負(fù)值
  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(); //調(diào)用開始信號(hào)
  37.     WriteByte(0x44);//寫命令40H(數(shù)據(jù)設(shè)置)
  38.     stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令

  39.         switch(zf)
  40.         {
  41.                 case 0:    //正值
  42.                              if (str[1]==0)
  43.                                          {
  44.                                          write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示十位
  45.                        write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二個(gè)數(shù)碼管 個(gè)位
  46.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管  小數(shù)1位
  47.            write_LEDSROM(0xC3,xsbcdbuf[str[5]]);//第四個(gè)數(shù)碼管  小數(shù)2位
  48.                                    }
  49.                                          else
  50.                                          {
  51.                                          write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示十位
  52.                        write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二個(gè)數(shù)碼管 個(gè)位
  53.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管  小數(shù)1位
  54.            write_LEDSROM(0xC3,xsbcdbuf[11]);//第四個(gè)數(shù)碼管 顯示 A               
  55.                                          }
  56.                                                  break;
  57.                 case 1:   //負(fù)值
  58.                              write_LEDSROM(0xC0,xsbcdbuf[str[2]]); //第一個(gè)數(shù)碼管顯示 十位
  59.                                    write_LEDSROM(0xC1,xsbcdbuf[str[3]]|0x80);  //第二個(gè)數(shù)碼管  個(gè)位
  60.            write_LEDSROM(0xC2,xsbcdbuf[str[4]]); //第三個(gè)數(shù)碼管  小數(shù)1位       
  61.            write_LEDSROM(0xC3,0x40);//第四個(gè)數(shù)碼管  -
  62.                                          break;       
  63.         }
  64.    
  65.     IIC_delay();
  66.     start_IIC(); //調(diào)用開始信號(hào)
  67.     WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據(jù)低三位調(diào)節(jié)。//顯示亮度
  68.     stop_IIC(); //調(diào)用結(jié)束信號(hào),一個(gè)字節(jié)命令發(fā)送完畢,可以發(fā)送下一個(gè)命令
  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口設(shè)為準(zhǔn)雙向弱上拉方式。
  79.         DS18B20_SetResolution(3);     // 設(shè)置DS18B20的分辨率為12位(默認(rèn)值,新器件可以不作任何設(shè)置)
  80.         while(1)
  81.         {               
  82.                 gettemp();
  83.                 xsled();
  84.                 delay60us();
  85.         }
  86. }
復(fù)制代碼

所有資料51hei提供下載:
TM1637&18b20測溫.zip (74.03 KB, 下載次數(shù): 200)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:995171 發(fā)表于 2021-12-25 19:34 | 顯示全部樓層
兄弟,我手上有個(gè)TM1650的模塊,數(shù)碼管是共陰的,用你這程序的話要怎么改?
回復(fù)

使用道具 舉報(bào)

ID:408809 發(fā)表于 2022-11-17 14:35 | 顯示全部樓層
哈哈......咋們用的同一款手機(jī)
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表