導航:首頁 > 操作系統 > 51單片機ds18b20

51單片機ds18b20

發布時間:2022-10-15 09:35:03

㈠ 51單片機與DS18B20做的數字溫度計,為什麼剛上電時都會顯示的值是半秒左右的85

1因為ds18b20內部ad轉換時間大約750mS(12位ad),所以上電後750ms後才能將ad值刷新出來,
2解決方法,進入主程序先轉換採集一次DS18B20,先不送顯示,然後延時約1秒,然後再進入大循環進行採集,送顯示就可以了

㈡ 3.3V 51單片機 型號是10L08XE 測試ds18b20時讀不到數據

單片機類型不同速度差別很大,比如c8051f型,幾乎比89c52快十倍,改一下延時應該就可以了。

㈢ 求大神指點下,51單片機Ds18b20讀出數據異常,高於23度後數據馬上異常,詳細如下:

看你這程序,只有兩位數碼,只能顯示兩位整數溫度了。那為什麼還強制轉 int 呢?
在把讀出溫度轉換十進制數時,是*0.625。
串口發送數據時,不能一次發送int變數,只能發送8位數,而int型變數要發送兩次。

㈣ 最近在學51單片機的溫度感測器DS18B20,其中有讀位元組和寫位元組函數,我想問的是讀的具體含義是什麼

就是用DQ這條匯流排上讀或者寫入數據8次 這樣就一個DQ控制口代替了8個 懂么 簡單的說給DS18b20發送相應的一個位元組命令(8位) 然後18b20讀出2位元組的數據 然後這個數據轉換下 就是溫度 這個懂了吧

㈤ DS18B20 與51單片機 怎麼用

;本程序使用11.0592M晶振,你需要改動的地方僅僅是字型碼及其輸出埠和位選線。
;可以將檢測到的溫度直接顯示到數碼管上
l1
bit
p3.0
l2
bit
p3.6
l3
bit
p3.5;三位數碼管的位選線
outport
equ
p1.0;字型碼的輸出埠
;單片機內存分配申明!
n1
equ
30H
n2
equ
31H
n3
equ
32H//兩位整數和一位小數
TEMPER_L
EQU
29H;用於保存讀出溫度的低8位
TEMPER_H
EQU
28H;用於保存讀出溫度的高8位
FLAG1
EQU
f0;是否檢測到DS18B20標志位
dq
bit
p2.7;數據腳P2.7
ORG
0000H
mov
p3,#0
mov
dptr,#tab
MAIN:
LCALL
GET_TEMPER;調用讀溫度子程序
acall
change
acall
display
AJMP
MAIN
;這是DS18B20復位初始化子程序
INIT_1820:
SETB
dq
NOP
CLR
dq
;主機發出延時537微秒的復位低脈沖
MOV
R1,#3
TSR1:MOV
R0,#107
DJNZ
R0,$
DJNZ
R1,TSR1
SETB
dq;然後拉高數據線
NOP
NOP
NOP
MOV
R0,#25H
TSR2:
JNB
dq,TSR3;等待DS18B20回應
DJNZ
R0,TSR2
LJMP
TSR4
;延時
TSR3:
SETB
FLAG1
;置標志位,表示DS1820存在
LJMP
TSR5
TSR4:
CLR
FLAG1
;清標志位,表示DS1820不存在
LJMP
TSR7
TSR5:
MOV
R0,#117
TSR6:
DJNZ
R0,TSR6
;時序要求延時一段時間
TSR7:
SETB
dq
RET
;讀出轉換後的溫度值
GET_TEMPER:
SETB
dq
LCALL
INIT_1820;先復位DS18B20
JB
FLAG1,TSS2
RET
;判斷DS1820是否存在?若DS18B20不存在則返回
TSS2:
MOV
A,#0CCH
;跳過ROM匹配
LCALL
WRITE_1820
MOV
A,#44H
;發出溫度轉換命令
LCALL
WRITE_1820
;這里通過調用顯示子程序實現延時一段時間,等待轉換結束
rep:
LCALL
DISPLAY
CLR
C
SETB
dq
NOP
NOP
CLR
dq
NOP
NOP
NOP
SETB
dq
MOV
R3,#8
DJNZ
R3,$
MOV
C,dq
MOV
R3,#21
DJNZ
R3,$
jnc
rep
LCALL
INIT_1820;准備讀溫度前先復位
MOV
A,#0CCH
;跳過ROM匹配
LCALL
WRITE_1820
MOV
A,#0BEH
;發出讀溫度命令
LCALL
WRITE_1820
LCALL
READ_18200;將讀出的溫度數據保存到35H/36H
RET
;寫DS18B20的子程序(有具體的時序要求)
WRITE_1820:
MOV
R2,#8;一共8位數據
CLR
C
WR1:
CLR
dq
MOV
R3,#5
DJNZ
R3,$
RRC
A
MOV
dq,C
MOV
R3,#21
DJNZ
R3,$
SETB
dq
NOP
DJNZ
R2,WR1
SETB
dq
RET
READ_18200:
;讀DS18B20的程序,從DS18B20中讀出兩個位元組的溫度數據
MOV
R4,#2
;將溫度高位和低位從DS18B20中讀出
MOV
R1,#29H
;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:
MOV
R2,#8;數據一共有8位
RE01:
CLR
C
SETB
dq
NOP
NOP
CLR
dq
NOP
NOP
NOP
SETB
dq
MOV
R3,#8
RE10:
DJNZ
R3,RE10
MOV
C,dq
MOV
R3,#21
RE20:
DJNZ
R3,RE20
RRC
A
DJNZ
R2,RE01
MOV
@R1,A
DEC
R1
DJNZ
R4,RE00
RET
change:
mov
a,temper_h
anl
a,#00000111B
mov
40h,temper_l
anl
40H,#11110000B
orl
a,40H
swap
a
mov
b,#10
div
ab
movc
a,@a+dptr
mov
n2,a
mov
a,b
movc
a,@a+dptr
mov
n3,a
mov
a,temper_l
anl
a,#1111B
mov
b,#10
mul
ab
mov
b,#16
div
ab
movc
a,@a+dptr
mov
n4,a
ret
display:
mov
outport,n2
setb
l2
acall
delay
clr
l2
mov
outport,n3
clr
outport.2
setb
l3
acall
delay
clr
l3
mov
outport,n4
setb
l4
acall
delay
clr
l4
mov
outport,#1eh
setb
p3.2
acall
delay
clr
p3.2
mov
outport,#27h
setb
p3.3
acall
delay
clr
p3.3
ret
delay:
mov
r7,#0afh
djnz
r7,$
ret
TAB:
DB
05H,0DDH,46H,
54H,
9CH,
34H,24H,5DH,
04H,14H
end

