找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS18B20.H文件下載

  [復(fù)制鏈接]
ID:70976 發(fā)表于 2014-12-25 20:45 | 顯示全部樓層 |閱讀模式
DS18B20.H文件是溫度傳感器的驅(qū)動 大家可以另存為到硬盤下載到電腦


  1. /*把我一直珍藏的程序全部拿出來,給大家共享,這也讓我想起來,我剛學(xué)的時候,搜集資料是那么辛苦,而且找不到完整的資料,我將把我整理的和自己制作的H文件共享出來,只要修改定義端口,便可以隨意的調(diào)用,以后我還會慢慢完善我的C資料,也希望大家給我指出程序的漏洞和缺點(diǎn),已達(dá)到相互學(xué)習(xí)目地。*/

  2. #ifndef __DS18B20_H__
  3. #define __DS18B20_H__

  4. #include<intrins.h>

  5. #define uch unsigned char //給unsigned char 起別名 uch

  6. sbit DQ=P2^3;///////////////定義一個數(shù)據(jù)端口

  7. unsigned char TLV_ds=0 ; ///采集到的溫度高8 位
  8. unsigned char THV_ds=0; ////采集到的溫度低8 位

  9. unsigned char bwei_ds; /////整數(shù)百位
  10. unsigned char shwei_ds; ////整數(shù)十位
  11. unsigned char gwei_ds; /////整數(shù)個位
  12. unsigned char shfen_ds; ////十分位
  13. unsigned char bfen_ds; /////百分位

  14. //------------------------------------------------
  15. //延時函數(shù)
  16. void delay_ds(uch x,uch y)   //誤差0,12M
  17. {
  18.     uch a,b;
  19. for(b=x;b>0;b--)
  20.         for(a=y;a>0;a--);
  21. }
  22. //-----------------------------------------------
  23. //復(fù)位DS18B20 函數(shù)
  24. void reset_ds(void)
  25. {
  26. char presence=1;
  27. while(presence)
  28. {
  29.   DQ=0; //////////////////主機(jī)拉至低電平
  30.   delay_ds(1,80); ///////延時大于480us

  31.   DQ=1; //////////////////釋放總線等電阻拉高總線,并保持15~60us
  32.   delay_ds(1,7); /////////延時20us
  33.                                    
  34.   if(DQ==1) presence=1; //沒有接收到應(yīng)答信號,繼續(xù)復(fù)位
  35.   else presence=0; ///////接收到應(yīng)答信號
  36.   delay_ds(1,64); ////////延時430us
  37. }
  38. }
  39. //-----------------------------------------------
  40. //寫18b20 寫字節(jié)函數(shù)
  41. void write_byte_ds(uch val_ds)
  42. {
  43. uch i;
  44. uch temp_ds;
  45. for(i=8;i>0;i--)
  46. {
  47.   temp_ds=val_ds&0x01; //最低位移出
  48.   DQ=0;
  49.   if(temp_ds==1) DQ=1; //如果寫1,拉高電平
  50.   delay_ds(1,11); ///////延時63us

  51.   DQ=1;
  52.   _nop_();
  53.   _nop_(); //////////////延時6us

  54.   val_ds=val_ds>>1; /////右移一位
  55. }
  56. }
  57. //------------------------------------------------
  58. //18b20 讀字節(jié)函數(shù)
  59. uch read_byte_ds(void)
  60. {
  61. uch i;
  62. uch value_ds=0; ///讀出溫度
  63. static bit j;//////靜態(tài)變量
  64. for(i=8;i>0;i--)
  65. {
  66.   DQ=0; /////////拉低給脈沖信號
  67.   value_ds>>=1;//右移并起到延時作用
  68.   DQ=1; /////////拉至高電平
  69.   _nop_();  /////延時6us等待響應(yīng)

  70.   j=DQ;
  71.   if(j) value_ds|=0x80;//寫入高電平
  72.   delay_ds(1,11); ///////延時63us
  73. }
  74. return(value_ds);
  75. }
  76. //-------------------------------------------------
  77. //啟動溫度轉(zhuǎn)換函數(shù)
  78. void get_temp_ds()
  79. {
  80. int i=10;
  81. int T_ds;
  82. float tt;

  83. DQ=1;
  84. reset_ds(); ///////////復(fù)位等待從機(jī)應(yīng)答
  85. write_byte_ds(0XCC); //忽略ROM 匹配
  86. write_byte_ds(0X44); //發(fā)送溫度轉(zhuǎn)化命令
  87. while(i--)
  88. {
  89.   delay_ds(50,100); //確保溫度轉(zhuǎn)換完成所需要的時間
  90. }
  91. reset_ds(); /////////////再次復(fù)位,等待從機(jī)應(yīng)答
  92. write_byte_ds(0XCC); ////忽略ROM 匹配
  93. write_byte_ds(0XBE); ////發(fā)送讀溫度命令
  94. TLV_ds=read_byte_ds(); //讀出溫度低8
  95. THV_ds=read_byte_ds(); //讀出溫度高8 位
  96. DQ=1;////////////////////釋放總線

  97. T_ds=THV_ds;////////寫入高八位
  98.     T_ds<<=8;///////////高八位上移
  99.     T_ds=T_ds|TLV_ds;///寫入低八位
  100.     tt=T_ds*0.0625;/////直接計算,單位萬分之一度
  101.     T_ds= tt*100+0.5; //可校準(zhǔn),單位0.01度

  102. bwei_ds=T_ds/10000;////////顯示百位
  103.     shwei_ds=T_ds%10000/1000;//顯示十位
  104.     gwei_ds=T_ds%1000/100;/////顯示個位
  105.     shfen_ds=T_ds%100/10;//////顯示十分位
  106.     bfen_ds=T_ds%10;///////////顯示百分位
  107. }

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

