打印

求个DS18B20的51汇编程序,谢谢!

[复制链接]
3988|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lxyscls|  楼主 | 2008-6-9 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51汇编,单片机用的P89V51RB2,显示用的是MAX7219驱动四位LED

从DS18B20中读数出来进行BCD转换后给MAX7219显示,经检查显示部分的程序没有问题,但是从DS18B20中读出的温度完全不对,求个能用的读温度程序,并顺便把自己写的汇编贴2楼,哪位好心人有空帮我看看错在哪个地方了,谢谢!

相关帖子

沙发
lxyscls|  楼主 | 2008-6-9 19:46 | 只看该作者

显示温度

显示温度为5.68度
我显示到小数点后两位,呵呵~
很奇怪啊~
右移了一下,确实是五度左右~

使用特权

评论回复
板凳
lxyscls|  楼主 | 2008-6-9 20:21 | 只看该作者

独立电源供电

应该不会出现误差很大的情况吧
应该是读写周期的问题,但是都是照着DATASHEET来的哇

使用特权

评论回复
地板
oldzhang| | 2008-6-10 01:43 | 只看该作者

DS18B20的51汇编程序

;DS18B20   data->   20H-28H
           DQ       EQU         P3.5
           ORG      0000H       ;FOSC=6MHZ

MAIN:      LCALL    RESET       ;reset 1820
           LCALL    SKIP_ROM     ;"CCH"
           ;LCALL   MATCH_ROM   ;"55H"
           LCALL    CONVERT     ;"44H"
           LCALL    DELAY1s     ;1S
           LCALL    RESET       ;reset 1820
           LCALL    SKIP_ROM    ;"CCH"
           ;LCALL   MATCH_ROM   ;"55H"
           LCALL    READ_SCRTCH ;READ CONVERT T DATA 9BYTES
           LCALL    MATH
           lcall    display
           LJMP     MAIN
COMMAND:
           LCALL    RESET
           LCALL    READ_ROM
           ;
           LCALL    RESET
           LCALL    READ_SCRTCH   ;Read Scratchpad->20H-28H
           ;
           LCALL    RESET
           LCALL    WRITE_SCRCH   ;Write Scratchpad TH TL (CONFIG)
           ;
           LCALL    RESET
           LCALL    SCRTCH_EE     ;SCRTCH->EEPROM
           ;
           LCALL    RESET
           LCALL    EE_SCRTCH     ;EEPROM->SCRTCH
           ;
;--------- ROM FUNCTION COMMANDS --------
READ_ROM:                        ;Read ROM [33h]
           MOV      R0,#40H      ;READ ROM DATA 9BYTES=>40H-48H
           MOV      A,#33H
           LCALL    RD9BYTE
           RET
MATCH_ROM:                       ;Match ROM [55h]
           MOV      A,#55H
           LCALL    WRBYTE
           MOV      R0,#40H
MATCHLOOP: MOV      A,@R0
           LCALL    WRBYTE
           INC      R0
           CJNE     R0,#48H,MATCHLOOP
           RET
SKIP_ROM:                        ;Skip ROM [CCh]
           MOV      A,#0CCH
           LCALL    WRBYTE
           RET
SEARCH_ROM:                      ;Search ROM [F0h]
           LJMP     $
           RET
ALARM_SEARCH:                    ;Alarm Search [ECh]
           LJMP     $
           RET
;--------- MEMORY COMMAND FUNCTIONS --------
WRITE_SCRCH:                   ;Write Scratchpad [4Eh]
           MOV      A,#4EH
           LCALL    WRBYTE
           MOV      A,29H      ;TH
           LCALL    WRBYTE
           MOV      A,2AH      ;TL
           LCALL    WRBYTE
           MOV      A,2BH      ;DS18B20 D6.D5=00 01 10 11
           LCALL    WRBYTE     ;TEMPRECHER   = 9 10 11 12 BITS
           RET
READ_SCRTCH:                   ;Read Scratchpad [BEh]
           MOV      R0,#20H    ;9BYTES DATA =>20H-28H
           MOV      A,#0BEH
           LCALL    RD9BYTE
           RET
SCRTCH_EE:                     ;Copy Scratchpad [48h]  ;SCRTCH->EEPROM
           MOV      A,#48H
           LCALL    WRBYTE
           RET
CONVERT:                       ;Convert T [44h]
           MOV      A,#44H
           LCALL    WRBYTE
           RET

EE_SCRTCH:                     ;Recall E2 [B8h]  ;EEPROM->SCRTCH
           MOV      A,#0B8H
           LCALL    WRBYTE
           RET
READ_POWER:                    ;Read Power Supply [B4h]
           LJMP     $
;-------------------------------------------------------------------
RESET:     MOV      R6,#10H    ;RESET 1820
           CLR      DQ
           LCALL    DELAY_600
           SETB     DQ
           LCALL    DELAY_60
LOOP:      JNB      DQ,RSTEND
           LCALL    DELAY_15
           DJNZ     R6,LOOP
           SJMP     RESET
RSTEND:    JNB      DQ,$
           RET
RD9BYTE:
           LCALL    WRBYTE
           LCALL    DELAY_15
           MOV      R6,#9    ;READ 9BYTES DATA
RD_LOP:    MOV      R5,#8
RT_LOP:    SETB     DQ
           LCALL    DELAY_45 ;H 45US
           CLR      DQ       ;L 2US
           NOP
           SETB     DQ       ;H 15US
           LCALL    DELAY_15
           MOV      C,DQ
           RRC      A
           LCALL    DELAY_45
           DJNZ     R5,RT_LOP
           MOV      @R0,A
           INC      R0
           DJNZ     R6,RD_LOP
           RET
WRBYTE:    MOV      R6,#8   ;WRITR 1 BYTE
WB_LOP:    CLR      DQ
           LCALL    DELAY_15
           RRC      A
           MOV      DQ,C
           LCALL    DELAY_45
           SETB     DQ
           LCALL    DELAY_15
           DJNZ     R6,WB_LOP
           RET
DELAY_60:  LCALL    DELAY_15
DELAY_45:  LCALL    DELAY_15
DELAY_30:  LCALL    DELAY_15
DELAY_15:  MOV      R7,#2
           DJNZ     R7,$
           RET
DELAY_600: MOV      R7,#100
           DJNZ     R7,$
           RET
DELAY1s:   MOV      R6,#200
DL_LOP2:   DJNZ     R7,$
           DJNZ     R7,$
           DJNZ     R7,$
           DJNZ     R6,DL_LOP2
           RET

使用特权

评论回复
5
lxyscls|  楼主 | 2008-6-10 16:00 | 只看该作者

谢谢楼上

谢谢楼上程序,可以了

但是很奇怪,自己写的时序也基本木问题啊,为啥得出来的温度全是255呢?

怪了~

使用特权

评论回复
6
computer00| | 2008-6-10 16:02 | 只看该作者

估计是时序不对...这个片子对时间有要求...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

30

主题

89

帖子

1

粉丝