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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2797|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

8個(gè)ds18b20測(cè)溫,不按規(guī)矩的搞法 附單片機(jī)源碼+原理圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:407089 發(fā)表于 2018-12-25 17:23 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
ds18b20單總線驅(qū)動(dòng),要掛接多個(gè),就得掃描ROM提取序列號(hào),還得匹配ROM取溫度值,有點(diǎn)麻煩。分析其驅(qū)動(dòng)原理,完全可以用P口的8個(gè)位同時(shí)驅(qū)動(dòng)8個(gè)ds18b20,實(shí)現(xiàn)溫度顯示。

以下是proteus仿真效果:




以下是代碼:
main.c
  1. #include "config.h"
  2. #include "timer.h"
  3. #include "lcd1604.h"
  4. #include "ds18b20.h"

  5. uchar temp_array[16], *p_array;
  6. //按位取值
  7. uchar code dbit[8] = {1, 2, 4, 8, 16, 32, 64, 128};
  8. uchar code pos[8] = {0,0,1,1,2,2,3,3};

  9. void dis_temps(void)
  10. {
  11.     uint16 temp;
  12.     uint8 i, j;
  13.     uchar str[6] = "";
  14.     bit temp_flag;
  15.    
  16.     for(i=0; i<8; i++)
  17.     {
  18.         for(j=0; j<16; j++)
  19.         {
  20.             temp >>= 1;
  21.             if((temp_array[j] & dbit[i]) == dbit[i])
  22.             {
  23.                 temp |=0x8000;
  24.             }
  25.         }
  26.         if((temp & 0xf800) == 0xf800)
  27.             {
  28.                     temp_flag = 1;                                
  29.                     temp = (~temp) + 1;
  30.             }else{                                                                                                   
  31.                     temp_flag = 0;                                
  32.             }
  33.         float2str(temp*0.0625, str, 1);
  34.         
  35.         if(temp_flag == 1)
  36.         {
  37.             if((i%2)==0)
  38.             {
  39.                 LCD1604_dis_str(0, pos[i], "-");
  40.             }else{
  41.                 LCD1604_dis_str(8, pos[i], "-");
  42.             }        
  43.         }else{
  44.             if((i%2)==0)
  45.             {
  46.                 LCD1604_dis_str(0, pos[i], " ");
  47.             }else{
  48.                 LCD1604_dis_str(8, pos[i], " ");
  49.             }        
  50.         }
  51.         if((i%2)==0)
  52.         {
  53.             LCD1604_dis_str(1, pos[i], str);
  54.         }else{
  55.             LCD1604_dis_str(9, pos[i], str);
  56.         }        
  57.     }
  58. }

  59. void main()
  60. {

  61.     LCD1604_init();
  62.     p_array = temp_array;

  63.     DS18B20_start();

  64.     while(1)
  65.     {
  66.         DS18B20_get_temp(p_array);
  67.         dis_temps();
  68.         DS18B20_start();
  69.         delay_ms(500);
  70.     }
  71. }