㈥ 51單片機與DS18B20程序

#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P2^2; //數據口define interface
sbit la = P2^6; //數碼管段選
sbit wela = P2^7; //數碼管位選

uint temp; //溫度值 variable of temperature

//不帶小數點
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//帶小數點
unsigned char code table1[] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};

/*************精確延時函數*****************/
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
*******************************************/

/*****************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;
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(); //讀取到的第一個位元組為溫度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; //個位

la = 0;
P0 = table[A1]; //顯示百位
la = 1; //打開段選,對應74573的鎖存位,高電平不鎖存
la = 0;

wela = 0;
P0 = 0x7e;
wela = 1; //打開位選
wela = 0;
delay(0);

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

wela = 0;
P0 = 0x7d;
wela = 1;
wela = 0;
delay(0);

P0 = table[A3]; //顯示個位
la = 1;
la = 0;

P0 = 0x7b;
wela = 1;
wela = 0;
delay(0);
}

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

㈦ 關於51單片機與ds18b20

觀音斯坦說的對,18B20要接上拉,但標準是5K。
實際中一般用4.7K,也可以再小一些,要看線路分布電容的大小,總之應達到一線介面技術規范中上升沿<15us的要求。

㈧ 您好!如何用51單片機顯示DS18b20溫度感測器的溫度變化,並通過藍牙HC08傳送數據給電腦代碼有點難。

你好!
藍牙通訊,是在串口通訊基礎之上完成的,
先完成單片機驅動溫度感測器,實現DS18B20的讀取,
再進行串口通訊,實現和電腦串口收發數據,
加上藍牙模塊,實現無線傳輸

㈨ DS18B20 與51單片機 怎麼用

DS18B20使用:
接線時,面對著扁平的那一面,左負右正,一旦接反就會立刻發熱,有可能燒毀,同時,接反也是導致該感測器總是顯示85℃的原因。實際操作中將正負反接,感測器立即發熱,液晶屏不能顯示讀數,正負接好後顯示85℃。
DS18B20是常用的溫度感測器,具有體積小,硬體開銷低,抗干擾能力強,精度高的特點。
51單片機使用方法:

1.將模擬器插入需模擬的用戶板的CPU插座中,模擬器由用戶板供電;
2.將模擬器的串列電纜和PC機接好,打開用戶板電源;
3.通過Keil C 的IDE 開發模擬環境UV2 下載用戶程序進行模擬、調試。
51單片機是對所有兼容Intel 8031指令系統的單片機的統稱。該系列單片機的始祖是Intel的8004單片機,後來隨著Flash rom技術的發展,8004單片機取得了長足的進展,成為應用最廣泛的8位單片機之一,其代表型號是ATMEL公司的AT89系列,它廣泛應用於工業測控系統之中。很多公司都有51系列的兼容機型推出。

㈩ 51單片機ds18b20小數顯示1602

發出存在脈沖。
51單片機ds18b20小數顯示1602是因為出現了發出存在脈沖導致的。
1602液晶模塊高精度4位小數顯示,溫度解析度0.0625℃,液晶模塊第一行顯示的是DS18B20的64位激光序列號,液晶模塊第二行顯示的是實際溫度。

閱讀全文

與51單片機ds18b20相關的資料

熱點內容
怎麼把電腦里文件夾挪出來 瀏覽:693
java流程處理 瀏覽:683
ftp創建本地文件夾 瀏覽:659
腰椎第一節壓縮 瀏覽:738
xp去掉加密屬性 瀏覽:117
2345怎麼壓縮文件 瀏覽:982
迷你奪寶新演算法 瀏覽:407
伺服器如何防止木馬控制 瀏覽:715
壓縮空氣用電磁閥 瀏覽:742
微信為什麼不能設置加密認證 瀏覽:672
鄧倫參加密室逃脫視頻 瀏覽:391
音頻壓縮編碼標准 瀏覽:300
常提到的app是表示什麼 瀏覽:261
天津程序員傳銷 瀏覽:349
下班之後的程序員 瀏覽:73
檢測支持ssl加密演算法 瀏覽:344
衢州發布新聞什麼APP 瀏覽:85
中國移動長沙dns伺服器地址 瀏覽:252
wifi密碼加密了怎麼破解嗎 瀏覽:599
linux命令cpu使用率 瀏覽:70