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

QQ登錄

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

帖子
查看: 6741|回復(fù): 19
收起左側(cè)

關(guān)于多個(gè)ds18b20測(cè)溫?cái)?shù)碼管顯示的問(wèn)題

  [復(fù)制鏈接]
回帖獎(jiǎng)勵(lì) 100 黑幣 回復(fù)本帖可獲得 20 黑幣獎(jiǎng)勵(lì)! 每人限 1 次(中獎(jiǎng)概率 50%)
ID:86791 發(fā)表于 2015-12-12 10:00 | 顯示全部樓層 |閱讀模式
為什么使用單個(gè)ds18b20測(cè)溫用數(shù)碼管顯示很正常。
當(dāng)多個(gè)ds18b20測(cè)溫時(shí),數(shù)碼管顯示其中一個(gè)ds18b20的溫度時(shí)數(shù)碼管一個(gè)很亮,其他數(shù)碼管很暗還會(huì)一直閃??

源碼:
#include"delay.h"
void delay(uint z)      //毫秒級(jí)延時(shí)函數(shù)
{
     uint x,y;
  for(x=z;x>0;x--)
   for(y=240;y>0;y--);
}
void delay_18B20(uint t)  //ds18b20延時(shí)函數(shù)
{
     while(t--);
}

數(shù)碼管程序:
#include<stc12c5a60s2.h>
#include"smg.h"
#include"delay.h"
#define DataPort P1     //定義數(shù)據(jù)端口 程序中遇到DataPort 則用P0 替換
sbit LATCH2=P2^3;    //位選
sbit LATCH1=P2^2;    //段選
uchar code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code smg_we[]={0xbf,0x7f};
void display(uchar i,uchar dat)
{
       DataPort=0;   //清空數(shù)據(jù),防止有交替重影
       LATCH1=1;     //段鎖存
       LATCH1=0;   
    DataPort=smg_we[i]; //取位碼
       LATCH2=1;     //位鎖存
       LATCH2=0;
    DataPort=smg_du[dat]; //取顯示數(shù)據(jù),段碼
       LATCH1=1;     //段鎖存
       LATCH1=0;
         
//    delay_18B20(200); // 掃描間隙延時(shí),時(shí)間太長(zhǎng)會(huì)閃爍,太短會(huì)造成重影
//    DataPort=0;   //清空數(shù)據(jù),防止有交替重影                  
}

ds18b20程序:
#include<stc12c5a60s2.h>
#include"ds18b20.h"
#include"smg.h"
#include"delay.h"      //注:stc12c5a60s2單片機(jī)執(zhí)行一條語(yǔ)句的時(shí)間是普通51單片機(jī)的1/12,在寫時(shí)序時(shí)一定要注意到
sbit DQ=P2^0;
uchar code str1[]={0x28,0xC2,0x99,0x41,0x07,0x00,0x00,0xBE}; //ROM 1
uchar code str2[]={0x28,0xAE,0x79,0xFA,0x05,0x00,0x00,0x90}; //ROM 2
uchar data disdata[2];
uint tvalue;         //溫度值