復(fù)制代碼
ds18b20.c
  1. #include "config.h"
  2. #include "ds18b20.h"
  3. #include "timer.h"

  4. /*==========================================================================
  5.   函數(shù)名稱:DS18B20_reset
  6.   函數(shù)功能:初始化DS18B20并檢測(cè)存在脈沖
  7.   返    回:dat(各引腳DS18B20存在數(shù)據(jù),如果不為0x00,則表示有元件故障)
  8.   說(shuō)    明:DS18B20拉低總線以示存在,然后在480us內(nèi)主動(dòng)釋放總線。
  9. --------------------------------------------------------------------------*/
  10. uchar DS18B20_reset(void)
  11. {
  12.     uchar dat;
  13.     DS18B20_IO = 0xff;
  14.     _nop_();
  15.     DS18B20_IO = 0x00;
  16.     delay500us();
  17.    
  18.     DS18B20_IO = 0xff;
  19.     delay80us();
  20.     dat = DS18B20_IO;       //讀取P2口各引腳數(shù)據(jù)
  21.    
  22.     delay500us();
  23.    
  24.     return dat;             //如果不檢測(cè),則可用 "return 0x00;"
  25. }
  26. /*==========================================================================
  27.   函數(shù)名稱:DS18B20_PWB
  28.   函數(shù)功能:P口同時(shí)寫(xiě)一個(gè)字節(jié)。
  29.   備    注:PWB(P1 write byte)
  30. --------------------------------------------------------------------------*/
  31. void DS18B20_PWB(uchar dat)
  32. {
  33.     uint8 i;

  34.     for(i=0; i<8; i++)
  35.     {
  36.         DS18B20_IO = 0x00;
  37.         _nop_();
  38.         DS18B20_IO = ((dat&0x01)==0)?0x00:0xff;
  39.         delay80us();
  40.         DS18B20_IO = 0xff;
  41.         _nop_();
  42.         dat >>= 1;
  43.     }
  44. }
  45. /*==========================================================================
  46.   函數(shù)名稱:DS18B20_PR_16bit
  47.   函數(shù)功能:并口讀16個(gè)字節(jié)。
  48.   說(shuō)    明:P1口同時(shí)讀數(shù)據(jù),算法上須調(diào)整,引入長(zhǎng)度16的數(shù)組來(lái)保存數(shù)據(jù)。
  49.             溫度的輸出需要采用遍歷取值方式。
  50. --------------------------------------------------------------------------*/
  51. void DS18B20_PR_16bit(uchar *p_array)
  52. {
  53.     uint8 i;
  54.     uint16 dat = 0;

  55.     for (i=0; i<16; i++)
  56.     {
  57.         DS18B20_IO = 0x00;
  58.         _nop_();
  59.         DS18B20_IO = 0xff;
  60.         _nop_();
  61.         *(p_array+i) = DS18B20_IO;      //把各端口的值保存到數(shù)組中
  62.         delay80us();
  63.     }
  64. }
  65. /*==========================================================================
  66.   函數(shù)名稱:DS18B20_start
  67.   函數(shù)功能:?jiǎn)?dòng)一次18B20溫度轉(zhuǎn)換
  68. --------------------------------------------------------------------------*/
  69. void DS18B20_start(void)
  70. {
  71.     uchar dat;

  72.     EA = 0;                                   //禁止總中斷
  73.    
  74.     dat = DS18B20_reset();                    //執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答
  75.     if (dat == 0x00)                          //如18B20正確應(yīng)答,則啟動(dòng)一次轉(zhuǎn)換
  76.     {
  77.         DS18B20_PWB(0xCC);                    //跳過(guò)ROM操作
  78.         DS18B20_PWB(0x44);                    //啟動(dòng)一次溫度轉(zhuǎn)換
  79.     }

  80.     EA = 1;                                   //使能總中斷
  81. }
  82. /*==========================================================================
  83.   函數(shù)名稱:DS18B20_get_temp
  84.   函數(shù)功能:讀取DS18B20轉(zhuǎn)換的溫度值
  85. --------------------------------------------------------------------------*/
  86. void DS18B20_get_temp(uchar *p_array)
  87. {
  88.     uchar dat;

  89.     EA = 0;                                   //禁止總中斷
  90.    
  91.     dat = DS18B20_reset();                    //執(zhí)行總線復(fù)位,并獲取18B20應(yīng)答
  92.     if (dat == 0x00)                          //如18B20正確應(yīng)答,則讀取溫度值
  93.     {
  94.         DS18B20_PWB(0xCC);                    //跳過(guò)ROM操作
  95.         DS18B20_PWB(0xBE);                    //發(fā)送讀命令
  96.         DS18B20_PR_16bit(p_array);
  97.     }

  98.     EA = 1;                                   //使能總中斷
  99. }
  100. //========================================================================//
復(fù)制代碼





評(píng)分

參與人數(shù) 2黑幣 +65 收起 理由
perfect123 + 15 贊一個(gè)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:451308 發(fā)表于 2019-1-4 22:50 | 只看該作者
請(qǐng)問(wèn)閣下的頭文件,能不能給一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:407089 發(fā)表于 2019-1-8 13:04 | 只看該作者
perfect123 發(fā)表于 2019-1-5 09:59
這個(gè)很容易搞的呀,調(diào)用一個(gè)18b20如果需要400毫秒,如果用8個(gè)端口幾乎同時(shí)調(diào)用8個(gè),那么時(shí)間大概是401毫秒 ...

謝謝評(píng)分!
寫(xiě)數(shù)據(jù)和讀數(shù)據(jù)是完全同步的。
一根網(wǎng)線,接6個(gè)18b20,也許可以滿足很多場(chǎng)合需求了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利久久 | 亚洲第一视频网站 | 91麻豆精品一区二区三区 | 欧美一级欧美一级在线播放 | 久久久夜 | 欧美极品一区二区 | 日本淫视频 | 一级片在线观看 | 久草视频观看 | 99亚洲精品 | 精品亚洲一区二区三区 | 91精品国产一区二区三区 | 91青娱乐在线 | 日本免费在线 | 中文字幕精品一区久久久久 | 日韩精品在线看 | 黄色国产在线播放 | 午夜在线精品偷拍 | 国产乱码精品一品二品 | 亚洲精品九九 | 一区二区三区视频在线观看 | 国产小视频在线 | 亚洲成人av | 精品免费视频 | 色在线免费视频 | 国产精品久久久久久久久婷婷 | 黑人巨大精品 | 国产精品久久久久无码av | 免费在线观看成人 | 亚洲一区二区免费视频 | 91毛片在线看 | 国产精品美女久久久免费 | 成人免费看| 91精品国产91久久久久久吃药 | 成人久久网 | 一本一道久久a久久精品蜜桃 | 精品一区二区三区免费视频 | 久久精品亚洲欧美日韩精品中文字幕 | 91精品国产综合久久久久蜜臀 | 亚洲一区二区免费 | 欧美性影院 |