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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4047|回復: 0
打印 上一主題 下一主題
收起左側

stm32驅動ds18b20溫度讀取源程序

[復制鏈接]
跳轉到指定樓層
樓主
       發上來的程序是主要基于stm32f1的驅動程序,如果你需要清楚了解ds18b20的工作時序,寄存器配置,那么在論壇上找找看看數據手冊,如果你想直接用,那么把頭文件和c文件直接添加到你的工程中就可以了。       本程序在實質上和51驅動的沒有區別,都是模擬I2C。兩者區別在于大部分51對于IO口的輸入輸出配置沒有硬性規定,既可以當輸入又可以當輸出,而stm32的輸入輸出必須明確模式配置。而ds18b20是一線通信,所以需要輸入輸出模式來回配置。
       本程序我通過硬件明確測試過,可以準確讀出數據,如果數據無法讀出,可能是以下幾點問題:
       1、引腳配置未修改。可在h文件中修改宏定義即可
       2、請注意該函數void DS18B20_DQ_DDR(uint8_t ddr),他是用于修改IO輸入輸出模式的,本程序使用的標準庫函數進行操作,用到的時間可能會有一點長,影響到了I2C的模擬時序,建議可以直接對寄存器進行操作,庫函數的實質也是修改寄存器,只是由于為了程序兼容性,犧牲了時間。
       3、由于是模擬的I2C時序,請務必注意中斷對于通信時序的影響。

