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

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

QQ登錄

只需一步,快速開始

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

三個(gè)DS18B20接MCU三個(gè)IO口程序問題

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

uchar TPH2;                           //存放溫度值的高字節(jié)
uchar TPL2;                           //存放溫度值的低字節(jié)

uchar TPH3;                           //存放溫度值的高字節(jié)
uchar TPL3;                           //存放溫度值的低字節(jié)

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

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

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

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


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

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

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

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






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

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

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

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


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

使用道具 舉報(bào)

沙發(fā)
ID:481090 發(fā)表于 2019-2-26 20:31 | 只看該作者
void T_Display1() {                 EA=0;                 read_wendu1();//讀取溫度           EA=1;                 wendu1=((TPH1&0x07)*16+TPL1*0.0625)*100;//轉(zhuǎn)換實(shí)際溫度                 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;//轉(zhuǎn)換實(shí)際溫度                 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;//轉(zhuǎn)換實(shí)際溫度         LcdSetCursor(14,0);                 LcdWriteDat(0x30+wendu3/1000%10);         LcdSetCursor(15,0);                 LcdWriteDat(0x30+wendu3/100%10);}這是三個(gè)顯示的
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

給客戶使用HC32L110 IAP.rar

1.59 MB, 下載次數(shù): 47

回復(fù)

使用道具 舉報(bào)

5#
ID:481090 發(fā)表于 2019-2-27 14:15 | 只看該作者
已經(jīng)解決,謝謝各位了
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

你好,怎么解決的,你還是堅(jiān)持三個(gè)I/o口嗎
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产乡下妇女做爰 | 久久在线视频 | 精品国产乱码久久久久久丨区2区 | 欧美美女爱爱 | 在线免费看黄 | 日韩免费毛片视频 | 欧美福利精品 | 色婷婷综合网 | 国产在线aa | 日韩欧美中文字幕在线视频 | 国产一区二区三区色淫影院 | 中文字幕在线观看www | 东方伊人免费在线观看 | 黄色国产视频 | 亚洲成人精品一区二区 | 亚洲高清av在线 | 日日操夜夜操天天操 | 91视频久久 | 欧美一级特黄aaa大片在线观看 | 久草视频观看 | 精品不卡 | 在线播放国产一区二区三区 | 成人一区二区在线 | www亚洲精品 | 中文字幕高清 | 色精品| 黄色免费在线观看网站 | 91亚洲精品在线观看 | 亚洲精品一区中文字幕 | 亚洲毛片在线观看 | 欧美日韩国产在线观看 | japan25hdxxxx日本 做a的各种视频 | 国产精品自拍一区 | 日韩精品一区二区在线观看 | 一二三在线视频 | 精品亚洲一区二区三区 | 黄在线免费观看 | 欧美午夜视频 | 久久精品国产久精国产 | 国产一区二区三区四区区 | 免费黄色片在线观看 |