这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » 18B20 求助!!!18B20使用!!!!!!江湖救急!!!!!斑竹帮忙!!!

共2条 1/1 1 跳转至

18B20 求助!!!18B20使用!!!!!!江湖救急!!!!!斑竹帮忙!!!!!!

院士
2006-09-17 18:14:16     打赏
18B20 求助!!!18B20使用!!!!!!江湖救急!!!!!斑竹帮忙!!!!!!



关键词: 18B20     求助     使用     江湖     救急     斑竹     帮忙    

院士
2006-12-22 22:43:00     打赏
2楼
问 先谢谢各位大哥了!!
我现在做毕业设计,其中一部分用到18B20做温度采集,自己找了一个程序,单片机晶振11.0592,用的是89C51.现在做仿真,就是测不出温度!!!用的汇编.
采上来的数据全部是FF!!
用的直接接电源的方法,没有上拉电阻.加了也不行.我做的是两路采集.各位大哥帮帮忙看看!!!
程序在这里:
DQ_0     EQU     P1.0
DQ_1     EQU     P1.1
DQ_2     EQU     P1.2
DQ_3     EQU     P1.3

ADDR    EQU    40H
LENGTH    EQU    41H
DAT_BGN    EQU    42H
FLAG_RX    EQU    7FH
_LOCAL    EQU    07H

;CH0 DATA
HI_0    EQU    51H
LO_0    EQU    50H

;CH1 DATA
HI_1    EQU    53H
LO_1    EQU    52H




ORG     0000H
AJMP    MAIN
ORG    0023H

ORG    0100H
MAIN:

    
    
        
SUB_PRO:
    LCALL    SUB_FUNCTION_0    
    LCALL    SUB_FUNCTION_1
    

;//////////////////////////////////CH0
SUB_FUNCTION_0:                ;本子函数将温度转化后存入40H,41H
    PUSH     07H
    PUSH     03H
    ACALL     DS18B20_RST_CH_0    ;复位
    MOV     R7,#0CCH        ;直接开始函数指令
    ACALL     _DS18B20_W8_CH_0
    MOV     R7,#44H            ;命令传感器开始转化温度
    ACALL     _DS18B20_W8_CH_0

    
    MOV     R3,#02H
WAIT5US_0:
    DJNZ     R3,WAIT5US_0        ;延迟几个微秒
    SETB     DQ_0            ;将DQ_0上拉935毫秒,为传感器转化温度供电
    ACALL     DELAY315MS     
    ACALL     DELAY315MS    
    ACALL     DELAY315MS
    CLR     DQ_0

    ACALL     DS18B20_RST_CH_0    ;复位

    MOV     R7,#0CCH        ;直接开始函数指令
    ACALL     _DS18B20_W8_CH_0
    MOV     R7,#0BEH        ;开始读中间存储器
    ACALL     _DS18B20_W8_CH_0
    ACALL     DS18B20_R8_CH_0
    MOV     50H,R7            ;开始读温度值低字节至40H
    ACALL     DS18B20_R8_CH_0
    MOV     51H,R7            ;开始读温度值高字节至41H

    POP 03H
    POP 07H
    RET



;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_0:            ;复位函数
    PUSH     02H
    PUSH     06H
L11O_0:
    CLR     DQ_0            ;将DQ_0清零480US以上
    MOV     R2,#200
L111_0:
    NOP
    DJNZ     R2,L111_0
    SETB     DQ_0        
    MOV     R2,#30
L114_0:
    DJNZ     R2,L114_0
    CLR     C
    ORL     C,DQ_0            ;读DQ_0入C
    JC     L113_0            ;DQ_0为1时初始化结束
    MOV     R6,#80
L115_0:
    ORL     C,DQ_0            ;DQ_0不为1时,继续读DQ_0判断    
    JC     L113_0
    DJNZ     R6,L115_0
    SJMP     L11O_0

L113_0:
    MOV     R2,#250
L112_0:
    DJNZ     R2,L112_0
    POP     02H
    POP     06H
    RET


_DS18B20_W8_CH_0:    ;本函数将R7中的数从DQ_0写出
    PUSH     03H
    PUSH     04H
    MOV     A,R7
    MOV     R3,#8
WR111_0:     
    SETB     DQ_0    
    MOV     R4,#8
    RRC     A            ;R7的低位依次放入C中
    CLR     DQ_0        ;将DQ_0清零15uS以内
WR112_0:
    DJNZ     R4,WR112_0
    MOV     DQ_0,C        ;将C的值置入DQ_0上发出
    MOV     R4,#20
WR113_0:
    DJNZ     R4,WR113_0
    DJNZ     R3,WR111_0        ;循环8次R7的8位依次发出
    SETB     DQ_0
    POP 03H
    POP 04H
    RET
    
    

DS18B20_R8_CH_0:    ;本函数将从DQ_0读数存入R7中
    PUSH     04H
    PUSH     05H
    PUSH     06H
    MOV     R6,#8
RE111_0:
    CLR     DQ_0
    MOV     R4,#6
    NOP
    SETB     DQ_0        ;将DQ_0置1,即放弃DQ_0控制权几个uS
RE112_0:
    DJNZ     R4,RE112_0
    MOV     C,DQ_0        ;从DQ_0中读入一位数,放入C中
    RRC     A            ;将C循环A中
    MOV     R5,#30        
RE113_0:
    DJNZ     R5,RE113_0    
    DJNZ     R6,RE111_0        ;延迟一段时间,再读入一位数,共8次
    MOV     R7,A        ;将读的数放入R7中
    SETB     DQ_0
    POP 04H
    POP 05H
    POP 06H
    RET
    





