找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7759|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

C51單片機(jī)測(cè)溫芯片DS18B20.H頭文件驅(qū)動(dòng)程序下載

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:478150 發(fā)表于 2019-2-19 16:17 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
C51測(cè)溫芯片DS18B20驅(qū)動(dòng)程序,包含.C和.H文件,在自己的project里添加這兩個(gè)文件,并在main函數(shù)中調(diào)用“DS18B20_Read_Temperature()”函數(shù)即可獲得溫度(℃)數(shù)據(jù)!

DS18B20.H頭文件單片機(jī)源程序如下:
  1. #ifndef __DS18B20_H_
  2. #define __DS18B20_H_

  3. #include <STC15F2K60S2.H>                //STC15W單片機(jī)芯片硬件定義頭文件
  4. #include <stdio.h>                                   //單片機(jī)C語(yǔ)言頭文件
  5. #include <stdlib.h>                                  //單片機(jī)C語(yǔ)言頭文件
  6. #include <ctype.h>                                   //單片機(jī)C語(yǔ)言頭文件
  7. #include <string.h>                                  //單片機(jī)C語(yǔ)言頭文件
  8. #include <float.h>                                  //單片機(jī)C語(yǔ)言頭文件
  9. #include <absacc.h>                                  //單片機(jī)C語(yǔ)言頭文件
  10. #include <math.h>                                  //單片機(jī)C語(yǔ)言頭文件
  11. #include <intrins.h>                          //單片機(jī)C語(yǔ)言頭文件  



  12. //定義對(duì)應(yīng) < *.C > 程序中的常數(shù)(同時(shí)供其它C模塊調(diào)用)



  13. //以外部變量聲明對(duì)應(yīng) < *.C > 程序中全局變量(同時(shí)供其它C模塊調(diào)用)




  14. //以外部函數(shù)聲明對(duì)應(yīng)C程序中的函數(shù)(同時(shí)供其它C模塊調(diào)用)
  15. extern void Delay_15us(unsigned int N);
  16. extern unsigned char DS18B20_Init(void);
  17. extern unsigned char DS18B20_Read_Byte(void);
  18. extern void DS18B20_Write_Byte(unsigned char Write_Data);
  19. extern signed int DS18B20_Read_Temperature(void);



  20. #endif
