久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3719|回復: 2
收起左側

DS18B20測試程序

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


評分

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

查看全部評分

回復

使用道具 舉報

ID:1 發表于 2015-11-8 22:38 | 顯示全部樓層
#include "DS18B20.h"
#include "lcd1602.h"
#include "ds1302.h"

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

使用道具 舉報

ID:261088 發表于 2017-12-13 16:19 | 顯示全部樓層
程序不完整吧?連主程序main()都找不到
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久久久丝袜 | 成人超碰 | 亚洲精品福利视频 | 国产成人一区二区三区 | www.788.com色淫免费 | 精品国产乱码久久久久久牛牛 | 中文字幕免费视频 | 亚洲精品一区二区网址 | www亚洲免费国内精品 | 一区二区三区日韩精品 | av永久| 99精品网 | 国产乱码精品1区2区3区 | 波多野结衣亚洲 | 美女天天干 | 日韩一区中文字幕 | 久久精品国产99国产 | 99reav| 日韩成人在线电影 | 欧美亚洲另类丝袜综合网动图 | 国产精品视频久久久 | 国产69久久精品成人看动漫 | 91九色在线观看 | 一区二区在线 | 一区二区三区免费在线观看 | 国产精品久久久久一区二区三区 | 欧美激情在线播放 | 成人一区二区在线 | 最新av在线播放 | 欧美精品国产一区二区 | 欧美大片一区 | 亚洲精品一区二区三区丝袜 | 久久这里只有精品首页 | 午夜精品一区二区三区三上悠亚 | 日韩欧美视频 | 日韩中文字幕av | 亚洲国产精品99久久久久久久久 | 午夜精品福利视频 | 中文字幕第三页 | 国产成人精品视频在线观看 | 亚洲日韩中文字幕一区 |