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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

ds1820換不銹鋼帶線封裝的就顯示 不正常

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:47184 發(fā)表于 2016-11-3 11:37 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
做了一個溫度計,18b20用三極管模樣的顯示正常,換帶線的不銹鋼封裝的數(shù)碼管顯示不正常,一會顯示溫度,一會應(yīng)該是全顯,1820的上拉電阻已換4.7K,現(xiàn)象依舊。


1820.JPG (133.56 KB, 下載次數(shù): 110)

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

使用道具 舉報

沙發(fā)
ID:47184 發(fā)表于 2016-11-3 11:37 | 只看該作者
程序如下:用開發(fā)板的程序改了三極管驅(qū)動的數(shù)碼管的程序
//溫度顯示程序==LED顯示,精度0.1攝氏度
//晶振:12M
/******************************************
跳線設(shè)置:默認(rèn)
注意事項:ds18b20切勿插反,有爆炸燙傷的危險,方向是ds18b20的平面(有字的一面)朝旁邊的三極管Q4
***/
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^0;
sbit led3=P3^2;
sbit led4=P3^3;
sbit led1=P3^4;
sbit led2=P3^5;
//數(shù)據(jù)口define interface
uint temp,r;                           //溫度值 variable of temperature

//不帶小數(shù)點
unsigned char code table[] = {0x48,0xee,0x54,0x64,0xe2,0x61,0x41,
         0xec,0x40,0x60};
//帶小數(shù)點
unsigned char code table1[] = {0x08,0xae,0x14,0x24,0xa2,0x21,0x01,0xac,0x00,0x20};


/*************精確延時函數(shù)*****************/
void delay(unsigned char i)
{
    while(--i);
}
/******************************************
此延時函數(shù)針對的是12Mhz的晶振
delay(0):延時518us 誤差:518-2*256=6
delay(1):延時7us   (原帖寫"5us"是錯的)
delay(10):延時25us    誤差:25-20=5
delay(20):延時45us    誤差:45-40=5
delay(100):延時205us 誤差:205-200=5
delay(200):延時405us 誤差:405-400=5
*******************************************/

void pdelay(unsigned char i)
{
  uint x,y;
  for(x=i;x>0;x--)
      for(y=110;y>0;y--);
}

/*****************DS18B20******************/

void Init_Ds18b20(void)     //DS18B20初始化send reset and initialization command
{
DQ = 1;                     //DQ復(fù)位,不要也可行。
delay(1);                  //稍做延時
DQ = 0;                    //單片機拉低總線
delay(250);                //精確延時,維持至少480us
DQ = 1;                    //釋放總線,即拉高了總線
delay(100);                //此處延時有足夠,確保能讓DS18B20發(fā)出存在脈沖。
}

uchar Read_One_Byte()       //讀取一個字節(jié)的數(shù)據(jù)read a byte date
                            //讀數(shù)據(jù)時,數(shù)據(jù)以字節(jié)的最低有效位先從總線移出
{
uchar i   = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                  //將總線拉低,要在1us之后釋放總線
                           //單片機要在此下降沿后的15us內(nèi)讀數(shù)據(jù)才會有效。
   _nop_();                 //至少維持了1us,表示讀時序開始
   dat >>= 1;               //讓從總線上讀到的位數(shù)據(jù),依次從高位移動到低位。
   DQ = 1;                  //釋放總線,此后DS18B20會控制總線,把數(shù)據(jù)傳輸?shù)娇偩上
   delay(1);                 //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內(nèi)的最后部分
   if(DQ)                   //控制器進行采樣
   {
    dat |= 0x80;            //若總線為1,即DQ為1,那就把dat的最高位置1;若為0,則不進行處理,保持為0
   }      
   delay(10);               //此延時不能少,確保讀時序的長度60us。
}
return (dat);
}

void Write_One_Byte(uchar dat)
{
uchar i = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                        //拉低總線
   _nop_();                       //至少維持了1us,表示寫時序(包括寫0時序或?qū)?時序)開始
   DQ = dat&0x01;                 //從字節(jié)的最低位開始傳輸
                                 //指令dat的最低位賦予給總線,必須在拉低總線后的15us內(nèi),
                                 //因為15us后DS18B20會對總線采樣。
   delay(10);                     //必須讓寫時序持續(xù)至少60us
   DQ = 1;                        //寫完后,必須釋放總線,
   dat >>= 1;
   delay(1);
}
}

