急!简单的单片机控制DS18B20温度计,proteus仿真不行,图和汇编程序如下;各位大哥帮忙看看吧!谢~~~~~

A_bit EQU 20H
B_bit EQU 21H
FLAG EQU 38H ;定义38H单元存放DS18B20是否存在的标志,名为FLAG。FLAG=1表示DS18B20存在;FLAG=0,表示DS18B20不存在。
DQ bit P2.5 ;定义DS18B20的DQ引脚;主程序部分:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN: ;主程序开始
LCALL RE_temp ;调用温度传感器设置及读取温度子程序,其中包括对传感器DS18B20的复位,写入和读取温度数据
LCALL TURN ;调用数据转化子程序,获得实际测量温度
LCALL DISPLAY ;调用显示子程序,将测量的温度数据在两位数码管上显示出来
JMP MAIN ;主程序循环;
;初始化及读取温度值子程序部分:
RE_temp:
SETB DQ;DQ←1,对DQ置位
CLR FLAG
ACALL RESET_1820 ;调用复位子程序
JNB FLAG,ST ;判断DS18B20是否存在
RET ;子程序返回
ST: ;DS18B20存在
MOV A,#0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;调用写入数据子程序
MOV A, #44H ;发出温度转换命令
ACALL WRITE_1820 ;调用写入数据子程序
ACALL RESET_1820 ;准备读取温度前先复位
MOV A, #0CCH ;跳过ROM匹配
ACALL WRITE_1820 ;调用写入数据子程序
MOV A, #0BEH ;发出读温度命令
ACALL WRITE_1820 ;调用写入数据子程序
ACALL READ_1820 ;调用读取数据子程序
RET ;子程序返回
;DS18B20的复位子程序部分:
RESET_1820:
SETB DQ;
NOP
NOP
CLR DQ
;主机发出复位低脉冲
MOV R1,#3;
DLY: MOV R0,#107;
DJNZ R0,$;
DJNZ R1,DLY;
;拉高数据线
SETB DQ
NOP
NOP
NOP
;等待DS18B20的回应
MOV R0,#25H;
T2:JNB DQ,T3;
DJNZ R0,T2;
JMP T4;
;标志位flag=1,表示DS18B20存在
T3:SETB FLAG
JMP T5;
T5:MOV R0,#117;
T4:RET
;DS18B20的写入子程序部分:
WRITE_1820:
MOV R2,#8 ;一位共8位数据
CLR C ;C=0
WR1:
CLR DQ ;总线低位,开始写入
MOV R3,#7;
DJNZ R3,$ ;保持16us以上
RRC A ;把字节DATA分成8个位,循环给C
MOV DQ,C ;写入一个位;
MOV R3,#23;
DJNZ R3,$ ;等待
SETB DQ ;重新释放总线;
NOP
DJNZ R2,WR1 ;写入下一个位;
SETB DQ
RET
;DS18B20的读取子程序:
READ_1820:
MOV R4 ,#2 ;读取两个字节的数字
MOV R1,#29H ;低位存入29H,高位存入28H
RE0:
MOV R2,#8 ;数据一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ ;读前总线保持为低
NOP
NOP
NOP
SETB DQ ;开始读总线释放
MOV R3,#9;
RE2:
DJNZ R3,RE2 ;延时18us
MOV C,DQ ;从总线读到一个位
MOV R3,#23;
RE3:
DJNZ R3,RE3 ;等待50us
RRC A ;把读得的位值循环移给A
DJNZ R2,RE1 ;读取下一位
MOV @R1,A;
DEC R1
DJNZ R4,RE0;
RET
;数据转化子程序部分:
TURN:
ANL 28H,#07H
ANL 29H,#0F0H
MOV A,28H
ORL 29H,A
MOV A,29H
SWAP A
MOV 29H,A
RET
我已经解决了,不过还是谢谢你~~~~

给你一个参考程序,还带有时钟芯片驱动的

