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

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

QQ登錄

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

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

51單片機(jī)控制八個(gè)DS18B20溫度傳感器顯示 原理圖及PCB圖+仿真程序

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
Altium Designer畫(huà)的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


51單片機(jī)控制八個(gè)DS18B20仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <Intrins.h>

  3. #define                DATA        P1      //1602驅(qū)動(dòng)端口
  4. //ROM操作命令
  5. #define                 READ_ROM                       0x33                    //讀ROM
  6. #define                 SKIP_ROM                       0xCC                    //跳過(guò)ROM
  7. #define                 MATCH_ROM               0x55                    //匹配ROM
  8. #define                 SEARCH_ROM              0xF0                    //搜索ROM
  9. #define                 ALARM_SEARCH            0xEC                    //告警搜索

  10. //存儲(chǔ)器操作命令
  11. #define                 ANEW_MOVE                     0xB8                    //重新調(diào)出E^2數(shù)據(jù)
  12. #define                 READ_POWER              0xB4                    //讀電源
  13. #define                 TEMP_SWITCH             0x44                    //啟動(dòng)溫度變換
  14. #define                 READ_MEMORY             0xBE                    //讀暫存存儲(chǔ)器
  15. #define                 COPY_MEMORY             0x48                    //復(fù)制暫存存儲(chǔ)器
  16. #define                 WRITE_MEMORY            0x4E                    //寫(xiě)暫存存儲(chǔ)器

  17. //數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
  18. typedef struct tagTempData
  19. {
  20.         unsigned char                                         btThird;                                                        //百位數(shù)據(jù)                                       
  21.         unsigned char                                         btSecond;                                                        //十位數(shù)據(jù)
  22.         unsigned char                                         btFirst;                                                        //個(gè)位數(shù)據(jù)
  23.         unsigned char                                         btDecimal;                                                        //小數(shù)點(diǎn)后一位數(shù)據(jù)
  24.         unsigned char                                        btNegative;                                                        //是否為負(fù)數(shù)               
  25. }TEMPDATA;
  26. TEMPDATA m_TempData;


  27. //引腳定義
  28. sbit                                                         DQ = P2^7;                                                        //數(shù)據(jù)線端口
  29. sbit                 RS=                P2^0;
  30. sbit                 RW=                P2^1;
  31. sbit                 E=                P2^2;


  32. //DS18B20序列號(hào),通過(guò)調(diào)用GetROMSequence()函數(shù)在P1口讀出(讀8次)
  33. const unsigned char code ROMData1[8] = {0x28, 0x33, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xD7};        //U1
  34. const unsigned char code ROMData2[8] = {0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E};        //U2
  35. const unsigned char code ROMData3[8] = {0x28, 0x31, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xB9};        //U3
  36. const unsigned char code ROMData4[8] = {0x28, 0x32, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0xE0};        //U4
  37. const unsigned char code ROMData5[8] = {0x28, 0x34, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x52};        //U5
  38. const unsigned char code ROMData6[8] = {0x28, 0x35, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x65};        //U6
  39. const unsigned char code ROMData7[8] = {0x28, 0x36, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x3C};        //U7
  40. const unsigned char code ROMData8[8] = {0x28, 0x37, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x0B};        //U8

  41. //判斷忙指令
  42. void Busy()
  43. {
  44.         DATA = 0xff;
  45.         RS = 0;
  46.         RW = 1;
  47.            while(DATA & 0x80)
  48.            {
  49.                 E = 0;
  50.                    E = 1;
  51.            }
  52.            E = 0;
  53. }

  54. //寫(xiě)指令程序
  55. void WriteCommand(unsigned char btCommand)
  56. {
  57.         Busy();
  58.         RS = 0;
  59.         RW = 0;
  60.         E = 1;
  61.         DATA = btCommand;
  62.         E = 0;
  63. }

  64. //寫(xiě)數(shù)據(jù)程序
  65. void WriteData(unsigned char btData)
  66. {
  67.         Busy();
  68.         RS = 1;
  69.         RW = 0;
  70.         E = 1;
  71.         DATA = btData;
  72.         E = 0;
  73. }

  74. //清屏顯示
  75. void Clear()
  76. {
  77.         WriteCommand(1);
  78. }

  79. //初始化
  80. void Init()
  81. {
  82.         WriteCommand(0x0c);        //開(kāi)顯示,無(wú)光標(biāo)顯示
  83.         WriteCommand(0x06);        //文字不動(dòng),光標(biāo)自動(dòng)右移
  84.         WriteCommand(0x38);        //設(shè)置顯示模式:8位2行5x7點(diǎn)陣
  85. }

  86. //顯示單個(gè)字符
  87. void DisplayOne(bit bRow, unsigned char btColumn, unsigned char btData, bit bIsNumber)
  88. {
  89.         if (bRow)                 WriteCommand(0xc0 + btColumn);
  90.         else                      WriteCommand(0x80 + btColumn);

  91.         if (bIsNumber)         WriteData(btData + 0x30);
  92.         else                   WriteData(btData);
  93. }

  94. //顯示字符串函數(shù)
  95. void DisplayString(bit bRow, unsigned char btColumn, unsigned char *pData)
  96. {
  97.         while (*pData != '\0')
  98.            {
  99.                    if (bRow) WriteCommand(0xc0 + btColumn);        //顯示在第1行
  100.                    else            WriteCommand(0x80 + btColumn);        //顯示在第0行
  101.                 WriteData(*(pData++));                                                //要顯示的數(shù)據(jù)
  102.                 btColumn++;                                                                        //列數(shù)加一
  103.            }
  104. }

  105. //延時(shí)16us子函數(shù)
  106. void Delay16us()
  107. {
  108.         unsigned char a;

  109.         for (a = 0; a < 4; a++);
  110. }

  111. //延時(shí)60us子函數(shù)
  112. void Delay60us()
  113. {
  114.         unsigned char a;

  115.         for (a = 0; a < 18; a++);
  116. }

  117. //延時(shí)480us子函數(shù)
  118. void Delay480us()
  119. {
  120.         unsigned char a;

  121.         for (a = 0; a < 158; a++);
  122. }

  123. //延時(shí)240us子函數(shù)
  124. void Delay240us()
  125. {
  126.         unsigned char a;

  127.         for (a = 0; a < 78; a++);
  128. }

  129. //延時(shí)500ms子函數(shù)
  130. void Delay500ms()
  131. {
  132.         unsigned char a, b, c;

  133.         for (a = 0; a < 250; a++)
  134.         for (b = 0; b < 3; b++)
  135.         for (c = 0; c < 220; c++);
  136. }

  137. //芯片初始化
  138. void Initialization()
  139. {
  140.         while(1)
  141.         {
  142.                 DQ = 0;
  143.                 Delay480us();                         //延時(shí)480us
  144.                 DQ = 1;
  145.                 Delay60us();                        //延時(shí)60us
  146.                 if(!DQ)                                  //收到ds18b20的應(yīng)答信號(hào)
  147.                 {        
  148.                         DQ = 1;
  149.                         Delay240us();                //延時(shí)240us
  150.                         break;               
  151.                 }
  152.         }
  153. }

  154. //寫(xiě)一個(gè)字節(jié)(從低位開(kāi)始寫(xiě))
  155. void WriteByte(unsigned char btData)
  156. {
  157.         unsigned char i, btBuffer;

  158.         for (i = 0; i < 8; i++)
  159.         {
  160.                 btBuffer = btData >> i;
  161.                 if (btBuffer & 1)
  162.                 {
  163.                         DQ = 0;
  164.                         _nop_();
  165.                         _nop_();
  166.                         DQ = 1;
  167.                         Delay60us();
  168.                 }
  169.                 else
  170.                 {
  171.                         DQ = 0;
  172.                         Delay60us();
  173.                         DQ = 1;                        
  174.                 }
  175.         }
  176. }

  177. //讀一個(gè)字節(jié)(從低位開(kāi)始讀)
  178. unsigned char ReadByte()
  179. {
  180.         unsigned char i, btDest;

  181.         for (i = 0; i < 8; i++)
  182.         {
  183.                 btDest >>= 1;
  184.                 DQ = 0;
  185.                 _nop_();
  186.                 _nop_();
  187.                 DQ = 1;
  188.                 Delay16us();
  189.                 if (DQ) btDest |= 0x80;
  190.                 Delay60us();
  191.         }

  192.         return btDest;
  193. }

  194. //序列號(hào)匹配
  195. void MatchROM(const unsigned char *pMatchData)
  196. {
  197.         unsigned char i;

  198.         Initialization();
  199.         WriteByte(MATCH_ROM);
  200.         for (i = 0; i < 8; i++) WriteByte(*(pMatchData + i));        
  201. }

  202. //得到64位ROM序列(在P1口顯示,必須與Proteus聯(lián)調(diào)且在單步調(diào)試下才能得到)
  203. /*void GetROMSequence()
  204. {
  205.         unsigned char i;

  206.         Initialization();
  207.         WriteByte(READ_ROM);
  208.         for (i = 0; i < 8; i++)
  209.         P1 = ReadByte();        
  210. }*/

  211. //讀取溫度值
  212. TEMPDATA ReadTemperature()
  213. {
  214.         TEMPDATA TempData;
  215.         unsigned int iTempDataH;
  216.         unsigned char btDot, iTempDataL;
  217.         static unsigned char i = 0;

  218.         TempData.btNegative = 0;                                                //為0溫度為正
  219.         i++;
  220.         if (i == 9) i = 1;
  221.         Initialization();
  222.         WriteByte(SKIP_ROM);                                                        //跳過(guò)ROM匹配
  223.         WriteByte(TEMP_SWITCH);                                                        //啟動(dòng)轉(zhuǎn)換
  224.         Delay500ms();                                                                          //調(diào)用一次就行        
  225.         Delay500ms();                          
  226.         Initialization();

  227.         //多個(gè)芯片的時(shí)候用MatchROM(ROMData)換掉WriteByte(SKIP_ROM)
  228.         switch (i)
  229.         {
  230.                 case 1 : MatchROM(ROMData1); break;                        //匹配1
  231.                 case 2 : MatchROM(ROMData2); break;                        //匹配2
  232.                 case 3 : MatchROM(ROMData3); break;                        //匹配3
  233.                 case 4 : MatchROM(ROMData4); break;                        //匹配4        
  234.                 case 5 : MatchROM(ROMData5); break;                        //匹配5
  235.                 case 6 : MatchROM(ROMData6); break;                        //匹配6
  236.                 case 7 : MatchROM(ROMData7); break;                        //匹配7
  237.                 case 8 : MatchROM(ROMData8); break;                        //匹配8
  238.         }
  239.         //WriteByte(SKIP_ROM);                                                        //跳過(guò)ROM匹配(單個(gè)芯片時(shí)用這句換掉上面的switch)
  240.         WriteByte(READ_MEMORY);                                                        //讀數(shù)據(jù)
  241.         iTempDataL = ReadByte();
  242.         iTempDataH = ReadByte();        
  243.         iTempDataH <<= 8;
  244.         iTempDataH |= iTempDataL;

  245.         if (iTempDataH & 0x8000)
  246.         {
  247.                 TempData.btNegative = 1;
  248.                 iTempDataH = ~iTempDataH + 1;                                //負(fù)數(shù)求補(bǔ)
  249.         }

  250. ……………………

  251. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
8路溫度.rar (2.74 MB, 下載次數(shù): 331)

原理圖及PCB圖在附件中

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:471817 發(fā)表于 2019-7-18 08:40 來(lái)自手機(jī) | 只看該作者
學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

板凳
ID:603222 發(fā)表于 2019-8-24 16:55 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

地板
ID:501249 發(fā)表于 2020-2-1 20:35 | 只看該作者
仿真沒(méi)有
回復(fù)

使用道具 舉報(bào)

5#
ID:193421 發(fā)表于 2020-2-24 16:39 | 只看該作者
學(xué)習(xí)了,很有用,謝謝大佬。
回復(fù)

使用道具 舉報(bào)

6#
ID:721707 發(fā)表于 2020-4-16 23:21 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

7#
ID:97678 發(fā)表于 2022-9-16 08:15 | 只看該作者
好東西!!! 找了很久才看到!
回復(fù)

使用道具 舉報(bào)

8#
ID:97678 發(fā)表于 2022-9-23 12:40 | 只看該作者
謝謝分享!!! 原理圖打不開(kāi)了。是不是損壞了?
回復(fù)

使用道具 舉報(bào)

9#
ID:262 發(fā)表于 2022-9-27 01:19 | 只看該作者
jovew 發(fā)表于 2022-9-23 12:40
謝謝分享!!! 原理圖打不開(kāi)了。是不是損壞了?

可以打開(kāi)啊

51hei.png (45.01 KB, 下載次數(shù): 65)

51hei.png
回復(fù)

使用道具 舉報(bào)

10#
ID:1017814 發(fā)表于 2022-9-27 07:41 | 只看該作者
有沒(méi)有仿真圖或?qū)嶋H效果圖啊,學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