單片機源程序如下:
  1. #include "ds18b20.h"//主要包含了一些引腳宏定義,移植時必須包含
  2. #include "delay.h"//主要是聲明了延時函數,由于是模擬I2C,延時必須精準
  3. #include "math.h"//使用了庫函數pow()函數,該函數為冪次函數,如pow(10,2),相當于10^2,移植時必須包含
  4. /*******************************************************************************
  5. 函數名:DS18B20_DQ_DDR
  6. 功能:配置IO輸入/輸出狀態
  7. 輸入:0/1    輸入0配置為輸入,輸入1配置為輸出
  8. 輸出:
  9. 返回值:
  10. *******************************************************************************/
  11. void DS18B20_DQ_DDR(uint8_t ddr)
  12. {
  13.         GPIO_InitTypeDef  GPIO_InitStructure;
  14.         //使能GPIO時鐘
  15.   RCC_APB2PeriphClockCmd(DS18B20_GPIO_CLK, ENABLE);       
  16.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;       
  17.   //配置為輸出
  18.   if(ddr == 1)
  19.   {
  20.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        
  21.                 GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;                                          
  22.                 GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);               
  23.                
  24.   }
  25.   //配置為輸入
  26.   else
  27.         {
  28.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;        
  29.                 GPIO_InitStructure.GPIO_Pin = DS18B20_GPIO_PIN;                                          
  30.                 GPIO_Init(DS18B20_GPIO_PORT, &GPIO_InitStructure);       
  31.   }
  32. }
  33. /*******************************************************************************
  34. 函數名:DS18B20_Init
  35. 功能:初始化DS18B20
  36. 輸入:
  37. 輸出:
  38. 返回值:初始化成功為0,不成功為1
  39. 備注:
  40. *******************************************************************************/
  41. u8 DS18B20_Init(void)
  42. {
  43.         u8 x = 0;
  44.   //改變DQ引腳為輸出
  45.   DS18B20_DQ_DDR(1);
  46.   //先置高
  47.   DS18B20_DQ_H;  
  48.   //延時700us,使總線穩定
  49.   delay_us(700);
  50.   //復位脈沖,低電位
  51.   DS18B20_DQ_L;  
  52.   //保持至少480us,這里500us
  53.   delay_us(500);
  54.   //改變DQ引腳為輸入
  55.   DS18B20_DQ_DDR(0);
  56.   //拉高數據線,釋放總線
  57.   DS18B20_DQ_H;  
  58.   //等待15-60us,這里40us
  59.   delay_us(40);
  60.   //等待35us
  61.   delay_us(35);
  62.   //聆聽,判斷有沒有初始化成功(DS18B20有沒有發送應答脈沖)
  63.   x = DS18B20_DQ_ReadPin;   
  64.   //至少480us后進入接收狀態,這里500us
  65.   delay_us(500);
  66.   return x;
  67. }
  68. /*******************************************************************************
  69. 函數名:DS18B20_Wbyte
  70. 功能:寫一個字節
  71. 輸入:uint8_t xbyte
  72. 輸出:
  73. 返回值:
  74. 備注:
  75. *******************************************************************************/
  76. void DS18B20_Wbyte(uint8_t xbyte)
  77. {
  78.         //i:循環控制變量,x:取位運算變量
  79.   int8_t i ,x = 0;
  80.   //改變DQ引腳為輸出
  81.   DS18B20_DQ_DDR(1);
  82.   //8次循環實現逐位寫入
  83.   for(i = 1; i <= 8; i++)
  84.   {
  85.                 //先取低位
  86.     x = xbyte & 0x01;
  87.     //寫1
  88.     if(x)
  89.     {
  90.       DS18B20_DQ_H;
  91.       //拉低總線
  92.       DS18B20_DQ_L;
  93.       //延時15us
  94.       delay_us(15);
  95.       //總線寫1
  96.       DS18B20_DQ_H;
  97.       //延時15us
  98.       delay_us(15);
  99.       //保持高電平
  100.       DS18B20_DQ_H;
  101.       delay_us(4);
  102.                 }
  103.                 //寫0
  104.                 else
  105.     {
  106.                         DS18B20_DQ_H;
  107.       //總線拉低
  108.       DS18B20_DQ_L;
  109.       //延時15us
  110.       delay_us(15);
  111.       //總線寫0
  112.       DS18B20_DQ_L;
  113.       //延時15us
  114.       delay_us(15);
  115.       //保持高電平
  116.       DS18B20_DQ_H;
  117.       delay_us(4);
  118.     }
  119.     //xbyte右移一位
  120.     xbyte = xbyte >> 1;
  121.         }
  122. }
  123. /*******************************************************************************
  124. 函數名:DS18B20_Rbit
  125. 功能:從DS18B20讀一個位
  126. 輸入:
  127. 輸出:
  128. 返回值:讀取到的位
  129. 備注:
  130. *******************************************************************************/
  131. uint8_t DS18B20_Rbit(void)
  132. {
  133.         //rbit是最終位數據,x是取狀態變量
  134.   uint8_t rbit = 0x00,x = 0;
  135.   //改變DQ為輸出模式
  136.   DS18B20_DQ_DDR(1);
  137.   DS18B20_DQ_H;
  138.   //總線寫0
  139.   DS18B20_DQ_L;
  140.   //延時15us以內
  141.   delay_us(5);
  142.   //釋放總線
  143.   DS18B20_DQ_H;
  144.   //改變DQ為輸入模式
  145.   DS18B20_DQ_DDR(0);
  146.   //延時大約3us
  147.   delay_us(3);
  148.   //獲取總線電平狀態
  149.   x = DS18B20_DQ_ReadPin;
  150.   //如果是1,則返回0x80,否則返回0x00
  151.   if(x)
  152.                 rbit = 0x80;
  153.   //延時大約60us
  154.   delay_us(60);
  155.         return rbit;
  156. }
  157. /*******************************************************************************
  158. 函數名:DS18B20_Rbyte
  159. 功能:從DS18B20讀一個字節
  160. 輸入:
  161. 輸出:
  162. 返回值:讀取到的字節
  163. 備注:
  164. *******************************************************************************/
  165. uint8_t DS18B20_Rbyte(void)
  166. {
  167.   //rbyte:最終得到的字節
  168.   //tempbit:中間運算變量
  169.   uint8_t rbyte = 0,i = 0, tempbit =0;
  170.   for (i = 1; i <= 8; i++)
  171.   {
  172.     //讀取位
  173.     tempbit = DS18B20_Rbit();
  174.     //右移實現高低位排序
  175.     rbyte = rbyte >> 1;
  176.     //或運算移入數據
  177.     rbyte = rbyte|tempbit;
  178.   }
  179.   return rbyte;
  180. }
  181. int ReadTemperature(void)
  182. {
  183.   //fg:符號位
  184.   //data:溫度的整數部分
  185.   int fg;
  186.   int data;
  187.   //DS18B20初始化
  188.   DS18B20_Init();
  189.   //跳過讀序列號
  190.   DS18B20_Wbyte(0xcc);
  191.   //啟動溫度轉換
  192.   DS18B20_Wbyte(0x44);
  193.   //等待溫度轉換
  194.   delay_ms(1);
  195.   DS18B20_Init();
  196.   DS18B20_Wbyte(0xcc);
  197.   //讀溫度寄存器
  198.   DS18B20_Wbyte(0xbe);
  199.   uint8_t TempL = DS18B20_Rbyte();//讀取低8位
  200.   uint8_t TempH = DS18B20_Rbyte();//讀取高8位
  201.   //符號位為負
  202.   if(TempH > 0x70)
  203.   {
  204.     TempL = ~TempL;
  205.     TempH = ~TempH;
  206.     fg = 0;
  207.   }
  208.   else fg = 1;
  209.                
  210.         //將數據高低位合并
  211.   data = TempH;//數據高八位
  212.   data <<=  8;//左移8位
  213.   data += TempL;//加上低八位

  214.         //data的"1"相當于0.0625℃
  215.         //換句話說,想要多少精度可以這樣寫:data=(float)data*0.0625*pow(10,n)
  216.         //其中n為保留的小數精度位數,可以從目前對ds18b20配置情況下看出最高保留小數的精度位數為4位
  217.         //這樣只需要對返回值進行處理就可以用于顯示了
  218.         //特別注意的是,int類型的數據長度為16位,最大值為65535,因此需要注意使用范圍
  219.         data=(float)data*0.0625*pow(10,1);//這樣寫等同于下面一句
  220.   //data = (float)data*0.625;//這樣相當于精度為0.1℃
  221.   if(fg)
  222.     return data;
  223.   else
  224.      return -data;
  225. }
復制代碼

所有資料51hei提供下載:
DS18B20.rar (2.56 KB, 下載次數: 101)



評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产片侵犯亲女视频播放 | 中国美女一级黄色片 | 日本三级电影在线看 | 性色的免费视频 | 性一爱一乱一交一视频 | 欧美簧片 | 国产传媒视频在线观看 | 成人在线视频观看 | 日本在线视频一区二区 | 黄在线免费观看 | 欧美一区二区三区在线观看 | 国产午夜精品一区二区三区四区 | 免费在线观看成人 | 精品网 | 日韩欧美精品一区 | 久久久毛片 | 日韩成人影院在线观看 | 午夜影晥| 91精品国产乱码久久久久久久 | 国产精品久久 | 精品国产久 | 精品三级在线观看 | 成人av免费 | 日韩欧美大片在线观看 | 日本aaa视频 | 日日操操 | 午夜日韩精品 | 一级黄色片一级黄色片 | 青青草网站在线观看 | 日韩有码在线播放 | 国产一区二区三区视频在线观看 | 在线观看免费av网 | 91精品国产91久久久久福利 | 中文字幕亚洲一区二区va在线 | 色中文在线 | 欧美午夜久久 | 国产精品福利视频 | 久久com | 精品国产青草久久久久福利 | 国产特级毛片aaaaaa | 99婷婷 |