找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 3810|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

DS18B20測試程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:93384 發(fā)表于 2015-11-8 22:08 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
  1. #include<reg52.h>//52單片機(jī)頭文件,規(guī)定了52單片機(jī)的寄存器和IO口等
  2. #include<intrins.h>//_nop_空指令及左右循環(huán)移位子函數(shù)庫
  3. #include "DS18B20.h"
  4. #include "lcd1602.h"
  5. #include "ds1302.h"
  6. unsigned char code digit[10]={"0123456789"};     //定義字符數(shù)組顯示數(shù)字
  7. /************************************************************************
  8. 以下是DS18B20的操作程序
  9. ************************************************************************/
  10. sbit DQ=P3^5;
  11. unsigned char time;   //設(shè)置全局變量,專門用于嚴(yán)格延時
  12. /*****************************************************
  13. 函數(shù)功能:將DS18B20傳感器初始化,讀取應(yīng)答信號
  14. 出口參數(shù):flag
  15. ***************************************************/
  16. bit Init_DS18B20(void)     
  17. {
  18. bitflag;         //儲存DS18B20是否存在的標(biāo)志,flag=0,表示存在;flag=1,表示不存在
  19. DQ =1;           //先將數(shù)據(jù)線拉高
  20. for(time=0;time<2;time++) //略微延時約6微秒
  21.     ;
  22. DQ =0;           //再將數(shù)據(jù)線從高拉低,要求保持480~960us
  23. for(time=0;time<200;time++)  //略微延時約600微秒
  24.     ;         //以向DS18B20發(fā)出一持續(xù)480~960us的低電平復(fù)位脈沖
  25. DQ =1;           //釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高)
  26. for(time=0;time<10;time++)
  27.     ;  //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
  28. flag=DQ;          //讓單片機(jī)檢測是否輸出了存在脈沖(DQ=0表示存在)      
  29. for(time=0;time<200;time++)  //延時足夠長時間,等待存在脈沖輸出完畢
  30.      ;
  31. return (flag);    //返回檢測成功標(biāo)志
  32. }
  33. /*****************************************************
  34. 函數(shù)功能:從DS18B20讀取一個字節(jié)數(shù)據(jù)
  35. 出口參數(shù):dat
  36. ***************************************************/
  37. unsigned char ReadOneChar(void)
  38. {
  39.                    unsignedchar i=0;   
  40.                    unsignedchar dat;  //儲存讀出的一個字節(jié)數(shù)據(jù)
  41.                    for(i=0;i<8;i++)
  42.                     {
  43.                      
  44.                       DQ =1;      // 先將數(shù)據(jù)線拉高
  45.                       _nop_();        //等待一個機(jī)器周期      
  46.                       DQ = 0;     //單片機(jī)從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序
  47.                             dat>>=1;
  48.                       _nop_();    //等待一個機(jī)器周期                     
  49.                       DQ = 1;    //將數(shù)據(jù)線"人為"拉高,為單片機(jī)檢測DS18B20的輸出電平作準(zhǔn)備
  50.                       for(time=0;time<2;time++)
  51.             ;      //延時約6us,使主機(jī)在15us內(nèi)采樣
  52.                       if(DQ==1)
  53.                          dat|=0x80;  //如果讀到的數(shù)據(jù)是1,則將1存入dat
  54.                             else                                 
  55.                                      dat|=0x00;//如果讀到的數(shù)據(jù)是0,則將0存入dat
  56.                         //將單片機(jī)檢測到的電平信號DQ存入r[i]
  57.                       for(time=0;time<8;time++)
  58.                               ;              //延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期
  59.              }                           
  60.           return(dat);   //返回讀出的十進(jìn)制數(shù)據(jù)
  61. }
  62. /*****************************************************
  63. 函數(shù)功能:向DS18B20寫入一個字節(jié)數(shù)據(jù)
  64. 入口參數(shù):dat
  65. ***************************************************/  
  66. WriteOneChar(unsigned char dat)
  67. {
  68.          unsignedchar i=0;
  69.          for(i=0; i<8; i++)
  70.                     {
  71.                      DQ =1;        // 先將數(shù)據(jù)線拉高
  72.                      _nop_();             //等待一個機(jī)器周期     
  73.                      DQ=0;         //將數(shù)據(jù)線從高拉低時即啟動寫時序      
  74.                      DQ=dat&0x01;   //利用與運(yùn)算取出要寫的某位二進(jìn)制數(shù)據(jù),
  75.                        //并將其送到數(shù)據(jù)線上等待DS18B20采樣   
  76.                     for(time=0;time<10;time++)
  77.                         ;//延時約30us,DS18B20在拉低后的約15~60us期間從數(shù)據(jù)線上采樣
  78.                      DQ=1;          //釋放數(shù)據(jù)線                     
  79.                      for(time=0;time<1;time++)
  80.                               ;//延時3us,兩個寫時序間至少需要1us的恢復(fù)期
  81.                      dat>>=1;       //將dat中的各二進(jìn)制位數(shù)據(jù)右移1位
  82.                     }
  83.            for(time=0;time<4;time++)
  84.                        ; //稍作延時,給硬件一點(diǎn)反應(yīng)時間
  85. }
  86. /******************************************************************************
  87. 以下是與溫度有關(guān)的顯示設(shè)置
  88. ******************************************************************************/
  89. /*****************************************************
  90. 函數(shù)功能:顯示溫度符號
  91. ***************************************************/   
  92. /*void display_symbol(void)
  93. {
  94.             unsigned char i;
  95.                       write_com(0x80);    //寫顯示地址,將在第1行第1列開始顯示
  96.                                i = 0;                //從第一個字符開始顯示
  97.                                      while(Temp!= '\0')  //只要沒有寫到結(jié)束標(biāo)志,就繼續(xù)寫
  98.                                      {                                                      
  99.                                                write_data(Temp);   //將字符常量寫入LCD
  100.                                                i++;                 //指向下一個字符
  101.                                                delay1ms();        //延時1ms給硬件一點(diǎn)反應(yīng)時間
  102.                                      }        
  103. }
  104. */
  105. /*****************************************************
  106. 函數(shù)功能:顯示溫度的小數(shù)點(diǎn)
  107. ***************************************************/   
  108. void display_dot(void)
  109. {        
  110.          write_com(0x80+14);        //寫顯示地址,將在第1行第9列開始顯示            
  111.           write_data('.');      //將小數(shù)點(diǎn)的字符常量寫入LCD
  112.           delay1ms();         //延時1ms給硬件一點(diǎn)反應(yīng)時間           
  113. }
  114. /*****************************************************
  115. 函數(shù)功能:顯示溫度的單位(C)
  116. ***************************************************/   
  117. /***void          display_cent(void)
  118. {
  119.           unsigned char i;   
  120.                      write_com(0x80+10);        //寫顯示地址,將在第1行第10列開始顯示
  121.                                i = 0;                    //從第一個字符開始顯示
  122.                                      while(Cent!= '\0')     //只要沒有寫到結(jié)束標(biāo)志,就繼續(xù)寫
  123.                                       {                                             
  124.                                      write_data(Cent);     //將字符常量寫入LCD
  125.                                                i++;                 //指向下一個字符
  126.                                                delay1ms();        //延時1ms給硬件一點(diǎn)反應(yīng)時間
  127.                                      }        
  128. } */
  129. /*****************************************************
  130. 函數(shù)功能:顯示溫度的整數(shù)部分
  131. 入口參數(shù):x
  132. ***************************************************/
  133. void display_temp1(unsigned char x)
  134. {
  135.    unsigned char k,l;       //j,k,l分別儲存溫度的百位、十位和個位
  136. /*j=x/100;                 //取百位   */
  137.          k=(x%100)/10;            //取十位
  138.          l=x%10;                  //取個位   */
  139.          write_com(0x80+12);      //寫顯示地址,將在第1行第6列開始顯示
  140. /*write_data(digit[j]);    //將百位數(shù)字的字符常量寫入LCD         */
  141.    write_data(digit[k]);    //將十位數(shù)字的字符常量寫入LCD
  142.          write_data(digit[l]);    //將個位數(shù)字的字符常量寫入LCD        */
  143. }
  144. /*****************************************************
  145. 函數(shù)功能:顯示溫度的小數(shù)數(shù)部分
  146. 入口參數(shù):x
  147. ***************************************************/
  148. void display_temp2(unsigned char x)
  149. {
  150.         write_com(0x80+15);      //寫顯示地址,將在第2行第11列開始顯示
  151.          write_data(digit[x]);     //將小數(shù)部分的第一位數(shù)字字符常量寫入LCD
  152.          delay1ms();          //延時1ms給硬件一點(diǎn)反應(yīng)時間
  153. }
  154. /*****************************************************
  155. 函數(shù)功能:做好讀溫度的準(zhǔn)備
  156. ***************************************************/
  157. void ReadyReadTemp(void)
  158. {
  159.        Init_DS18B20();     //將DS18B20初始化
  160.                    WriteOneChar(0xCC);// 跳過讀序號列號的操作
  161.                    WriteOneChar(0x44);// 啟動溫度轉(zhuǎn)換           
  162.              for(time=0;time<100;time++)
  163.                      ;        //溫度轉(zhuǎn)換需要一點(diǎn)時間
  164.                    Init_DS18B20();     //將DS18B20初始化
  165.                    WriteOneChar(0xCC);//跳過讀序號列號的操作
  166.                    WriteOneChar(0xBE);//讀取溫度寄存器,前兩個分別是溫度的低位和高位     
  167. }
復(fù)制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的積分獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2015-11-8 22:38 | 只看該作者
#include "DS18B20.h"
#include "lcd1602.h"
#include "ds1302.h"

樓主可以上傳壓縮包分享一下 這個3個頭文件嗎
回復(fù)

使用道具 舉報

板凳
ID:261088 發(fā)表于 2017-12-13 16:19 | 只看該作者
程序不完整吧?連主程序main()都找不到
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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