11#
ID:97678 發(fā)表于 2022-9-27 08:06 | 只看該作者
文件打開(kāi)了。 謝謝!
奇怪的錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

12#
ID:1047158 發(fā)表于 2022-10-11 19:18 來(lái)自手機(jī) | 只看該作者
焊出的實(shí)物,為啥顯示屏只顯示零啊
回復(fù)

使用道具 舉報(bào)

13#
ID:195496 發(fā)表于 2022-11-12 10:03 | 只看該作者
看了文檔才明白是先一個(gè)一個(gè)讀出ROM,再按ROM調(diào)用,我以為直接實(shí)現(xiàn)了ROM自動(dòng)搜索,看來(lái)ROM搜索是個(gè)難點(diǎn)
回復(fù)

使用道具 舉報(bào)

14#
ID:399179 發(fā)表于 2022-11-12 12:01 來(lái)自手機(jī) | 只看該作者
感謝樓主無(wú)私奉獻(xiàn),收藏了!
回復(fù)

使用道具 舉報(bào)

15#
ID:894868 發(fā)表于 2023-2-10 14:48 | 只看該作者
謝謝分享,學(xué)習(xí)一下18B20
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产视频中文字幕 | 国产精品久久久久久久一区二区 | 最新av在线网址 | 成人精品国产一区二区4080 | 国产精品一区二区免费看 | 国产在线一区观看 | 国产精品久久久久一区二区三区 | 九九热精品在线 | 97色在线视频 | 91大神在线资源观看无广告 | 久久国产精品免费一区二区三区 | 国产伦精品一区二区三区在线 | 久久一区二区三区四区五区 | 曰韩三级| 特级黄一级播放 | 成人午夜精品 | 91一区二区 | 亚洲视频在线看 | 色婷婷综合网站 | 午夜视频一区二区三区 | 亚洲免费成人av | 欧美一级大片 | 91丨九色丨国产在线 | 成人av鲁丝片一区二区小说 | 欧美一级黑人aaaaaaa做受 | 视频在线一区二区 | 91精品国产综合久久久亚洲 | 99国内精品久久久久久久 | 特黄小视频| 草樱av| 日韩免费网站 | 成年女人免费v片 | 国产专区免费 | 欧美日韩高清 | 中文字幕一区二区三区日韩精品 | 亚洲 欧美 另类 综合 偷拍 | 久久r久久 | 99在线资源| 国产精品视频导航 | 电影91久久久 | 美女天天操 |