;///////////////////////////////////CH1
SUB_FUNCTION_1:                ;本子函数将温度转化后存入40H,41H
    PUSH     07H
    PUSH     03H
    ACALL     DS18B20_RST_CH_1    ;复位
    MOV     R7,#0CCH        ;直接开始函数指令
    ACALL     _DS18B20_W8_CH_1
    MOV     R7,#44H            ;命令传感器开始转化温度
    ACALL     _DS18B20_W8_CH_1

    
    MOV     R3,#02H
WAIT5US_1:
    DJNZ     R3,WAIT5US_1        ;延迟几个微秒
    SETB     DQ_1            ;将DQ_1上拉935毫秒,为传感器转化温度供电
    ACALL     DELAY315MS     
    ACALL     DELAY315MS    
    ACALL     DELAY315MS
    CLR     DQ_1

    ACALL     DS18B20_RST_CH_1    ;复位

    MOV     R7,#0CCH        ;直接开始函数指令
    ACALL     _DS18B20_W8_CH_1
    MOV     R7,#0BEH        ;开始读中间存储器
    ACALL     _DS18B20_W8_CH_1
    ACALL     DS18B20_R8_CH_1
    MOV     52H,R7            ;开始读温度值低字节至40H
    ACALL     DS18B20_R8_CH_1
    MOV     53H,R7            ;开始读温度值高字节至41H

    POP 03H
    POP 07H
    RET



;;DS18B20 SERVICE PROGRAM OF CHANNEL 1
DS18B20_RST_CH_1:            ;复位函数
    PUSH     02H
    PUSH     06H
L11O_1:
    CLR     DQ_1            ;将DQ_1清零480US以上
    MOV     R2,#200
L111_1:
    NOP
    DJNZ     R2,L111_1
    SETB     DQ_1        
    MOV     R2,#30
L114_1:
    DJNZ     R2,L114_1
    CLR     C
    ORL     C,DQ_1            ;读DQ_1入C
    JC     L113_1            ;DQ_1为1时初始化结束
    MOV     R6,#80
L115_1:
    ORL     C,DQ_1            ;DQ_1不为1时,继续读DQ_1判断    
    JC     L113_1
    DJNZ     R6,L115_1
    SJMP     L11O_1

L113_1:
    MOV     R2,#250
L112_1:
    DJNZ     R2,L112_1
    POP     02H
    POP     06H
    RET


_DS18B20_W8_CH_1:    ;本函数将R7中的数从DQ_1写出
    PUSH     03H
    PUSH     04H
    MOV     A,R7
    MOV     R3,#8
WR111:     
    SETB     DQ_1    
    MOV     R4,#8
    RRC     A            ;R7的低位依次放入C中
    CLR     DQ_1        ;将DQ_1清零15uS以内
WR112:
    DJNZ     R4,WR112
    MOV     DQ_1,C        ;将C的值置入DQ_1上发出
    MOV     R4,#20
WR113:
    DJNZ     R4,WR113
    DJNZ     R3,WR111        ;循环8次R7的8位依次发出
    SETB     DQ_1
    POP     03H
    POP     04H
    RET
    
    

DS18B20_R8_CH_1:    ;本函数将从DQ_1读数存入R7中
    PUSH     04H
    PUSH     05H
    PUSH     06H
    MOV     R6,#8
RE111_1:
    CLR     DQ_1
    MOV     R4,#6
    NOP
    SETB     DQ_1        ;将DQ_1置1,即放弃DQ_1控制权几个uS
RE112_1:
    DJNZ     R4,RE112_1
    MOV     C,DQ_1        ;从DQ_1中读入一位数,放入C中
    RRC     A            ;将C循环A中
    MOV     R5,#30        
RE113_1:
    DJNZ     R5,RE113_1    
    DJNZ     R6,RE111_1        ;延迟一段时间,再读入一位数,共8次
    MOV     R7,A        ;将读的数放入R7中
    SETB     DQ_1
    POP     04H
    POP     05H
    POP     06H
    RET
    






;/////////////////////////DELAY
DELAY315MS:        ;延迟315MS函数
    PUSH     05H
    PUSH     04H
    MOV     R5,#0FFH
LOOP2:
    MOV     R4,#0FFH
LOOP1:
    NOP
          NOP
          DJNZ     R4,LOOP1
          DJNZ     R5,LOOP2
    POP     04H
    POP     05H
          RET
         END


                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             



END
1: 谢谢啦!帮帮忙啊!!! 2: 我觉得也可能是程序中的延迟有问题!! 3: 有没有人知道啊!!???? 4: 我也觉得也可能是程序中的延迟有问题!!    ACALL     DELAY315MS     
    ACALL     DELAY315MS    
    ACALL     DELAY315MS
可能太久了,好像12位精度都只要750MS。 5: 有一次我用6M的内部时钟竟然做出来了!有一次我用6M的内部时钟竟然做出来了!
效果还不错,结果半天以后就不行了!
调试了3天了,结果还是FF!!!
6: !!我精确的算了一遍延时,改了下.
但是结果还是全一!! 7: 斑竹在吗!!! 8: 复位以后要延时60毫秒,你好像没有做 9: 关于复位??还有一个问题,我在复位时拉高电平后等待的是传感器发过来的高电平还是低电平作为复位成功判断.

SETB  DQ_0  
MOV  R2,#30
L114_0:
DJNZ  R2,L114_0
CLR  C
ORL  C,DQ_0   ;读DQ_0入C
JC  L113_0   ;DQ_0为1时初始化结束
有的书上说是收到低电平初始化结束啊!

请指教!
10: 应该是低电平在复位时,拉高电平后等待传感器反馈低电平作为复位成功判断。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]