復(fù)制代碼


  1. #include "DS18B20.H"

  2. sbit DS18B20_DQ=P1^5;


  3. void Delay_15us(unsigned int N);
  4. unsigned char DS18B20_Init(void);
  5. unsigned char DS18B20_Read_Byte(void);
  6. void DS18B20_Write_Byte(unsigned char Write_Data);
  7. signed int DS18B20_Read_Temperature(void);

  8. unsigned char T_Signed_Flag;//溫度符號(hào)標(biāo)志位:0為正溫度,1為負(fù)溫度。

  9. //STC15W56S4 @11.0592MHz 1T (由stc-isp-15xx-v6.85H生成)
  10. void Delay_15us(unsigned int N)
  11. {
  12.     unsigned char i;
  13.                 do
  14.     {
  15.             i = 39;
  16.             while (--i);
  17.     }while(--N);
  18. }

  19. //DS18B20初始化
  20. //返回1時(shí)DS18B20有響應(yīng),返回0時(shí)DS18B20無響應(yīng),
  21. unsigned char DS18B20_Init(void)
  22. {
  23.     unsigned char Temp_Count;
  24.     P6M0&=0xdf;
  25.           P6M1&=0xdf;
  26.           DS18B20_DQ=1;
  27.     DS18B20_DQ=0;
  28.     Delay_15us(48);//延時(shí)720μS。最小=480μS,最大=960μS   
  29.     DS18B20_DQ=1;     
  30.     Delay_15us(3);//延時(shí)45μS。最小=15,最大=60μS   

  31.     Delay_15us(3);//延時(shí)45μS。在45μS+45μS=90μS處檢測(cè)DS18B20響應(yīng)   
  32.     if (DS18B20_DQ==0)
  33.     {
  34.                         //DS18B20有響應(yīng)  
  35.         Temp_Count=200;
  36.         while (DS18B20_DQ==0)
  37.         {
  38.             Delay_15us(1);
  39.             Temp_Count--;
  40.             if (Temp_Count==0)
  41.                 return 0;               
  42.         }
  43.         return 1;
  44.     }
  45.     else
  46.     {
  47.         //DS18B20無響應(yīng)
  48.         return 0;
  49.     }

  50. }

  51. //主機(jī)從DS18B20讀一個(gè)字節(jié)
  52. unsigned char DS18B20_Read_Byte(void)
  53. {
  54.     unsigned char Read_Data,i;
  55.     Read_Data=0;
  56.     for(i=0;i<8;i++)
  57.     {
  58.         DS18B20_DQ=0;//主機(jī)拉低   
  59.         Read_Data>>=1;//移位(低位在前)并兼有延時(shí)1μS以上功能
  60.         DS18B20_DQ=1;//主機(jī)拉高(電阻上拉)
  61.         Delay_15us(1);//延時(shí)15μS
  62.         if (DS18B20_DQ==1)//主機(jī)讀數(shù)據(jù)
  63.         {
  64.             Read_Data|=0x80;//合成字節(jié)數(shù)據(jù)
  65.         }   
  66.         Delay_15us(8);//延時(shí)120μS
  67.            
  68.     }
  69.     return Read_Data;
  70. }

  71. //主機(jī)向DS18B20寫一個(gè)字節(jié)
  72. void DS18B20_Write_Byte(unsigned char Write_Data)
  73. {
  74.     unsigned char i;
  75.     for(i=0;i<8;i++)
  76.     {
  77.         DS18B20_DQ=0;   
  78.         _nop_();_nop_();_nop_();        
  79.         if ((Write_Data&0x01)==1)
  80.         {
  81.             DS18B20_DQ=1;         
  82.         }
  83.         Delay_15us(7);//延時(shí)105μS
  84.         DS18B20_DQ=1;         
  85.         Write_Data>>=1;//略微延時(shí)大于1μS
  86.     }
  87.     Delay_15us(7);//延時(shí)105μS
  88. }

  89. /*讀取溫度
  90. 1、在DS18B20測(cè)溫范圍內(nèi),以溫度擴(kuò)大10倍返回帶符號(hào)整形數(shù)。
  91.    例如返回+203時(shí):實(shí)際溫度為:+20.3℃
  92.          例如返回 -96時(shí):實(shí)際溫度為:- 9.6℃
  93. 2、當(dāng)DS18B20沒有接入或損壞時(shí)返回-3000


  94. */
  95. signed int DS18B20_Read_Temperature(void)
  96. {
  97.     unsigned int Temp_Value;         
  98.     signed int Temperature_Value;         
  99.     unsigned char DS18B20_Flag;
  100.                 float T_F_Value;         
  101.     unsigned char T_H_Byte,T_L_Byte;
  102.    
  103.     DS18B20_Flag=DS18B20_Init();                 //設(shè)備復(fù)位
  104.     if (DS18B20_Flag==0)                                                //判斷DS18B20是否有響應(yīng)
  105.                         return -3000;                                                                        //DS18B20無響應(yīng),返回-300
  106.                 DS18B20_Write_Byte(0xCC);                                //跳過ROM命令
  107.     DS18B20_Write_Byte(0x44);                                //啟動(dòng)轉(zhuǎn)換命令
  108.     Delay_15us(50000);//延時(shí)
  109.    
  110.     DS18B20_Flag=DS18B20_Init();                //設(shè)備復(fù)位
  111.     if (DS18B20_Flag==0)                                                //判斷DS18B20是否有響應(yīng)
  112.                         return -3000;                                                                        //DS18B20無響應(yīng),返回-300
  113.     DS18B20_Write_Byte(0xCC);                                //跳過ROM命令
  114.     DS18B20_Write_Byte(0xBE);                                //讀暫存存儲(chǔ)器命令
  115.     T_L_Byte = DS18B20_Read_Byte();        //讀溫度低字節(jié)
  116.     T_H_Byte = DS18B20_Read_Byte();        //讀溫度高字節(jié)
  117.                 if ((T_H_Byte&0xfc)!=0)                                  //判斷溫度符號(hào)
  118.     {
  119.         T_Signed_Flag=1;                                                //1為負(fù)溫度
  120.         Temp_Value=T_H_Byte;
  121.         Temp_Value=(Temp_Value<<8)+T_L_Byte;
  122.         Temp_Value=(~Temp_Value+1);//取反加1(負(fù)數(shù)的補(bǔ)碼即負(fù)數(shù)的數(shù)值)

  123.                                 T_F_Value=Temp_Value;                                //轉(zhuǎn)成浮點(diǎn)數(shù)(準(zhǔn)備乘小數(shù))
  124.         T_F_Value=T_F_Value*0.0625*10;//乘小數(shù)(1/16)并擴(kuò)大10倍
  125.         Temp_Value=T_F_Value;                                        //轉(zhuǎn)換成無符號(hào)整形(取整)                                
  126.                                 Temperature_Value=-Temp_Value;//轉(zhuǎn)換成有符號(hào)整形數(shù)(負(fù)數(shù))        

  127.                                 return Temperature_Value;
  128.     }
  129.     else
  130.     {
  131.                         T_Signed_Flag=0;//0為正溫度
  132.                         Temp_Value=T_H_Byte;              
  133.                         Temp_Value=((Temp_Value<<8)+T_L_Byte);
  134.                         
  135.                         T_F_Value=Temp_Value;                                        //轉(zhuǎn)成浮點(diǎn)數(shù)(準(zhǔn)備乘小數(shù))
  136.                         T_F_Value=T_F_Value*0.0625*10;//乘小數(shù)(1/16)并擴(kuò)大10倍
  137.                         Temp_Value=T_F_Value;                                //轉(zhuǎn)換成無符號(hào)整形(取整)

  138.                         Temperature_Value=Temp_Value;//轉(zhuǎn)換成有符號(hào)整形數(shù)(正數(shù))        

  139.                         return Temperature_Value;
  140.     }

  141. }