void init_ds18b20()//ds1820復(fù)位   
{
DQ=1;          //DQ復(fù)位
delay_18B20(40); //延時(shí)
DQ=0;          //DQ拉低
delay_18B20(1000); //精確延時(shí)大于480us
DQ=1;          //拉高
delay_18B20(400);
}
void write_byte(uchar dat)      //寫一個(gè)字節(jié)
{
    uchar i=0;
    for(i=8;i>0;i--)
    {
   DQ=0;
      DQ=dat&0x01;
      delay_18B20(100);
      DQ=1;
      dat>>=1;
    }
}
uchar read_byte()       //讀一個(gè)字節(jié)
{
    uchar i=0;
uchar dat=0;
for(i=8;i>0;i--)
{  
     DQ=0; //給脈沖信號(hào)
     dat>>=1;
     DQ=1; //給脈沖信號(hào)
     if(DQ)
     dat|=0x80;
     delay_18B20(100);
}
   return(dat);
}
void ds18b20_Matchrom(uchar a)  //匹配ROM
{
char j;
write_byte(0x55);    //發(fā)送匹配ROM命令
if(a==1)
{
for(j=0;j<8;j++)
  write_byte(str1[j]);  //發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
if(a==2)
{
for(j=0;j<8;j++)
  write_byte(str2[j]);  //發(fā)送18B20的序列號(hào),先發(fā)送低字節(jié)
}
}
uchar read_temp(uchar z)   //讀取溫度值并轉(zhuǎn)換
{
    uchar a,b;
init_ds18b20();   
write_byte(0xcc);   //跳過(guò)讀序列號(hào)
init_ds18b20();
if(z==1)
{
  ds18b20_Matchrom(1);   //匹配ROM 1
}
if(z==2)
{
  ds18b20_Matchrom(2);   //匹配ROM  2
}
write_byte(0x44);//*啟動(dòng)溫度轉(zhuǎn)換*/
delay(5);
init_ds18b20();   
write_byte(0xcc);    //跳過(guò)讀序列號(hào)
init_ds18b20();
if(z==1)
{
  ds18b20_Matchrom(1);       //匹配ROM 1
}
if(z==2)
{
  ds18b20_Matchrom(2);    //匹配ROM  2
}
write_byte(0xbe);//*讀取溫度*/
a=read_byte();
b=read_byte();
tvalue=b<<4;
tvalue|=(a&0xf0)>>4;
return(tvalue);
}

void ds1820display()//溫度值顯示
{   
   
   if(z==1)
  {
      read_temp();
      disdata[0]=tvalue%100/10;//十位數(shù)
      display(0,disdata[0]);
   delay_18B20(2000);
   disdata[1]=tvalue%10;//個(gè)位數(shù)
   display(1,disdata[1]);
//   delay(5);
   
      
  }
  
}

主程序;
#include"ds18b20.h"

void main()
{
    init_ds18b20();
    while(1)
{
    ds1820display();    //溫度值顯示
}
}

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:76227 發(fā)表于 2015-12-12 11:34 | 顯示全部樓層
多個(gè)DS18B20的時(shí)候電流較比單個(gè)DS18B20需求的電流大,對(duì)于這種情況建議   你的數(shù)碼管單獨(dú)使用供電電源   不要直接用單片機(jī)上的電源供電
回復(fù)

使用道具 舉報(bào)

ID:99411 發(fā)表于 2015-12-12 12:37 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +20 黑幣

我也不懂,只是想回答拿個(gè)積分下載
回復(fù)

使用道具 舉報(bào)

ID:67175 發(fā)表于 2015-12-20 07:43 | 顯示全部樓層
使用多個(gè)傳感器要用到單總線,你可以看看。
回復(fù)

使用道具 舉報(bào)

ID:94642 發(fā)表于 2016-1-20 15:05 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +20 黑幣

這個(gè)應(yīng)該和硬件有關(guān),和軟件沒(méi)關(guān)系
回復(fù)

使用道具 舉報(bào)

ID:103977 發(fā)表于 2016-1-21 10:20 | 顯示全部樓層
多個(gè)DS18B20的時(shí)候電流較比單個(gè)DS18B20需求的電流大
回復(fù)

使用道具 舉報(bào)

ID:103999 發(fā)表于 2016-1-21 13:24 | 顯示全部樓層
看不到C只會(huì)用匯編
回復(fù)

使用道具 舉報(bào)

ID:115486 發(fā)表于 2016-4-20 19:25 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +20 黑幣

寫的很好
回復(fù)

使用道具 舉報(bào)

ID:115545 發(fā)表于 2016-4-20 20:36 | 顯示全部樓層
這是基于無(wú)線的嗎?
回復(fù)

使用道具 舉報(bào)

ID:75321 發(fā)表于 2016-4-26 16:26 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +20 黑幣

檢查一下你的硬件電路,看電壓是否有跳動(dòng)
回復(fù)

使用道具 舉報(bào)

ID:75321 發(fā)表于 2016-4-26 16:28 | 顯示全部樓層
如果電壓很穩(wěn)定,則可以看看是否存在虛焊的地方;數(shù)碼管與單片機(jī)之間可以去掉限流電阻

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:99938 發(fā)表于 2016-4-26 22:56 | 顯示全部樓層
首先你需要看看電壓是否穩(wěn)定,數(shù)碼管不亮可能是焊接的問(wèn)題,或驅(qū)動(dòng)的地方的焊接。既然一個(gè)能很亮,很可能在焊接的地方。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:97438 發(fā)表于 2016-4-27 09:41 | 顯示全部樓層
和軟件也是有關(guān)系的。。。你的延時(shí)太久了,導(dǎo)致數(shù)碼管刷新很慢,所以會(huì)出現(xiàn)這個(gè)問(wèn)題

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:104472 發(fā)表于 2016-4-27 09:57 | 顯示全部樓層
18b20直接讀出的數(shù)據(jù)在數(shù)碼管上來(lái)不斷刷,造成數(shù)碼管無(wú)法顯示。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:115486 發(fā)表于 2016-5-19 20:39 | 顯示全部樓層
有什么問(wèn)題嗎?
回復(fù)

使用道具 舉報(bào)

ID:115486 發(fā)表于 2016-5-19 20:39 | 顯示全部樓層
怎么只有8幣
回復(fù)

使用道具 舉報(bào)

ID:122080 發(fā)表于 2016-5-19 23:03 | 顯示全部樓層

回帖獎(jiǎng)勵(lì) +20 黑幣

如果寫ROM的時(shí)候選擇了跳過(guò)序列碼模式,可能導(dǎo)致只有一個(gè)溫度傳感器響應(yīng)
回復(fù)

使用道具 舉報(bào)

ID:197037 發(fā)表于 2017-5-5 19:36 | 顯示全部樓層
和軟件也是有關(guān)系的吧。延時(shí)太久會(huì)導(dǎo)致數(shù)碼管刷新很慢的
回復(fù)

使用道具 舉報(bào)

ID:170270 發(fā)表于 2017-5-6 13:26 | 顯示全部樓層
程序的問(wèn)題 數(shù)碼管刷新在2MS左右正常  把顯示程序放在2MS的定時(shí)中斷里面就OK了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表