立即注冊(cè) 登錄
返回首頁(yè)

uid:203025的個(gè)人空間

日志

DS18B20讀取溫度程序代碼段

已有 1394 次閱讀2017-5-23 20:01


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include"reg51.h"
 
#include"d1820.h"
 
int t;
 
uint num;
 
uchar dat; //讀寫數(shù)據(jù)變量
 
uchar a=0;
 
uchar b=0;
 
float tep=0; //讀一個(gè)溫度時(shí)的溫度轉(zhuǎn)換中間間
 
uchar data tempbuf[4]=0;//溫度字型顯示中間變量
 
/******************************************************
 
函數(shù)名稱:delay(uint num)
 
返回值:無(wú)
參數(shù):uint num 
延時(shí)數(shù)據(jù)值
作用:延時(shí)
 
*******************************************************/
 
void delay(uint num)
 
{
 
while(num--);
 
}
 
/******************************************************
 
函數(shù)名稱:void Init_DS18B20(void)
 
返回值:無(wú)
 
參數(shù):無(wú)
 
作用:初始化18B20
 
*******************************************************/
 
void Init_DS18B20(void)
 
{
 
char x=0;
 
DQ=1;
delay(10);//稍作延時(shí)
DQ=0;
delay(80);//延時(shí)>480us 540us
DQ=1; //拉高總線 15-60us
delay(20);
x=DQ;//讀總線狀態(tài) 為0復(fù)位成功,為1則不成功
delay(30);
DQ=1;//釋放總線
}
/******************************************************
函數(shù)名稱:uchar ReadOneChar(void)
返回值:uchar dat
參數(shù): 無(wú)
作用:讀取1820一個(gè)字節(jié)
*******************************************************/
uchar ReadOneChar(void)
{
uchar i;
uchar dat=0;
for(i=0;i<8;i++)
{
DQ=0;
dat>>=1;
DQ=1;//給脈沖
if(DQ)
{dat|=0x80;}//讀1 /// 讀0右移處理
delay(8);//15us內(nèi)讀完一個(gè)數(shù)
}
return(dat);
}
/******************************************************
函數(shù)名稱:void WriteOneChar(uchar dat)
返回值:無(wú)
參數(shù): uchar dat
作用:向1820寫一個(gè)字節(jié)
*******************************************************/
/////****寫DS18B20***/
//寫0 60us讀完,寫1 30us 內(nèi)讀完
 
void WriteOneChar(uchar dat)
{
uchar i=0;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;//寫所給數(shù)據(jù)最低位
delay(10);
///////////
DQ=1;//給脈沖
dat>>=1;
}
delay(8);
}
/******************************************************
函數(shù)名稱:int ReadOneTemperature(void)
返回值:int t
參數(shù): 無(wú)
作用:讀溫度值
*******************************************************/
int ReadOneTemperature(void)
////////***讀取溫度值***********/
//// 每次讀寫均要先復(fù)位
{
Init_DS18B20();
WriteOneChar(0xcc);//發(fā)跳過ROM命令
WriteOneChar(0x44);//發(fā)讀開始轉(zhuǎn)換命令
Init_DS18B20();
WriteOneChar(0xcc);//發(fā)跳過ROM命令
WriteOneChar(0xbe);//讀寄存器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值
a=ReadOneChar(); //a存低字節(jié)
b=ReadOneChar(); //b存高字節(jié)
t=b;
t<<=8;//高字節(jié)轉(zhuǎn)換為10進(jìn)制
t=t|a;
tep=t*0.0625;//轉(zhuǎn)換精度為0.0625/LSB
t=tep*10+0.5;//保留1位小數(shù)并四舍五入****后面除10還原正確溫度值)
return(t);
}
/******************************************************
函數(shù)名稱:uint Temperaturepro(void)
返回值:void
參數(shù): void
作用:溫度處理
*******************************************************/
void Temperaturepro(void)
{
int temp;
temp=ReadOneTemperature();
tempbuf[3]=temp/1000;//百位
tempbuf[2]=temp/100%10;//十位
tempbuf[1]=temp%100/10; //個(gè)位
tempbuf[0]=temp%10; //小數(shù)
}

路過

雞蛋

鮮花

握手

雷人

評(píng)論 (0 個(gè)評(píng)論)

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

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

返回頂部