調(diào)用方法研究:http://www.torrancerestoration.com/bbs/dpj-218922-1.html


回復(fù)

使用道具 舉報

ID:77146 發(fā)表于 2015-4-16 13:20 | 顯示全部樓層
現(xiàn)在下載看看
回復(fù)

使用道具 舉報

ID:184107 發(fā)表于 2017-5-24 11:44 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

ID:199814 發(fā)表于 2017-10-3 22:09 | 顯示全部樓層
非常感謝
回復(fù)

使用道具 舉報

ID:864872 發(fā)表于 2022-4-2 17:28 | 顯示全部樓層
你好,我想問一下怎么在主函數(shù)里面讀取ds18b20測的溫度啊
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-2 19:19 | 顯示全部樓層
hempfish 發(fā)表于 2022-4-2 17:28
你好,我想問一下怎么在主函數(shù)里面讀取ds18b20測的溫度啊

在主函數(shù)運(yùn)行g(shù)et_temp_ds()
然后讀取
bwei_ds; /////整數(shù)百位
shwei_ds; ////整數(shù)十位
gwei_ds; /////整數(shù)個位
shfen_ds; ////十分位
bfen_ds; /////百分位
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-2 19:20 來自觸屏版 | 顯示全部樓層
hempfish 發(fā)表于 2022-4-2 17:28
你好,我想問一下怎么在主函數(shù)里面讀取ds18b20測的溫度啊

已回~等審核
回復(fù)

使用道具 舉報

ID:864872 發(fā)表于 2022-4-2 23:49 來自觸屏版 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-2 19:19
在主函數(shù)運(yùn)行g(shù)et_temp_ds()
然后讀取
bwei_ds; /////整數(shù)百位

后頭這些是直接放在get_temp_ds()后面嘛?還是要再定個參數(shù)將這些數(shù)賦參數(shù)里
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-3 09:57 來自觸屏版 | 顯示全部樓層
hempfish 發(fā)表于 2022-4-2 23:49
后頭這些是直接放在get_temp_ds()后面嘛?還是要再定個參數(shù)將這些數(shù)賦參數(shù)里

單片機(jī)跑完get_temp_ds()后會自動把對應(yīng)的數(shù)值放入那幾個變數(shù)里,你就用那幾個變數(shù)做你想做的事
回復(fù)

使用道具 舉報

ID:864872 發(fā)表于 2022-4-3 12:58 來自觸屏版 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-3 09:57
單片機(jī)跑完get_temp_ds()后會自動把對應(yīng)的數(shù)值放入那幾個變數(shù)里,你就用那幾個變數(shù)做你想做的事

我直接使用這幾個變數(shù)到LCD1602里面它不顯示怎么回事啊
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-3 14:00 | 顯示全部樓層
hempfish 發(fā)表于 2022-4-3 12:58
我直接使用這幾個變數(shù)到LCD1602里面它不顯示怎么回事啊

上代碼上照片上仿真截圖啊~
回復(fù)

使用道具 舉報

ID:864872 發(fā)表于 2022-4-3 15:01 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-3 14:00
上代碼上照片上仿真截圖啊~
  1.               wr_com(0xc9);               
  2.                 wr_dat(shwei_ds);
  3.                 wr_dat(gwei_ds);
  4.                 wr_dat('.');
  5.               wr_dat(shfen_ds);
  6.                 wr_dat(0xdf);
  7.                 wr_dat(0x43);
復(fù)制代碼

這是我想輸出的三位數(shù),就直接引用的
這是仿真結(jié)果:(未上傳附件)
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2022-4-4 12:46 | 顯示全部樓層
試試在47行"}"之后加DQ=1;
和在86行"}"之前加DQ=1;
回復(fù)

使用道具 舉報

ID:864872 發(fā)表于 2022-4-4 14:18 | 顯示全部樓層
lkc8210 發(fā)表于 2022-4-4 12:46
試試在47行"}"之后加DQ=1;
和在86行"}"之前加DQ=1;

還是感覺傳感器沒有工作,變化傳感器的值顯示屏上個不變,且沒有讀出測量值。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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