导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→ds18b20问题,那位大哥急救我[我是一条鱼]

 *第16174篇: ds18b20问题,那位大哥急救我

  
楼 主:我是一条鱼 2003年9月10日11:52
 ds18b20问题,那位大哥急救我

我用软件模拟了以后发现,我的初始化程序出错,也就是找不到DS18B20,返回值为0,我的初始化程序如下:有什么问题吗?除了和软件有关外,我的硬件是这样的,1脚接地,2脚接单片机的一个I/O口,(2脚我试了有上拉4.7k电阻和无上拉电阻的情况,都不行),3脚为NC,悬空。。


INIT18B20 : SETB DQ  ;
  NOP    ;
  NOP    ;
  CLR DQ  ;
  MOV  R6, #0F0H  ; DELAY 480us
  DJNZ R6, $   ;
  SETB DQ  ;
  MOV R6, #25H  ; DELAY 70us
  DJNZ R6, $   ;
   
  JB      DQ,INIT18B20OUT  ;
  SETB DS18B20OK  ;
  MOV R6, #06BH  ; DELAY 200us
  DJNZ R6, $   ;
  RET    ;
;
INIT18B20OUT: SETB DQ  ;
             CLR  DS18B20OK  ;
  RET
 

  
2楼:uxbee 2003年9月10日12:30
 这是我的温度报警的程序,自己看看,不明再问我吧!
 ORG      0000H
AJMP     fff
ORG      0030H
TEMPER_L EQU 36H
TEMPER_H EQU 35H
TEMPER_NUM EQU 37H
FLAG1   EQU 20H
ST0      EQU 38H
BT0      EQU 39H
TEMP0   EQU 3CH
T10      EQU 30H
T        EQU 31H
DQ BIT P1.6
;;;;;;;;;;;;;;;;;;;
fff:  MOV    SP,#0E0H
MOV    R0,#T10
MOV    A,#00H
MOV    R5,#15
T00:   MOV    @R0,A
INC    R0
DJNZ   R5,T00
ACALL  KIN
MOD:   ACALL  TIN
ACALL  DISP1
ACALL  CONT
AJMP   MOD
;;;;;;;;;;;;;;;;;;;;;;;

KIN:   ACALL  CHK
MOV    BT0,ST0
ACALL  DISP
KIN0:  ACALL  KEY
ACALL  DISP
SETB P2.4
SETB P2.5
ACALL  DISP
ACALL  DISP
ACALL  DISP
ACALL  DISP
ACALL  DISP
ACALL  KEY
JZ     KIN0
JNB     ACC.4,S10
MOV    A,#0AH
AJMP   SUM
S10:   JNB     ACC.5,S5
       MOV    A,#01H
       ajmp sum
s5:    JNB    ACC.6,s0
       AJMP SUB
SUM:   ADD    A,ST0
       MOV    ST0,A
       MOV    A,#00H
       ajmp kin1
SUB  :   MOV A,ST0
         CJNE A,#00H,OVER
         MOV st0,#95
         LJMP KIN
OVER :   DEC A
         DEC A
         DEC A
         DEC A
         DEC A
         MOV ST0,A
         AJMP KIN1

KIN1:  ACALL  KEY
       JNZ    KIN1
       AJMP   KIN
S0:    JNB     ACC.7,KIN
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
KEY:   MOV    A,P3
CPL    A
ANL    A,#0F0H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHK:   MOV    A,#99
CLR    C
SUBB   A,ST0
JC     OUTA
MOV    A,#00H
RET
OUTA:  MOV    ST0,#99
ACALL  SOUND
JNB P3.7 ,KIN
MOV    ST0,#00H
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIN:                       ;温度检测
CALL INIT_1820     ;初始化程序
CALL RE_CONFIG     ;写DS18B20暂存存储器设定值
CALL GET_TEMPER
CALL TEMPER_COV
RET                  ;温度检测
; DS18B20初始化程序
INIT_1820:
SETB P1.6
NOP
CLR P1.6
MOV R0,#06BH
MOV R1,#0FH
TSR1:   DJNZ R0,TSR1 ; 延时
MOV R0,#6BH
DJNZ R1,TSR1
SETB P1.6
NOP
NOP
NOP
MOV R0,#25H
TSR2:   JNB P1.6,TSR3
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:   SETB FLAG1 ; 置标志位,表示DS1820存在
LJMP TSR5
TSR4:   CLR FLAG1 ; 清标志位,表示DS1820不存在
LJMP TSR7
TSR5:   MOV R0,#06BH
TSR6:   DJNZ R0,TSR6 ; 延时
TSR7:   SETB P1.6
RET
; 重新写DS18B20暂存存储器设定值
RE_CONFIG:    JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
RET
RE_CONFIG1:   MOV A,#0CCH ; 发SKIP ROM命令
LCALL WRITE_1820
MOV A,#4EH ; 发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ; TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ; TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#1FH ; 选择9位温度分辨率
LCALL WRITE_1820
RET
; 读出转换后的温度值
GET_TEMPER:   SETB P1.6 ; 定时入口
LCALL INIT_1820
JB FLAG1,TSS2
RET ; 若DS18B20不存在则返回
TSS2:           MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
LCALL INIT_1820
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200
MOV TEMPER_NUM,A ; 将读出的温度数据保存
MOV A,#0ECH
CALL WRITE_1820
RET
; 读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:     MOV R2,#8
RE1:            CLR C
SETB P1.6
NOP
NOP
CLR P1.6
NOP
NOP
NOP
SETB P1.6
MOV R3,#7
DJNZ R3,$
MOV C,P1.6
;MOV R3,#23
MOV R3,#200
DJNZ R3,$
RRC A
DJNZ R2,RE1
RET