SCL2 BIT P1.3; //SCL2定义为P1口的第3位脚,连接ADC0831SCL脚
SDA2 BIT P1.4; //SDA2定义为P1口的第4位脚,连接ADC0831SDA脚
CS2 BIT P1.6; //CS2定义为P1口的第4位脚,连接ADC0831CS脚
RST BIT P1.5;// DS1302片选,因这两芯片采用同一数据脚(SDA,SCL),所以我们要定义它,将DS1302片选关掉,否则发生冲突
L_DISPLAY EQU 30H
L_TMPDATE1 EQU 38H ;秒
L_TMPDATE2 EQU 39H ;分
L_TMPDATE3 EQU 3AH ;时
L_TMPDATE4 EQU 3BH ;星期
L_TMPDATE5 EQU 3CH ;日
L_TMPDATE6 EQU 3DH ;月
L_TMPDATE7 EQU 3EH ;年

ORG 0100H
write_rtc_address: DB 80H,82H,84H,86H,88H,8aH,8cH
read_rtc_address: DB 81H,83H,85H,87H,89H,8bH,8dH
L_TIMER: DB 00H,59H,18H,01H,01H,01H,01H
TABLE: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
/*共阴数码管 0-9 - 表*/

ORG 0000H
LJMP MAIN

ORG 0200H
MAIN: MOV SP,#60H
CLR RST
LCALL SET_RTC ;先写入初值
M0: LCALL READ_RTC ;循环读取时间数据
MOV R0,#L_DISPLAY
MOV A,L_TMPDATE3 ;把时拆分为两个数据,个时和十时
MOV B,#16
DIV AB
MOV @R0,A ;十时
INC R0
MOV @R0,B ;个时
INC R0
MOV @R0,#10 ;加"-"
INC R0
MOV A,L_TMPDATE2 ;同上
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
INC R0
MOV @R0,#10
INC R0
MOV A,L_TMPDATE1
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
MOV R0,#L_DISPLAY
MOV R7,#8
LCALL DISPLAY
SJMP M0

DISPLAY:MOV DPTR,#TABLE /*R0为地址,R7为个数*/
MOV P2,#0
ANL P1,#0F8H
L2: MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P2,#0
INC P1
INC R0
DJNZ R7,L2
RET

DELAY: MOV R5,#20
D1: DJNZ R5,D1
RET

SET_RTC:MOV R6,#7 ;转输7个数据:秒、分、时、星期、日、月、年
MOV DPTR,#L_TIMER ;初始的7个数据从ROM中转到我们定义的RAM中
MOV R0,#L_TMPDATE1
S0: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R6,S0
MOV R1,#8EH
MOV R2,#0
LCALL W1302 ;首先写入地址8EH为0,即解锁,否则写入不了数据
MOV R0,#L_TMPDATE1 ;数据保存的地址
MOV DPTR,#write_rtc_address ;所写数据的地址
MOV R6,#7 ;写入7个数据:秒、分、时、星期、日、月、年
S1: MOV A,@R0
MOV R2,A
CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL W1302
INC DPTR
INC R0
DJNZ R6,S1
MOV R1,#8EH
MOV R2,#80H
LCALL W1302 ;;最后写入地址8EH为80H,即加上锁,不让写入不了数据
RET

READ_RTC:MOV R6,#7 ;读出7个数据:秒、分、时、星期、日、月、年
MOV R0,#L_TMPDATE1 ;存入定义的RAM中
MOV DPTR,#read_rtc_address
RE0: CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL R1302
MOV @R0,A
INC DPTR
INC R0
DJNZ R6,RE0
RET

W1302B: MOV R7,#8 ;单字节写,R1参数为所写数据
MOV A,R1
W0: RRC A
MOV SDA2,C
NOP
SETB SCL2
NOP
CLR SCL2
DJNZ R7,W0
RET

W1302: CLR RST ;指定地址写入数据,R1:地址,R2:数据
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV A,R2
MOV R1,A
LCALL W1302B
CLR RST
NOP
RET

R1302: MOV R2,#0 ;指定地址读数据,R1:地址,A:返回的数据
CLR RST
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV R7,#8
CLR A
RR0: MOV C,SDA2 ;;单字节读,读出数据存入A传出
RRC A
SETB SCL2
NOP
CLR SCL2
DJNZ R7,RR0
CLR RST
NOP
CLR SCL2
NOP
SETB SCL2
NOP
CLR SDA2
NOP
SETB SDA2
NOP
RET

END
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-15
这里有一个C语言编的,你可以参考一下。http://blog.sina.com.cn/s/blog_534a5d500100bg49.html