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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

三個DS18B20接MCU三個IO口程序問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:481090 發表于 2019-2-26 20:10 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用DS18B20傳感器和51單片機做出多路溫度監測系統,但是要用到三個DS18B20,每個DS18B20接一個51單片機管腳,不是單總線的,一個傳感器我已經知道怎么寫了,三個的用最笨的辦法復制三次,但是顯示不行,只能顯示一個溫度,三個都插上的時候,而且溫度也都不會變化,這是什么問題導致的呢,是不是不能用這種方法,如果不行,還有別的什么方法呢,給個大概的思路或者給一個實例。。。謝謝各位大佬了。
#include "DS18B20.h"
   
uchar TPH1;                           //存放溫度值的高字節
uchar TPL1;                           //存放溫度值的低字節

uchar TPH2;                           //存放溫度值的高字節
uchar TPL2;                           //存放溫度值的低字節

uchar TPH3;                           //存放溫度值的高字節
uchar TPL3;                           //存放溫度值的低字節

/**************************************
延時X微秒(STC12C5A60S2@12M)
不同的工作環境,需要調整此函數
此延時函數是使用1T的指令周期進行計算,與傳統的12T的MCU不同
**************************************/
void DelayXus(uchar n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}
/**************************************
第一個 復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset1()
{
    CY = 1;
    while (CY)
    {
        DQ1 = 0;                     //送出低電平復位信號
        DelayXus(240);              //延時至少480us
        DelayXus(240);
        DQ1 = 1;                     //釋放數據線
        DelayXus(60);               //等待60us
        CY = DQ1;                    //檢測存在脈沖
        DelayXus(240);              //等待設備釋放數據線
        DelayXus(180);
    }
}
/**************************************
從DS18B20讀1字節數據
**************************************/
uchar DS18B20_ReadByte1()
{
    uchar i;
    uchar dat = 0;

    for (i=0; i<8; i++)             //8位計數器
    {
        dat >>= 1;
        DQ1 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        DQ1= 1;                     //準備接收
        DelayXus(1);                //接收延時
        if (DQ1) dat |= 0x80;        //讀取數據
        DelayXus(60);               //等待時間片結束
    }

    return dat;
}
/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte1(uchar dat)
{
    char i;

    for (i=0; i<8; i++)             //8位計數器
    {
        DQ1 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        dat >>= 1;                  //送出數據
        DQ1 = CY;
        DelayXus(60);               //等待時間片結束
        DQ1 = 1;                     //恢復數據線
        DelayXus(1);                //恢復延時
    }
}
/**************************************
讀取溫度值
**************************************/
void read_wendu1()
{   
     DS18B20_Reset1();                //設備復位
  DS18B20_WriteByte1(0xCC);        //跳過ROM命令
  DS18B20_WriteByte1(0x44);        //開始轉換命令
  while (!DQ1);                    //等待轉換完成
    DS18B20_Reset1();                //設備復位
  DS18B20_WriteByte1(0xCC);        //跳過ROM命令                                               
  DS18B20_WriteByte1(0xBE);        //讀暫存存儲器命令   
   
    TPL1 = DS18B20_ReadByte1();       //讀溫度低字節
  TPH1 = DS18B20_ReadByte1();       //讀溫度高字節
}