; 写DS18B20的程序
WRITE_1820:    MOV R2,#8
CLR C
WR1:           CLR P1.6
MOV R3,#6
DJNZ R3,$
RRC A
MOV P1.6,C
MOV R3,#23
DJNZ R3,$
SETB P1.6
NOP
DJNZ R2,WR1
SETB P1.6
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:    MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#36H ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:           MOV R2,#8
RE01:           CLR C
SETB P1.6
NOP
NOP
CLR P1.6
NOP
NOP
NOP
SETB P1.6
MOV R3,#9 ;09
RE10:           DJNZ R3,RE10
MOV C,P1.6
MOV R3,#23
RE20:           DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
; 将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
INC TEMPER_NUM

TEMPER_COV1: MOV A,TEMPER_H
ANL A,#07H
SWAP A
ORL A,TEMPER_NUM
dec a
dec a
dec a
dec a
mov 36h,#00h
mov 35h,#00h
mov 37h,#00h
MOV TEMPER_NUM,A ; 保存变换后的温度数据
LCALL BIN_BCD
RET
; 将16进制的温度数据转换成压缩BCD码
BIN_BCD:        MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV  20H,A
MOV  40H,A
ANL A,#0FH
MOV 31H,A
MOV A,20H
SWAP A
ANL A,#0FH
MOV 30H,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;;;;;;;;;;;;;;;;;;;;;
DISP:   ACALL HTB
;;;;;;;;;;;;;;;;;;;;;
DISP1:  PUSH  ACC
SETB  RS0
SETB  RS1
MOV   R0,#T10
MOV   R1,#00H
MOV   R2,#02H
MOV   R3,#07FH
mov   p2,R3
DISP2:  MOV   A,@R0
MOV   DPTR,#TAB1
MOVC  A,@A+DPTR
MOV   P0,A
MOV   A,R3
MOV   P2,A
DJNZ  R1,$
DJNZ  R1,$
DJNZ  R1,$
DJNZ  R1,$
DJNZ  R1,$
DJNZ  R1,$
RR    A
MOV   R3,A
INC   R0
MOV   A,@R0
DJNZ  R2,DISP2
CLR   RS0
CLR   RS1
POP   ACC
RET
TAB1:   DB   01h,9fh,24h,06h,1ah,42h,0c0h,17h,00h,02h

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HTB:   MOV   A,BT0
MOV   B,#10
DIV   AB
MOV   T,B
MOV   T10,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CONT:   ACALL  TEN
MOV    A,TEMP0          ;温度控制
CLR    C
SUBB   A,ST0
JNC    LOFF
LON:   CLR    P3.0
SETB   P3.1
SJMP   EXIT
LOFF:   SETB   P3.0
ajmp sound
EXIT:   RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TEN:     PUSH  B
PUSH  PSW
MOV   A,40H
PUSH  ACC
ANL   A,#0F0H
SWAP  A
MOV   B,#10
MUL   AB
MOV   B,A
POP   ACC
ANL   A,#0FH
ADD   A,B
MOV   TEMP0,A
POP    PSW
POP    B
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:  MOV    R3,#0FFH    ;延时
DEL2:    MOV   R4,#0FFH
DEL1:    NOP
NOP
NOP
NOP
NOP
NOP
DJNZ  R4,DEL1
DJNZ  R3,DEL2
RET
;;;;;;;;;;;;;;;;;;;;;;;;

;*****************   声子程序 ****
 sound:           mov r2,#1;响2个周期

                bb bit p3.1;
slop1:          clr bb
                 CLR  P3.2
                 CLR  P3.3       ;
                acall d1ms  ;延时
                setb bb   ;使v1 9015截止
                 SETB P3.2
                 SETB P3.3
                acall d1ms
                djnz r2,slop1
                ret

;*******************1ms延时子程序
d1ms:          mov r0,#0ffffh
dloop:         mov r1,#150 ;改变r0的数值将改变声音频率
               djnz r1,$
               djnz r0,dloop
               ret

;***************0.5s延时子程序****************
d05s:           mov r0,#0ffh
d05l1:          mov r1,#0ffh
d05l2:          mov r2,#250
                djnz r2,$
                djnz r1,d05l2
                djnz r0,d05l1
                 ret
BIBISTAR:
                setb p2.1
                setb p3.1
                acall sound
                acall d1ms
                acall d1ms
                clr p3.1
               acall d05s


               acall d1ms
              acall d1ms
              acall d1ms
              RET

END

  
3楼:xjhal7101 2003年9月10日21:31
 [求助]请问?
你用pt100做过温度计吗?
  
4楼:uxbee 2003年9月12日18:20
 没有,只用过DS18B20和AD590,挺好用啊
-
  
5楼:kuolongfei 2003年9月11日09:13
 3脚应该和2脚短接吧?
  
6楼:我是一条鱼 2003年9月11日17:50
 我现在3脚接高电平就可以了
  
7楼:kuolongfei 2003年9月12日10:52
 他是寄生电源的工作方式,可以接高电平,可以和信号线(2脚)短接,就是不能悬空。
如果可以悬空的话那么这个管脚就没意义了
  
8楼:guest 2003年9月11日09:39
 你可以试接CMOS管,可能有用!
你可以试接CMOS管,可能有用!

>>>>>>对该主题发表你的看法

本主题贴数8,分页: [第1页]


[上一篇主题]:请问有谁做过超声波测距离制作?请指教!谢谢!

[下一篇主题]:怎么检测晶振是否正常,有没有最简单的晶振起振条件?[求助]