给楼主个实例吧,用proteus仿真
ds18b20_proteus仿真.rar
下载地址如下
http://zhidao.baidu.com/question/144219943.html?push=core
对,楼上说的很对,proteus。
数字温度计 需要显示吗 那就用数码管 或者 12864之类的液晶屏
http://zhidao.baidu.com/question/144219943.html?push=core
这是DS18B20的驱动,STC89C5224M晶振6T模式下的程序。可以运行,但必须自己改下。
DS18B20:
CLR EA ;使用DS18B20要禁止任何中断产生
LCALL INT ;调用初使化子程序
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A, #44H
LCALL WRITE ;送入温度转换命令
LCALL INT ;温度转换完全,再次初使化DS18B20
MOV A,#0CCH
LCALL WRITE ;送入跳过ROM命令
MOV A,#0BEH
LCALL WRITE ;送入读温度暂存器命令
LCALL READ
MOV TEMP_L,A ;读出温度值低字节
LCALL READ
ANL A,#00000111B ;清除符号位
MOV TEMP_H,A ;读出谩度值高字节
SETB EA ;开中断
OVER_DS18B20:
RET
INT: ;初始化DS18B20子程序
CLR EA
L0:
CLR DS1820 ;DS18B20总线为低复位电平
MOV R3,#4
L1: ;总线复位电平保持400us
MOV R2,#200
DJNZ R2,$
DJNZ R3,L1
SETB DS1820 ;释放DS18B20总线
MOV R2,#120
L4:
DJNZ R2,L4 ;释放DS18B20总线保持60us
CLR C ;清存在信号
ORL C,DS1820
JC L0 ;检测是否存在,不存在则重新来
MOV R2,#255
L5:
ORL C,DS1820
JC L3
DJNZ R2,L5
SJMP L0
MOV R3,#4
L3:
MOV R2,#240
L2:
DJNZ R2,L2
DJNZ R3,L3
RET
WRITE: ;向ds1820写操作命令子程序
CLR EA
MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
WR1:
SETB DS1820
MOV R4,#32
RRC A ;把一个字节data(A)分成8个bit环移给 C
CLR DS1820 ;开始写入ds1820总线要处于复位(低)状态
WR2:
DJNZ R4,WR2 ;ds1820总线复位保持16us
MOV DS1820,C ;写入一个bit
MOV R4,#80
WR3:
DJNZ R4,WR3 ;等待40us
DJNZ R3,WR1 ;写入下一个bit
SETB DS1820 ;重新释放ds1820总线
RET
READ:
CLR EA
MOV R7,#8 ;连续读8个bit
RE1:
CLR DS1820 ;读前总线保持为低
MOV B,#16
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
SETB DS1820 ;读总线释放
RE2:
DJNZ B,RE2 ;持续8us
MOV C,DS1820 ;从ds1820总线读得一个bit
RRC A ;把读得的位值环移给 A
MOV B,#120
RE3:
DJNZ B,RE3 ;持续60us
DJNZ R7,RE1 ;读下一个bit
SETB DS1820 ;重新释放ds1820总线
RET