/**************************************
第二個 復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset2()
{
    CY = 1;
    while (CY)
    {
        DQ2 = 0;                     //送出低電平復位信號
        DelayXus(240);              //延時至少480us
        DelayXus(240);
        DQ2 = 1;                     //釋放數據線
        DelayXus(60);               //等待60us
        CY = DQ2;                    //檢測存在脈沖
        DelayXus(240);              //等待設備釋放數據線
        DelayXus(180);
    }
}
/**************************************
從DS18B20讀1字節數據
**************************************/
uchar DS18B20_ReadByte2()
{
    uchar i;
    uchar dat = 0;

    for (i=0; i<8; i++)             //8位計數器
    {
        dat >>= 1;
        DQ2 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        DQ2= 1;                     //準備接收
        DelayXus(1);                //接收延時
        if (DQ2) dat |= 0x80;        //讀取數據
        DelayXus(60);               //等待時間片結束
    }

    return dat;
}
/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte2(uchar dat)
{
    char i;

    for (i=0; i<8; i++)             //8位計數器
    {
        DQ2 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        dat >>= 1;                  //送出數據
        DQ2 = CY;
        DelayXus(60);               //等待時間片結束
        DQ2 = 1;                     //恢復數據線
        DelayXus(1);                //恢復延時
    }
}
/**************************************
讀取溫度值
**************************************/
void read_wendu2()
{   
     DS18B20_Reset2();                //設備復位
  DS18B20_WriteByte2(0xCC);        //跳過ROM命令
  DS18B20_WriteByte2(0x44);        //開始轉換命令
  while (!DQ2);                    //等待轉換完成
    DS18B20_Reset2();                //設備復位
  DS18B20_WriteByte2(0xCC);        //跳過ROM命令                                               
  DS18B20_WriteByte2(0xBE);        //讀暫存存儲器命令   
   
    TPL2 = DS18B20_ReadByte2();       //讀溫度低字節
  TPH2= DS18B20_ReadByte2();       //讀溫度高字節
}






/**************************************
第三個 復位DS18B20,并檢測設備是否存在
**************************************/
void DS18B20_Reset3()
{
    CY = 1;
    while (CY)
    {
        DQ3 = 0;                     //送出低電平復位信號
        DelayXus(240);              //延時至少480us
        DelayXus(240);
        DQ3 = 1;                     //釋放數據線
        DelayXus(60);               //等待60us
        CY = DQ3;                    //檢測存在脈沖
        DelayXus(240);              //等待設備釋放數據線
        DelayXus(180);
    }
}
/**************************************
從DS18B20讀1字節數據
**************************************/
uchar DS18B20_ReadByte3()
{
    uchar i;
    uchar dat = 0;

    for (i=0; i<8; i++)             //8位計數器
    {
        dat >>= 1;
        DQ3 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        DQ3= 1;                     //準備接收
        DelayXus(1);                //接收延時
        if (DQ3) dat |= 0x80;        //讀取數據
        DelayXus(60);               //等待時間片結束
    }

    return dat;
}
/**************************************
向DS18B20寫1字節數據
**************************************/
void DS18B20_WriteByte3(uchar dat)
{
    char i;

    for (i=0; i<8; i++)             //8位計數器
    {
        DQ3 = 0;                     //開始時間片
        DelayXus(1);                //延時等待
        dat >>= 1;                  //送出數據
        DQ3 = CY;
        DelayXus(60);               //等待時間片結束
        DQ3 = 1;                     //恢復數據線
        DelayXus(1);                //恢復延時
    }
}
/**************************************
讀取溫度值
**************************************/
void read_wendu3()
{   
     DS18B20_Reset3();                //設備復位
  DS18B20_WriteByte3(0xCC);        //跳過ROM命令
  DS18B20_WriteByte3(0x44);        //開始轉換命令
  while (!DQ3);                    //等待轉換完成
    DS18B20_Reset3();                //設備復位
  DS18B20_WriteByte3(0xCC);        //跳過ROM命令                                               
  DS18B20_WriteByte3(0xBE);        //讀暫存存儲器命令   
   
    TPL3 = DS18B20_ReadByte3();       //讀溫度低字節
  TPH3 = DS18B20_ReadByte3();       //讀溫度高字節
}


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

使用道具 舉報