uint Get_Tmp()                   //獲取溫度get the temperature
{
float tt;
uchar a,b,c;
Init_Ds18b20();                //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0x44);          //溫度轉(zhuǎn)換指令
Init_Ds18b20();                 //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0xbe);          //讀暫存器指令
a = Read_One_Byte();           //讀取到的第一個字節(jié)為溫度LSB
b = Read_One_Byte();
c=b&0x80;
if(c==0x80)
{
    r=1;
    temp=b;
    temp<<=8;
    temp=temp|a;
    tt=~temp+1;
    tt=tt*0.0652;
    temp=tt*10+0.5;
    return temp;
}
else
{   
    r=0;      //讀取到的第一個字節(jié)為溫度MSB
    temp = b;                    //先把高八位有效數(shù)據(jù)賦于temp
    temp <<= 8;                    //把以上8位數(shù)據(jù)從temp低八位移到高八位
    temp = temp|a;                //兩字節(jié)合成一個整型變量
    tt = temp*0.0625;              //得到真實十進制溫度值
                                //因為DS18B20可以精確到0.0625度
                                //所以讀回數(shù)據(jù)的最低位代表的是0.0625度
    temp = tt*10+0.5;               //放大十倍
    return temp;                           //這樣做的目的將小數(shù)點后第一位也轉(zhuǎn)換為可顯示數(shù)字
}                                //同時進行一個四舍五入操作。

}


/****************數(shù)碼碼動態(tài)顯示函數(shù)**************/

void Display(uint temp)   //顯示程序
{
uchar A1,A2,A3;
A1 = temp/100;    //百位
A2 = temp%100/10;   //十位
A3 = temp%10;    //個位
if(r==1)
{
led1=1;
P1=0xf7;
pdelay(5);
led1=0;
}
else
{   
   
    led1=0;
}

P1=table[A1];    //顯示百位
led2=1;
pdelay(5);
led2=0;


P1 = table1[A2];   //顯示十位,使用的是有小數(shù)點的數(shù)組(因為temp值擴大了10倍,雖然是十位,實際為個位)
led3 =1;
pdelay(5);
led3=0;

P1 = table[A3];    //顯示個位
led4 = 1;
pdelay(5);
led4=0;
}


void main()
{
while(1)
{   
    Display(Get_Tmp());
  
   }
}




17.5為正常溫度值,顯示期間不定時跳到錯誤顯示然后恢復(fù)。
回復(fù)

使用道具 舉報

板凳
ID:47184 發(fā)表于 2016-11-3 11:42 | 只看該作者
圖片沒有上傳成功,正常溫度顯示17.5,間隔跳到85.0或-85.0.正常溫度會正常變化,錯誤顯示一直是85或-85
回復(fù)

使用道具 舉報

地板
ID:96682 發(fā)表于 2016-11-3 12:52 | 只看該作者
應(yīng)該在硬件上去查找問題,
回復(fù)

使用道具 舉報

5#
ID:47184 發(fā)表于 2016-11-3 13:55 | 只看該作者
wc86110 發(fā)表于 2016-11-3 12:52
應(yīng)該在硬件上去查找問題,

剛剛已經(jīng)解決了,但我還是不知道哪兒出了問題。帶線的ds18b20和以前正常用的不帶線的時序不同,上電85度,出錯誤時候顯示的也是85度,開始把讀溫度函數(shù)里的延時全部加了點,不管用,后來把寫函數(shù)延時加了點就好了。感覺是給1820初始化的時候時序不匹配,寫入不成功,所以讀取就不成功導(dǎo)致顯示錯誤的。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: www.天天操.com | 午夜精品久久久久久久星辰影院 | 久久99久久 | 亚洲在线一区 | www.狠狠干 | 日韩精品成人 | 亚洲精品美女视频 | 亚洲精品不卡 | 久久这里有精品 | 一区二区亚洲 | 国产视频日韩 | 韩日一区二区 | 久久精品一区 | 91精品国产综合久久久密闭 | 成人动漫视频网站 | 精品国产黄色片 | 综合一区 | 国产欧美一区二区精品忘忧草 | 亚洲 日本 欧美 中文幕 | 国产激情99| 久久久入口 | 亚洲国产一 | 欧美日韩精品久久久免费观看 | 黄色国产视频 | 欧洲一区在线观看 | 一区二区三区播放 | 亚洲在线| 欧美视频在线播放 | 91视频在线看 | 成人片免费看 | 久久精品亚洲 | 中文字幕在线不卡 | 色综合桃花网 | 国产午夜影院 | 成人福利在线视频 | 国产91视频一区二区 | gogo肉体亚洲高清在线视 | 激情久久av一区av二区av三区 | 欧美一二三 | 性高湖久久久久久久久3小时 | 国产欧美一区二区三区在线看 |