DS18B20数字温度计

作者&投稿:素军 (若有异议请与网页底部的电邮联系)
用AT89c51与DS18B20做数字温度计proteus怎么连接仿真图和C语言编程?~

1、PROTEUS安装好后,默认不会在桌面上产生快捷方式。先打开开始菜单,依次点击“程序、Proteus 7 Professional、ISIS 7 Professional”打开PROTEUS。

2、单击图中的P,添加单片机等元件。

3、用关键字搜索,89C51,再加几个LED,因为是仿真就不用加限流电阻和晶振复位的元件了。

4、把元件排列放好,再放一个电源。

5、连好导线,只要把鼠标放在管脚上就会自动变成连线图标,十分方便。

6、右键点击单片机,在菜单中选择“EDIT PROPERTIES”。

7、点选图中红框,然后选中要装载的HEX文件。

8、在编译器KEIL中写程序,然后编译成HEX文件。

9、点左下角的三角形开始按钮,可以看到仿真结果。

你好!
1、关于这个数字温度计;
是有实物?发一下原理图
2、还是用仿真模拟出效果?
3、显示器件数码管还是液晶
4、是否带有温度报警功能

下面是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
精度不知道

这是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;
}

}

下面是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
精度不知道

我有程序。


STC 单片机 DALLAS 18B20温度采集高位温度错误求解?
用这个程序试。不行的话换一个18b20.include <reg52.h> define uchar unsigned char define uint unsigned int sbit DQ = P3^3; \/\/定义连接DS18B20的IO口 \/*** 延时函数 功能:在11.059MHz的晶振条件下调用本函数需要24μs ,然后每次计数需16μs \/ void delay1(int useconds) { int s...

DS18B201读取速度不够的问题
你好 对于18b20的速度来说个人感觉有两点值得考虑:首先,750ms是在12位分辨率下的转换时间,也就是0.0625摄氏度,如果用不到高分辨率的话可以把分辨率设低,比如9位,这时的转换时间可减少到大约90ms左右,分辨率0.5摄氏度。一次完整的温度采集周期最少100ms左右。其次,18b20对时序要求比较严格,大部分...

大家好,我想用BS18B20 和单片机89S52做个温度显示(数码管显示),谁有...
include "reg51.h" \/\/ 供参考 char disp[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};char disp_dot[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};sbit DQ = P1^3; \/\/定义通信端口 \/\/晶振12MHz void delay_18B20(unsigned...

求参考一个VB上位机与下位机所用的S18B20进行串口通信的程序_百度知 ...
我用另一台PC机模拟下位机,两台PC机作串行通信,上位PC机接收下位机的温度数据并绘出时间-温度曲线,VB程序可供你参考。运行情况如截图所未,若采纳,则VB工程及附带文件发至你邮箱。

单片机高手给帮忙写个程序吧(急急)
0x87,0xff,0xef}; \/\/带小数点数字编码\/*延时函数*\/void TempDelay (uchar us){ while(us--);}void delay(uint count) \/\/延时子函数{uint i;...DS1820 等待15~60μs,然后发出存在脉冲(一个60~240μs 的低电平信号)。 具体看"倒塌 18b20"文档里的 " 单线复位脉冲时序和1-wire presence detect ...

18B20汇编跪求达人指点
我以前的毕业设计是用到DS18B20,不过我用的是8279显示,可以显示,你只要用我的来采集温度值就可以了,做18b20 做主要的是时序,你在网上找程序,也有可能用的晶振不一样,导致时序不一样,所有发送错误。我的邮箱留下:dxw0712@163.com 你发邮件来,我把程序发给你 ...

请问89s52程序设计
温控程序 include<reg51.h> define uchar unsigned char define uint unsigned int code uchar seven_seg[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit dq = P1^0;uchar a,b;void delay(uint x){ while(x)x--;} uchar read_18b20(){ uchar i,rdata;for(i...

求一个计算机毕业论文题目。
农业大棚温湿度自动检测 54. 无人监守点滴自动监控系统的设计 55. 积分式数字电压表设计 56. 智能豆浆机的设计 57. 采用单片机技术的脉冲频率测量设计 58. 基于DSP的FIR滤波器设计 59. 基于单片机实现汽车报警电路的设计 60. 多功能数字钟设计与制作 61. 超声波倒车雷达系统硬件设计 62. 基于AT89C51单片机的步进...

qq邮箱一打开就出现0×618b20d8指令引用的0×618b20d8内存。该内存不...
qq邮箱一打开就出现0×618b20d8指令引用的0×618b20d8内存。该内存不能为read。 20 我的qq空间也...开始-运行-cmd-输入:for %1 in (%windir%\\system32\\*.dll) do regsvr32.exe \/s %1 ,前面的...无效指针不一定总是0,因此错误提示中的内存地址也不一定为“0x00000000”,而是其他随机数字。 如果系统...

钟山区13995453945: DS18B20数字温度计 - 搜狗百科
卢隶中宝: DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装后的DS18B20可用于电缆沟测温,...

钟山区13995453945: 温度传感器DS18B20的技术参数是多少?
卢隶中宝: 1: 技术性能描述 1.1 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯. 1.2 测温范围 -55℃~+125℃,固有测温分辨率0.5℃. 1.3 支持多点组网功能,多个DS18B20可以并联在唯...

钟山区13995453945: ds18b20的详细介绍和应用 -
卢隶中宝: DS18B20是美国DALLAS半导体公司继DS1820之后最新推出的一种改进型智能温度传感器.与传统的热敏电阻相比,他能够直接读出被测温度并且 可根据实际要求通过简单的编程实现9~12位的数字值读数方式.可以分别在93.75 ms和750 ms...

钟山区13995453945: ds18b20设计一个最简单的数字温度计
卢隶中宝: 完整的8051+DS18B20数字温度计设计4LED显示 电路图+程序+流程图=100 成品=100 至Doshqu@163.com

钟山区13995453945: ds18b20属于哪种温度传感器? -
卢隶中宝: 半导体数字式温度传感器.

钟山区13995453945: FPGA与DS18B20做的数字温度计,为什么刚上电时都会显示的值是半秒左右的0,然后显示正常 -
卢隶中宝: 刚上电时显示的应该是85,这个数值是DS18B20寄存器里的初值,然后经过750ms左右时间采集后才显示真实的温度,你这里显示半秒的0左右应该是程序初始化的时候先做了一次采集温度,然后在这个采集的过程中显示值被赋值为0了,然后等第一次采集时间过了,也就是你说的半秒左右后,程序进入了真正的温度采集的那个循环程序内,以后显示的温度值就是实时的温度值了.换句话说就是那个半秒左右显示0是由于程序刻意编写成这个样子的,如果程序没有刻意写成这个样子,那么刚上电时显示的值会是750ms左右的85,呵呵,这个原因还是比较简单的

钟山区13995453945: 制作DS18B20数字温度计我还想具有报警功能 -
卢隶中宝: DS18B20引脚定义:(1)DQ为数字信号输入/输出端;(需要加个上拉电阻加到电源上) (2)GND为电源地; (3)VDD为外接供电电源输入端(在寄生电源接线方式时接地).本人做过它的课程设计. 以下是程序,你要是有DS18B20的...

钟山区13995453945: 基于DS18B20的单片机温度计 -
卢隶中宝: //这是关于DS18B20的c读写程序,数据脚P1.0,晶振12MHZ//采用的是启东单片机开发板AY-MPU89S51E//进行温度显示,这里我们考虑用四位数码管来显示温度//显示范围-55.0到+99.5度,显示精度为0.5度//关于程序中的延时请参考ds18b20的...

钟山区13995453945: ds18b20数字温度传感器与传统热敏电阻有什么不同 -
卢隶中宝: ds18b20是单总线数字输出,读取结果需要MCU按照极其严格的时序获取结果. 热敏电阻,温度不同,阻值不同,模拟量输出.通过ADC,获取到阻值进而通过查表得到温度数值.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网