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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 16646|回復: 7
打印 上一主題 下一主題
收起左側(cè)

DS18B20溫度傳感器一直顯示0度

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:268642 發(fā)表于 2018-1-8 19:03 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
如圖,用的是下載來的資料自己焊了個板子,但是程序燒進去之后一直顯示0.0
求做過這個實驗的老哥幫忙看看程序

主程序:

  1. main()
  2. {
  3.         init_various();
  4.         while(1)                                           //不斷重復循環(huán)
  5.         {
  6.                 if(b10msEvent)
  7.                 {
  8.                         b10msEvent = false;
  9.                         dynamic_display();                        //顯示

  10.                         if(b500msEvent)
  11.                         {
  12.                                 b500msEvent = false;
  13.                                 set_temp_data();                        //讀溫度
  14.                         }
  15.                 }
  16.         }
  17. }

  18. /*********************************************
  19. * 定時器0中斷
  20. *********************************************/
  21. void timer0(void) interrupt 1
  22. {
  23.         static u8 SecCount = 0;

  24.         TH0 = TH0HIGH;
  25.         TL0 = TL0LOWW;

  26.         b10msEvent = true;                //10毫秒中斷
  27.         if(++SecCount == 50)
  28.         {
  29.                 SecCount = 0;
  30.                 b500msEvent = true;                //1秒到時
  31.         }
  32. }






  33. 芯片程序:
  34. u8 ds18b20_reset(void)
  35. {
  36.         DQ_PIN = HIGH;                //先將數(shù)據(jù)線拉高
  37.         delay_16us(1);                //稍作延遲
  38.         DQ_PIN = LOW;                //將數(shù)據(jù)線拉低
  39.         delay_16us(30);                //延時600us
  40.         DQ_PIN = HIGH;                //將數(shù)據(jù)線再次拉高
  41.         delay_16us(5);                //延時80us
  42.         if(!DQ_PIN)                   //判斷如果讀到數(shù)據(jù)線低電平則初始化成功
  43.         {
  44.                 delay_16us(30);        //延時420us
  45.                 return 1;
  46.         }
  47.         else
  48.         return 0;
  49. }
  50. /************************************************
  51. * 函數(shù)名稱:ds18b20_write_byte
  52. * 功能描述:DS18B20寫數(shù)據(jù)
  53. *************************************************/
  54. void ds18b20_write_byte(u8 wByte)
  55. {
  56.         u8 i;                                   //定義unsigned char類型的i
  57.         for(i=0; i<8; i++)
  58.         {
  59.                 DQ_PIN = LOW;          //數(shù)據(jù)線拉低
  60.                 NOP();                  
  61.                 NOP();
  62.                 NOP();
  63.                 NOP();
  64.                 NOP();
  65.                 NOP();
  66.                 NOP();                          //進行延時
  67.                 DQ_PIN = wByte & 0x01;        //按低位到高位寫數(shù)據(jù)(每次一位)
  68.                 NOP();
  69.                 NOP();
  70.                 NOP();
  71.                 NOP();
  72.                 NOP();                                        //延時
  73.                 DQ_PIN = HIGH;                        //數(shù)據(jù)線拉高
  74.                 NOP();
  75.                 NOP();
  76.                 NOP();
  77.                 wByte >>= 1;                        //要寫入的數(shù)據(jù)右移一位后在下一循環(huán)寫入
  78.         }
  79. }
  80. /************************************************
  81. * 函數(shù)名稱:ds18b20_read_byte
  82. * 功能描述:DS18B20讀數(shù)據(jù)
  83. *************************************************/
  84. u8 ds18b20_read_byte(void)
  85. {
  86.         u8 rByte;                //存放所讀出的數(shù)據(jù)
  87.         u8 i;
  88.         for(i=0; i<8; i++)
  89.         {
  90.                 DQ_PIN = LOW;
  91.                 NOP();
  92.                 NOP();
  93.                 rByte >>= 1;        //將上次所讀數(shù)據(jù)右移一位,以下一循環(huán)讀取數(shù)據(jù)
  94.                 NOP();
  95.                 NOP();
  96.                 NOP();
  97.                 NOP();
  98.                 NOP();
  99.                 NOP();
  100.                 DQ_PIN = HIGH;
  101.                 NOP();
  102.                 NOP();
  103.                 NOP();
  104.                 NOP();
  105.                 NOP();
  106.                 NOP();
  107.                 NOP();
  108.                 if(DQ_PIN)                         //如果讀到是1,rByte與0x80相與,最高位寫1
  109.                 rByte |= 0x80;
  110.                 NOP();
  111.                 NOP();
  112.                 NOP();
  113.                 NOP();
  114.                 NOP();
  115.                 NOP();
  116.                 NOP();
  117.         }
  118.         DQ_PIN = HIGH;
  119.         return rByte;                   //將所讀字節(jié)送回
  120. }
  121. /************************************************
  122. * 函數(shù)名稱:ds18b20_get_temp
  123. * 功能描述:讀溫度值
  124. *************************************************/
  125. u16 ds18b20_get_temp(void)
  126. {
  127.         u16 Temp;                                                         //定義unsigned short類型變量temp
  128.         if(ds18b20_reset() == 0)                        //若復位程序傳回值是0則證明沒有成功復位
  129.         return 0;
  130.         ds18b20_write_byte(0xcc);                        //忽略ROM
  131.         ds18b20_write_byte(0x44);                        //發(fā)送溫度轉(zhuǎn)化命令
  132.         delay_16us(30);
  133.         if(ds18b20_reset() == 0)                        //再次復位
  134.         return 0;
  135.         ds18b20_write_byte(0xcc);                        //忽略ROM
  136.         ds18b20_write_byte(0xbe);                        //讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
  137.         Temp = ds18b20_read_byte();
  138.         Temp |= ds18b20_read_byte() << 8;
  139.         return Temp;
  140. }




  141. 中斷:

  142. #include <reg52.h>
  143. #include "device_init.h"
  144. #include "ds18b20.h"

  145. /************************************************
  146. * 函數(shù)名稱:init_c51
  147. * 功能描述:定時器的初始化設置
  148. *************************************************/
  149. void init_c51(void)
  150. {
  151.         TMOD = 0x01;                 //選擇工作方式,定時方式,16位計數(shù)器
  152.         TH0 = TH0HIGH;
  153.         TL0 = TL0LOWW;            //給定時器賦值,先裝高位后裝低位
  154.         ET0 = 1;                        //允許IT0中斷
  155.         TR0 = 1;                   //啟動定時器T0
  156. }
  157. /************************************************
  158. * 函數(shù)名稱:init_various
  159. * 功能描述:中斷設置
  160. *************************************************/
  161. void init_various(void)
  162. {
  163.         EA = 0;        //關閉總中斷允許
  164.         init_c51();        //進行定時器初始化設置并啟動定時器
  165.         ds18b20_reset(); //DS18B20初始化設置
  166.         ds18b20_get_temp();        //獲取溫度
  167.         EA = 1;        //開總中斷
  168. }


  169. 顯示程序:


  170. #include <reg52.h>
  171. #include "typedef.h"
  172. #include "device_init.h"
  173. #include "ds18b20.h"

  174. code u8 float_tab[16] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小數(shù)表
  175. code u8 DisCode[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0xff, 0xbf};        //字形表

  176. u8 DisNum[4] = {0x0a, 0x0a, 0x00, 0x00};
  177. u8 DisPosition = 0;

  178. /************************************************
  179. * 函數(shù)名稱:dynamic_display
  180. * 功能描述:動態(tài)顯示
  181. *************************************************/
  182. void dynamic_display(void)
  183. {
  184.         static u8 DisPinOn = 0x01;

  185.         DisPinOn <<= 1;
  186.         if(DisPinOn == 0x10)
  187.         {
  188.                 DisPosition = 0;
  189.                 DisPinOn = 0x01;
  190.         }
  191.         DIS_DAT = 0xff;
  192.         DIS_POS = DisPinOn;
  193.         DIS_DAT = DisCode[DisNum[DisPosition++]];
  194.         if(DisPinOn == 0x04)
  195.         DIS_DAT &= 0x7f;
  196. }
  197. /************************************************
  198. * 函數(shù)名稱:set_temp_data
  199. * 輸    入:
  200. * 輸    出:
  201. * 功能描述:
  202. *************************************************/
  203. void set_temp_data(void)
  204. {
  205.         u16 TempData;
  206.         float Temp;
  207.         u8 Negative;
  208.         s8 i;

  209.         TempData = ds18b20_get_temp();                //度溫度數(shù)據(jù)


  210.         /* 小于零 */
  211.         if(TempData & 0xf000)
  212.         {
  213.                 TempData = ~TempData + 1;
  214.                 TempData &= 0x0fff;
  215.                 Negative = 1;
  216.         }
  217.         /* 大于零 */
  218.         else
  219.         {
  220.                 Negative = 0;
  221.         }

  222.         Temp = (TempData >> 4) * 10;                //溫度讀數(shù)乘以精度(0.0625),顯示小數(shù)點一位,所以乘以10
  223.         Temp = Temp + float_tab[(TempData & 0x000f)] + 0.5;        //加上小數(shù)部分,四舍五入所以加0.5
  224.         TempData = Temp;

  225.         for(i=3; i>=0; i--)
  226.         {
  227.                 DisNum[i] = TempData % 10;
  228.                 TempData /= 10;
  229.         }

  230.         for(i=0; i<2; i++)
  231.         {
  232.                 if(DisNum[i] != 0)
  233.                 {
  234.                         break;
  235.                 }
  236.                 else
  237.                 {
  238.                         DisNum[i] = 0x0a;                        //前面為0不顯示
  239.                 }
  240.         }
  241.         /*  顯示負號 */
  242.         if(Negative == 1)
  243.         {
  244.                 for(i=2; i>=0; i--)
  245.                 {
  246.                         if(DisNum[i] == 0x0a)
  247.                         {
  248.                                 DisNum[i] = 0x0b;                //'-'
  249.                                 break;
  250.                         }
  251.                 }
  252.         }
  253. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:96682 發(fā)表于 2018-1-8 22:35 | 只看該作者
粘貼出來的沒看到源碼中的 DS18B20 要接在哪個 IO 上,另外那個 R2 阻值偏大了( 典型的是:4K7)
回復

使用道具 舉報

板凳
ID:268642 發(fā)表于 2018-1-10 00:25 | 只看該作者
wc86110 發(fā)表于 2018-1-8 22:35
粘貼出來的沒看到源碼中的 DS18B20 要接在哪個 IO 上,另外那個 R2 阻值偏大了( 典型的是:4K7)

但是在.H文件中有sbit DQ_PIN的定義而C里面沒有,明天換成小一點的電阻焊上去試試。

不過目前是一直顯示-0.1°是不是代表有數(shù)據(jù)但是不對呢?

望大神多多指導
回復

使用道具 舉報

地板
ID:274121 發(fā)表于 2018-1-10 09:16 | 只看該作者
DS18B20定義的接口是單片機哪個腳?要是實物的話可以手觸摸DS18B20,看溫度有無變化。也許換一個傳感器就行?梢院附釉囋
回復

使用道具 舉報

5#
ID:66761 發(fā)表于 2018-1-10 10:32 | 只看該作者
如果再實際應用中,18B20驅(qū)動起來其實并不難,時序圖也不復雜,,這個需要比較精準的定時,延時時單片機的實際時鐘頻率要搞明白,不能只查看數(shù)據(jù)手冊數(shù) 多少個nop 就是1us,差異較大,,如果實在不行,就先用定時器去計時,,,我第一個驅(qū)動18b20時 用nop 搞了好久,就是復位失敗或采集不準確,用定時器 計時一次通過,希望能幫到您,,
回復

使用道具 舉報

6#
ID:111634 發(fā)表于 2018-1-10 15:56 | 只看該作者
本帖最后由 zl2168 于 2018-1-10 15:58 編輯

先讀懂讀通正確的程序
實例97  一線式DS18B20測溫

Proteus仿真一下,確認有效。
實例97 DS18B20測溫.rar (51.78 KB, 下載次數(shù): 89)

以上摘自張志良編著《80C51單片機仿真設計實例教程——基于Keil CProteus》清華大學出版社ISBN 978-7-302-41682-1,內(nèi)有常用的單片機應用100案例,用于仿真實驗操作,電路與程序真實可靠可信可行。仿真電路和Hex文件能在清華出版社網(wǎng)站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購買。
回復

使用道具 舉報

7#
ID:268642 發(fā)表于 2018-1-10 23:49 | 只看該作者
各位老哥我問題沒表達清楚,是仿真可以實現(xiàn)但是在自己焊的電路中只有顯示0度且不會變化
回復

使用道具 舉報

8#
ID:922838 發(fā)表于 2021-10-17 11:19 | 只看該作者
a865550942 發(fā)表于 2018-1-10 23:49
各位老哥我問題沒表達清楚,是仿真可以實現(xiàn)但是在自己焊的電路中只有顯示0度且不會變化

你的問題解決沒,我現(xiàn)在也有一樣的問題
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费视频 | 日韩av手机在线观看 | 久久久精品一区二区三区 | 午夜婷婷激情 | 国产人成精品一区二区三 | 国产精品久久久久久久三级 | 欧美日韩在线播放 | 色av一区二区三区 | 午夜免费视频 | 亚洲高清av| 亚洲综合热 | 国产麻豆乱码精品一区二区三区 | xxxxx免费视频 | 视频在线一区二区 | 亚洲 精品 综合 精品 自拍 | 亚洲精品久久久久久国产精华液 | 伊人在线 | 九九热在线免费观看 | 精品欧美一区二区三区 | 一级在线观看 | 国产日韩av一区二区 | 久久精品成人 | 欧美a级成人淫片免费看 | 韩国精品一区二区三区 | 成av在线 | 欧美日韩一区二区在线 | 国产午夜视频 | 成人免费片| 日本高清不卡视频 | 精品久久久久久久人人人人传媒 | 国产精品高潮呻吟久久久久 | 黄色片免费 | 亚洲综合一区二区三区 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 欧美无乱码久久久免费午夜一区 | 玖操| 国产在线精品一区二区 | 亚洲第一女人av | 波多野结衣亚洲 | 中文字幕在线精品 | 日韩一区二区三区视频 |