沙發
ID:481090 發表于 2019-2-26 20:31 | 只看該作者
void T_Display1() {                 EA=0;                 read_wendu1();//讀取溫度           EA=1;                 wendu1=((TPH1&0x07)*16+TPL1*0.0625)*100;//轉換實際溫度                 LcdSetCursor(6,0);                 LcdWriteDat(0x30+wendu1/1000%10);                 LcdSetCursor(7,0);                 LcdWriteDat(0x30+wendu1/100%10);                  }  void T_Display2() {  EA=0;         read_wendu2();//讀取溫度           EA=1;                 wendu2=((TPH2&0x07)*16+TPL2*0.0625)*100;//轉換實際溫度                 LcdSetCursor(10,0);   LcdWriteDat(0x30+wendu2/1000%10);         LcdSetCursor(11,0);         LcdWriteDat(0x30+wendu2/100%10);}  void T_Display3() {   EA=0;                 read_wendu3();//讀取溫度           EA=1;                 wendu3=((TPH3&0x07)*16+TPL3*0.0625)*100;//轉換實際溫度         LcdSetCursor(14,0);                 LcdWriteDat(0x30+wendu3/1000%10);         LcdSetCursor(15,0);                 LcdWriteDat(0x30+wendu3/100%10);}這是三個顯示的
回復

使用道具 舉報

板凳
ID:403593 發表于 2019-2-27 10:58 | 只看該作者
三個DS18b20共用一個IO口就行,沒必要用三個口,網上有多點測溫的例子,找來看一看就知道怎么回事了
回復

使用道具 舉報

地板
ID:481433 發表于 2019-2-27 11:31 | 只看該作者
一份參考代碼,供參考。

給客戶使用HC32L110 IAP.rar

1.59 MB, 下載次數: 47

回復

使用道具 舉報

5#
ID:481090 發表于 2019-2-27 14:15 | 只看該作者
已經解決,謝謝各位了
回復

使用道具 舉報

6#
ID:491242 發表于 2019-3-20 09:12 | 只看該作者
能發一發你已經做好的程序嗎
回復

使用道具 舉報

7#
ID:737981 發表于 2020-5-22 14:32 | 只看該作者
Su夜已深 發表于 2019-2-27 14:15
已經解決,謝謝各位了

你好,怎么解決的,你還是堅持三個I/o口嗎
回復

使用道具 舉報

8#
ID:282850 發表于 2020-5-22 17:13 | 只看該作者
支持你3個IO口的,多年前我用1線2個DS18,距離上不去,改用了2個IO,程序也是重復模塊的。現在的4個測溫也是用4IO口,不過程序只用了一份。
回復

使用道具 舉報

9#
ID:45879 發表于 2020-6-29 13:04 | 只看該作者
f556 發表于 2020-5-22 17:13
支持你3個IO口的,多年前我用1線2個DS18,距離上不去,改用了2個IO,程序也是重復模塊的。現在的4個測溫也是 ...

方便說一些思路嗎 謝了 正在看這方面的
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品中文字幕在线观看 | 日本成人在线播放 | 成人视屏在线观看 | 久久噜噜噜精品国产亚洲综合 | 色综合激情 | 91香蕉视频在线观看 | 天天澡天天操 | 久久久爽爽爽美女图片 | 男女性毛片 | 久久亚洲欧美日韩精品专区 | 欧美成人在线影院 | 亚洲欧美日韩中文字幕一区二区三区 | 欧美黄色性生活视频 | 久久精品亚洲 | 神马久久久久久久久久 | 国产激情99| 国产精品久久影院 | 欧美a在线 | 国产在线精品一区 | 91精品国产一区二区三区香蕉 | 精久久| 欧美日韩国产三级 | 美女网站视频免费黄 | 欧美在线亚洲 | 欧美一区二区三区在线播放 | 国产高清视频在线观看播放 | 在线一区二区国产 | av在线免费不卡 | 午夜精品一区二区三区免费视频 | 亚洲精品国产一区 | 欧美日韩中文在线 | 国产精品一区二区视频 | 91久久精品国产91久久 | 欧美中文在线 | 成人在线中文字幕 | 国产精品99久久久久久大便 | 国产xxxx在线| 91.色 | 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 精品亚洲91 | 精精国产xxxx视频在线播放 |