復(fù)制代碼

所有資料51hei提供下載:
DS18B20.rar (2.02 KB, 下載次數(shù): 72)


評(píng)分

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

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:434678 發(fā)表于 2019-2-20 10:07 | 只看該作者
        #include <STC15F2K60S2.H>  P6M1&=0xdf;           DS18B20_DQ=1;
回復(fù)

使用道具 舉報(bào)

板凳
ID:434678 發(fā)表于 2019-2-20 10:08 | 只看該作者
這個(gè)頭文件和這兩個(gè)端口是什么意思呀。89c51要怎么改才可以用呀。
回復(fù)

使用道具 舉報(bào)

地板
ID:478150 發(fā)表于 2019-2-27 22:54 | 只看該作者
小傻白甜 發(fā)表于 2019-2-20 10:08
這個(gè)頭文件和這兩個(gè)端口是什么意思呀。89c51要怎么改才可以用呀。

頭文件是STC15單片機(jī)用的,所以這個(gè)文件就沒有放進(jìn)壓縮包了,51不能用的話改成51單片機(jī)可用的頭文件即可。P6M1&=0xdf是初始化單片機(jī)IO口P6的,因?yàn)槲矣玫腜1口所以這句話沒用(....忘記刪掉了233)。在壓縮包里的.c文件里面第二行是sbit DS18B20_DQ=P1^5,即我用單片機(jī)P15口來連接DS18B20的DQ腳,通過單片機(jī)賦值1或0來控制測(cè)溫芯片工作。

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

5#
ID:478150 發(fā)表于 2019-2-27 23:03 | 只看該作者
小傻白甜 發(fā)表于 2019-2-20 10:08
這個(gè)頭文件和這兩個(gè)端口是什么意思呀。89c51要怎么改才可以用呀。

89c51使用的話,假設(shè)你接P15口,那么把P6M0和P6M1改成P1M0和P1M1【&=0xdf(1101 1111)是將P1口的第六位即P15口清零設(shè)置成準(zhǔn)雙向口】,并在main函數(shù)中調(diào)用“DS18B20_Read_Temperature()”函數(shù)即可獲得溫度(℃)數(shù)據(jù)。

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:1125990 發(fā)表于 2024-6-19 10:35 | 只看該作者
Hermeszzy 發(fā)表于 2019-2-27 22:54
頭文件是STC15單片機(jī)用的,所以這個(gè)文件就沒有放進(jìn)壓縮包了,51不能用的話改成51單片機(jī)可用的頭文件即可 ...

感謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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