DS18B20数字温度计
发布网友
发布时间:2022-04-19 09:50
我来回答
共4个回答
热心网友
时间:2023-07-13 08:35
下面是DS18B20测温实验源程序
ORG 0000H
START: MOV SP,#60H ;开机初始化
MOV P0,#0FFH
MOV P1,#0FEH
MOV P2,#0FFH
MOV P3,#0FFH
MAIN: LCALL GET_TEMPER ;调用读温度子程序
LCALL DISP ;调用数码管显示子程序
AJMP MAIN ;重复循环
;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
SETB P3.3
LCALL RST18B20 ;复位DS18B20
JB 00H,DSS2
RET
DSS2: MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#44H ;向DS18B20发出温度转换命令
LCALL WR18B20
LCALL RST18B20 ;准备读温度前先复位DS18B20
MOV A,#0CCH ;跳过ROM匹配
LCALL WR18B20
MOV A,#0BEH ;向DS18B20发出读温度命令
LCALL WR18B20
LCALL RE18B20 ;读出温度数据
RET
;------ DS18B20复位初始化程序 ------
RST18B20:
SETB P3.3
NOP
CLR P3.3
MOV R0,#06BH ;主机发出复位低脉冲
MOV R1,#03H
DSR1: DJNZ R0,DSR1
MOV R0,#6BH
DJNZ R1,DSR1
SETB P3.3 ;拉高数据线
NOP
NOP
NOP
MOV R0,#25H
DSR2: JNB P3.3,DSR3 ;等待DS18B20回应
DJNZ R0,DSR2
LJMP DSR4
DSR3: SETB 00H ;置标志位,表示DS1820存在
LJMP DSR5
DSR4: CLR 00H ;清标志位,表示DS1820不存在
LJMP DSR7
DSR5: MOV R0,#06BH
DSR6: DJNZ R0,DSR6 ;延时一段时间
DSR7: SETB P3.3
RET
;------ 写DS18B20的子程序 ------
WR18B20:
MOV R2,#8
CLR C
WR1: CLR P3.3
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.3,C
MOV R3,#23
DJNZ R3,$
SETB P3.3
NOP
DJNZ R2,WR1
SETB P3.3
RET
;------ 从DS18B20中读温度数据程序 ------
RE18B20:
MOV R4,#2
MOV R1,#2FH
RE00: MOV R2,#8
RE01: CLR C
SETB P3.3
NOP
NOP
CLR P3.3
NOP
NOP
NOP
SETB P3.3
MOV R3,#09
RE10: DJNZ R3,RE10
MOV C,P3.3
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;-------- 显示子程序 --------
DISP: MOV A,2FH
MOV C,70H
RRC A
MOV C,71H
RRC A
MOV C,72H
RRC A
MOV C,73H
RRC A
MOV 2FH,A
MOV A,2FH
MOV B,#10
DIV AB
MOV 30H,A
MOV 31H,B
MOV A,30H
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A ;显示温度“十位”值
CLR P2.2
SETB P2.0
SETB P2.1
SETB P2.3
SETB P2.4
LCALL YS4722U
MOV A,31H
MOV DPTR,#SGTB
MOVC A,@A+DPTR
MOV P0,A ;显示温度“个位”值
CLR P2.3
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.4
LCALL YS4722U
MOV A,#01000110B
MOV P0,A ;显示温度符号“ ℃”
CLR P2.4
SETB P2.0
SETB P2.1
SETB P2.2
SETB P2.3
LCALL YS4722U
RET
;************* 8位共阳数码管显示器字型码表 *****************
SGTB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
YS4722U:
MOV R4,#10 ;延时子程序
Y3: MOV R5,#216
DJNZ R5,$
DJNZ R4,Y3
RET
END
精度不知道
热心网友
时间:2023-07-13 08:35
这是c语言的.你就将就一下:
#include"reg51.h"
#include"intrins.h"
unsigned char templ=0;
unsigned char temph=0;
unsigned char tempdot=0;
bit fuhao_flag=0;
float temperature=0;
unsigned char t=0;
unsigned char tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
unsigned char ledbitpos=0;
sbit dq=P1^0;
sbit num_shiwei=P2^5;
sbit num_gewei=P2^4;
sbit fuhaowei=P2^3;
sbit shiwei=P2^2;
sbit gewei=P2^1;
sbit dot=P2^0;
void Delay5us(unsigned char n)
{
unsigned char i;
i=n;
do
{
_nop_();_nop_();_nop_();
i--;
}
while(i);
return;
}
void Delay5ms(unsigned char n)
{
unsigned char i;
i=n;
do
{
Delay5us(200);
Delay5us(200);
Delay5us(200);
Delay5us(200);
Delay5us(200);
i--;
}
while(i);
}
bit init_ds18b20(void)
{
bit bresult=0;
EA=0;
dq=1;
Delay5us(8);
dq=0;
Delay5us(90);
dq=1;
Delay5us(6);
bresult=dq;
Delay5us(20);
EA=1;
return bresult;
}
bit readbit()
{
bit b;
dq=0;
_nop_();
_nop_();
_nop_();
_nop_();
dq=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
b=dq;
Delay5us(4);
return b;
}
unsigned char readonechar(void)
{
unsigned char i=0;
unsigned char dat=0;
EA=0;
for(i=8;i>0;i--)
{
dat=_cror_(dat,1);
if(readbit())
dat|=0x80;
else
dat|=0x00;
}
EA=1;
return dat;
}
void writebit(bit dq1)
{
unsigned char j;
if(!dq1)
{
dq=0;
for(j=35;j>0;j--);
dq=1;
}
else
{
dq=0;
for(j=2;j>0;j--);
dq=1;
for(j=33;j>0;j--);
}
}
void writeonechar(unsigned char command)
{
unsigned char i;
EA=0;
for(i=0;i<8;i++)
{
writebit(command & 0x01);
command=_cror_(command,1);
}
EA=1;
}
void t0() interrupt 1 using 0
{
TH0=0xf8;
TL0=0x30;
ledbitpos++;
switch(ledbitpos)
{
case 1:
P0=tab[tempdot];
fuhaowei=0;
shiwei=0;
gewei=0;
dot=1;
break;
case 2:
P0=0x7f & tab[t%10];
fuhaowei=0;
shiwei=0;
gewei=1;
dot=0;
break;
case 3:
P0=tab[t%100/10];
fuhaowei=0;
shiwei=1;
gewei=0;
dot=0;
break;
case 4:
if(fuhao_flag==0)
{
P0=tab[t/100];
fuhaowei=1;
shiwei=0;
gewei=0;
dot=0;
}
else
{
P0=tab[10];
fuhaowei=1;
shiwei=0;
gewei=0;
dot=0;
}
break;
default:
ledbitpos=0;
break;
}
}
void display232(unsigned i)
{
TI=0;
SBUF=i/100+48;
while(TI==0);
TI=0;
SBUF=i%100/10+48;
while(TI==0);
TI=0;
SBUF=i%10+48;
while(TI==0);
TI=0;
SBUF=46;
while(TI==0);
TI=0;
SBUF=tempdot+48;
while(TI==0);
TI=0;
SBUF=0x0d;
while(TI==0);
TI=0;
SBUF=0x0a;
while(TI==0);
}
void main(void)
{
TMOD=0x21;
TH0=0xf8;
TL0=0x30;
ET0=1;
EA=1;
TR0=0;
TH1=0xfd;
TL1=0xfd;
SCON=0xd8;PCON=0x00;
TR1=1;
while(1)
{
if(!init_ds18b20())
{
writeonechar(0xcc);
writeonechar(0x44);
Delay5ms(200);
}
if(!init_ds18b20())
{
writeonechar(0xcc);
writeonechar(0xbe);
templ=readonechar();
temph=readonechar();
}
fuhao_flag=temph>>4;
tempdot=(10*(templ & 0x0f))/16;
templ=templ>>4;
t=temph<<4;
t=t|templ;
display232(t);
TR0=1;
}
}
热心网友
时间:2023-07-13 08:36
下面是DS18B20测温实验源程序
ORG
0000H
START:
MOV
SP,#60H
;开机初始化
MOV
P0,#0FFH
MOV
P1,#0FEH
MOV
P2,#0FFH
MOV
P3,#0FFH
MAIN:
LCALL
GET_TEMPER
;调用读温度子程序
LCALL
DISP
;调用数码管显示子程序
AJMP
MAIN
;重复循环
;------
读DS18B20传感器的温度值
------
GET_TEMPER:
SETB
P3.3
LCALL
RST18B20
;复位DS18B20
JB
00H,DSS2
RET
DSS2:
MOV
A,#0CCH
;跳过ROM匹配
LCALL
WR18B20
MOV
A,#44H
;向DS18B20发出温度转换命令
LCALL
WR18B20
LCALL
RST18B20
;准备读温度前先复位DS18B20
MOV
A,#0CCH
;跳过ROM匹配
LCALL
WR18B20
MOV
A,#0BEH
;向DS18B20发出读温度命令
LCALL
WR18B20
LCALL
RE18B20
;读出温度数据
RET
;------
DS18B20复位初始化程序
------
RST18B20:
SETB
P3.3
NOP
CLR
P3.3
MOV
R0,#06BH
;主机发出复位低脉冲
MOV
R1,#03H
DSR1:
DJNZ
R0,DSR1
MOV
R0,#6BH
DJNZ
R1,DSR1
SETB
P3.3
;拉高数据线
NOP
NOP
NOP
MOV
R0,#25H
DSR2:
JNB
P3.3,DSR3
;等待DS18B20回应
DJNZ
R0,DSR2
LJMP
DSR4
DSR3:
SETB
00H
;置标志位,表示DS1820存在
LJMP
DSR5
DSR4:
CLR
00H
;清标志位,表示DS1820不存在
LJMP
DSR7
DSR5:
MOV
R0,#06BH
DSR6:
DJNZ
R0,DSR6
;延时一段时间
DSR7:
SETB
P3.3
RET
;------
写DS18B20的子程序
------
WR18B20:
MOV
R2,#8
CLR
C
WR1:
CLR
P3.3
MOV
R3,#6
DJNZ
R3,$
RRC
A
MOV
P3.3,C
MOV
R3,#23
DJNZ
R3,$
SETB
P3.3
NOP
DJNZ
R2,WR1
SETB
P3.3
RET
;------
从DS18B20中读温度数据程序
------
RE18B20:
MOV
R4,#2
MOV
R1,#2FH
RE00:
MOV
R2,#8
RE01:
CLR
C
SETB
P3.3
NOP
NOP
CLR
P3.3
NOP
NOP
NOP
SETB
P3.3
MOV
R3,#09
RE10:
DJNZ
R3,RE10
MOV
C,P3.3
MOV
R3,#23
RE20:
DJNZ
R3,RE20
RRC
A
DJNZ
R2,RE01
MOV
@R1,A
DEC
R1
DJNZ
R4,RE00
RET
;--------
显示子程序
--------
DISP:
MOV
A,2FH
MOV
C,70H
RRC
A
MOV
C,71H
RRC
A
MOV
C,72H
RRC
A
MOV
C,73H
RRC
A
MOV
2FH,A
MOV
A,2FH
MOV
B,#10
DIV
AB
MOV
30H,A
MOV
31H,B
MOV
A,30H
MOV
DPTR,#SGTB
MOVC
A,@A+DPTR
MOV
P0,A
;显示温度“十位”值
CLR
P2.2
SETB
P2.0
SETB
P2.1
SETB
P2.3
SETB
P2.4
LCALL
YS4722U
MOV
A,31H
MOV
DPTR,#SGTB
MOVC
A,@A+DPTR
MOV
P0,A
;显示温度“个位”值
CLR
P2.3
SETB
P2.0
SETB
P2.1
SETB
P2.2
SETB
P2.4
LCALL
YS4722U
MOV
A,#01000110B
MOV
P0,A
;显示温度符号“
℃”
CLR
P2.4
SETB
P2.0
SETB
P2.1
SETB
P2.2
SETB
P2.3
LCALL
YS4722U
RET
;*************
8位共阳数码管显示器字型码表
*****************
SGTB:
DB
0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB
88H,83H,0C6H,0A1H,86H,8EH,89H,0A3H,8CH,0C8H
YS4722U:
MOV
R4,#10
;延时子程序
Y3:
MOV
R5,#216
DJNZ
R5,$
DJNZ
R4,Y3
RET
END
精度不知道
热心网友
时间:2023-07-13 08:37
我有程序。