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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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

[復制鏈接]
跳轉到指定樓層
樓主
做了一個溫度計,18b20用三極管模樣的顯示正常,換帶線的不銹鋼封裝的數碼管顯示不正常,一會顯示溫度,一會應該是全顯,1820的上拉電阻已換4.7K,現象依舊。


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

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

使用道具 舉報

沙發
ID:47184 發表于 2016-11-3 11:37 | 只看該作者
程序如下:用開發板的程序改了三極管驅動的數碼管的程序
//溫度顯示程序==LED顯示,精度0.1攝氏度
//晶振:12M
/******************************************
跳線設置:默認
注意事項: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;
//數據口define interface
uint temp,r;                           //溫度值 variable of temperature

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


/*************精確延時函數*****************/
void delay(unsigned char i)
{
    while(--i);
}
/******************************************
此延時函數針對的是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復位,不要也可行。
delay(1);                  //稍做延時
DQ = 0;                    //單片機拉低總線
delay(250);                //精確延時,維持至少480us
DQ = 1;                    //釋放總線,即拉高了總線
delay(100);                //此處延時有足夠,確保能讓DS18B20發出存在脈沖。
}

uchar Read_One_Byte()       //讀取一個字節的數據read a byte date
                            //讀數據時,數據以字節的最低有效位先從總線移出
{
uchar i   = 0;
uchar dat = 0;
for(i=8;i>0;i--)
{
   DQ = 0;                  //將總線拉低,要在1us之后釋放總線
                           //單片機要在此下降沿后的15us內讀數據才會有效。
   _nop_();                 //至少維持了1us,表示讀時序開始
   dat >>= 1;               //讓從總線上讀到的位數據,依次從高位移動到低位。
   DQ = 1;                  //釋放總線,此后DS18B20會控制總線,把數據傳輸到總線上
   delay(1);                 //延時7us,此處參照推薦的讀時序圖,盡量把控制器采樣時間放到讀時序后的15us內的最后部分
   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時序或寫1時序)開始
   DQ = dat&0x01;                 //從字節的最低位開始傳輸
                                 //指令dat的最低位賦予給總線,必須在拉低總線后的15us內,
                                 //因為15us后DS18B20會對總線采樣。
   delay(10);                     //必須讓寫時序持續至少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);          //溫度轉換指令
Init_Ds18b20();                 //初始化
Write_One_Byte(0xcc);          //忽略ROM指令
Write_One_Byte(0xbe);          //讀暫存器指令
a = Read_One_Byte();           //讀取到的第一個字節為溫度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;      //讀取到的第一個字節為溫度MSB
    temp = b;                    //先把高八位有效數據賦于temp
    temp <<= 8;                    //把以上8位數據從temp低八位移到高八位
    temp = temp|a;                //兩字節合成一個整型變量
    tt = temp*0.0625;              //得到真實十進制溫度值
                                //因為DS18B20可以精確到0.0625度
                                //所以讀回數據的最低位代表的是0.0625度
    temp = tt*10+0.5;               //放大十倍
    return temp;                           //這樣做的目的將小數點后第一位也轉換為可顯示數字
}                                //同時進行一個四舍五入操作。

}


/****************數碼碼動態顯示函數**************/

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];   //顯示十位,使用的是有小數點的數組(因為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為正常溫度值,顯示期間不定時跳到錯誤顯示然后恢復。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区天堂 | 精品国产91 | 日本精品一区二区三区视频 | h在线免费观看 | 国产综合网站 | 一区福利视频 | 日韩福利在线 | 成人亚洲| 日本不卡一区二区三区在线观看 | 中文字幕在线观看www | 久久久99国产精品免费 | 黄色成人免费看 | 久久99精品久久久久久国产越南 | 中文字幕一区二区在线观看 | 中文字幕一区二区三区在线观看 | 日本黄视频在线观看 | 日韩精品在线一区二区 | 欧美中文字幕一区二区三区亚洲 | 亚洲精品久久久久久下一站 | 日韩欧美中文在线 | 在线观看免费av网 | 国精久久 | 日韩免费福利视频 | 午夜免费电影 | 日本免费在线 | 欧美三级三级三级爽爽爽 | 成人午夜精品一区二区三区 | 精品国产一二三区 | 色综合av | 色噜噜色综合 | 欧美久久一区二区三区 | 日韩毛片| 精品久久久一区二区 | 一级少妇女片 | 亚州成人 | 91一区| 日韩欧美在线一区 | 欧美一区二区三区大片 | 色av一区二区 | 免费看a| 久久av资源网 |