欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 三個DS18B20接MCU三個IO口程序問題 [打印本頁]

作者: Su夜已深    時間: 2019-2-26 20:10
標題: 三個DS18B20接MCU三個IO口程序問題
用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();       //讀溫度高字節
}



作者: Su夜已深    時間: 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);}這是三個顯示的
作者: 這一生只為你    時間: 2019-2-27 10:58
三個DS18b20共用一個IO口就行,沒必要用三個口,網上有多點測溫的例子,找來看一看就知道怎么回事了
作者: zjx780922    時間: 2019-2-27 11:31
一份參考代碼,供參考。

給客戶使用HC32L110 IAP.rar

1.59 MB, 下載次數: 47


作者: Su夜已深    時間: 2019-2-27 14:15
已經解決,謝謝各位了
作者: daxiong123    時間: 2019-3-20 09:12
能發一發你已經做好的程序嗎

作者: 五九    時間: 2020-5-22 14:32
Su夜已深 發表于 2019-2-27 14:15
已經解決,謝謝各位了

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

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

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




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1