打印

关于ds18b20的数码管显示实验,请高手指点

[复制链接]
2444|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangzk|  楼主 | 2009-5-16 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我的源程序,纳闷的是怎么也调不过
请高手看一下,本人感激不尽啊

               DQ    BIT P1.7  ;数据总线
               FLAG1  BIT  F0
               TEMPER_L  EQU  29H  ;温度低位
               TEMPER_H  EQU  28H   ;温度高位
               A_RIT EQU  35H
               B_BIT EQU  36H

               ORG  0000H
               LJMP MAIN
               ORG  0100H


          MAIN:LCALL INT18B20  
               LCALL RECON
               LCALL GETEM
               LJMP  CHANGE?

//*****1820复位时序********//
      INT18B20:SETB  DQ ;拉高
               NOP
               CLR   DQ  ;拉低
               MOV   R0,#0FBH
          TSR1:DJNZ  R0,TSR1  ;延时500us
               SETB  DQ
               MOV   R0,#55H
          TSR2:JNB   DQ,TSR3  ;p1.7低则转移
               DJNZ  R0,TSR2
          TSR3:SETB  FLAG1    ;存在则把标志位置位
               CLR   P0.5
               AJMP  TSR5
          TSR4:CLR   FLAG1   ;不存在则清零
               LJMP  TSR7
          TSR5:MOV   R0,#06BH  
          TSR6:DJNZ  R0,TSR6  ;延时
          TSR7:SETB  DQ       ;最后拉高
               RET

         RECON:JB   FLAG1,RECON
               RET
         RECON1:MOV  A,#0CCH
               LCALL  WRITE
               MOV   A,#4EH
               LCALL  WRITE
               MOV   A,#7DH
               LCALL WRITE
               MOV   A,#00H
               LCALL WRITE
               MOV   A,#1FH
               LCALL WRITE
               RET

        GETEM: SETB  DQ  
               LCALL INT18B20
               JB    FLAG1,TSS2
               RET
         TSS2: MOV  A,#0CCH
               LCALL WRITE
               MOV  A,#44H
               LCALL WRITE
           
               LCALL INT18B20
               MOV  A,#0CCH
               LCALL  WRITE
               MOV  A,#0BEH
               LCALL WRITE
               LCALL READ
               RET

         WRITE:MOV  R2,#8
               CLR  C
           WR1:CLR  DQ
               MOV  R3,#7
               DJNZ  R3,$
               RRC   A
               MOV   DQ,C
               MOV   R3,#22
               DJNZ   R3,$
               SETB   DQ
               NOP
               DJNZ  R2,WR1
               SETB  DQ
               RET


          READ:MOV  R4,#2
               MOV  R1,#29H
         RE00: MOV  R2,#8
          RE01:CLR   C
              
               NOP
               NOP
               SETB  DQ
               NOP
               NOP
            
               CLR  DQ
               MOV   R3,#3
               DJNZ  R3,$
               SETB DQ
               NOP
               NOP
               NOP
               NOP 
               MOV   C,DQ
               MOV   R3,#1EH
               DJNZ  R3,$
               RRC   A
               DJNZ  R2,RE01
               MOV   @R1,A
               DEC   R1
               DJNZ  R4,RE00
               RET


        CHANGE:MOV   A,29H
               MOV   C,28H.0
               RRC   A
               MOV   C,28H.1
               RRC   A
               MOV   C,28H.2
               RRC   A
               MOV   C,28H.3
               RRC   A
               MOV   29H,A
               CLR  P0.5
               LCALL DISPLAY
               CLR  P0.5
               LJMP  MAIN

  //****数码管显示子程序*******//
       DISPLAY:MOV   A,29H
               MOV   B,#10
               DIV   AB
               MOV   B_BIT,A  ;存十位
               MOV   A_RIT,B  ;存个位
               MOV   DPTR,#TAB
               MOV   R0,#4  
          DP11:MOV   R1,#250   ;显示1000次
         DPLOP:MOV   A,A_RIT
               MOVC  A,@A+DPTR;查表
               MOV   P0,A     ;开个位断码
               MOV   A,#0FBH
               MOV   P1,A     ;开位码
               LCALL  DIMS    ;延时
               MOV   A,B_BIT
               MOVC   A,@A+DPTR
               MOV    P0,A
               MOV    A,#07FH
               MOV    P0,A
               DJNZ   R1,DPLOP
               DJNZ   R0,DP11
               RET


          DIMS: MOV  R6,#4
             DL:MOV  R7,#123
            DL1:DJNZ  R7,DL1
            DJNZ  R6,DL     ;延时1ms子程序
                RET
           
                 
         TAB : DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H

相关帖子

沙发
jiyiche| | 2009-5-16 13:03 | 只看该作者

哥们,这样不好

    又是一个把人当仿真器来用的哥们。。。。


    我是个菜鸟,水平也许比你差,但我程序出不来结果的时候,不是把整个程序弄上来,问别人我程序哪里错了。这样没人会耐心的把自己当仿真器来检查你的程序的。你要告诉别人自己做过什么努力,比如单步调过没?调到哪步没得到想要的结果?时序按照数据手册的来写了没?
    对于DS18B20数码管显示调不出来,也许是你DS18B20部分有错,也许是数码管有错,这是要你自己检查出来的。如果是数码管有错,那问题也就简单多了,如果是DS18B20有错,那再继续检查是DS18B20没反应,还是有反应,只是数据错了?
     把范围缩小后再上来提问,才会有人回答你的问题。

使用特权

评论回复
板凳
smileagain| | 2009-5-16 14:11 | 只看该作者

同意楼上的

没有注释的汇编程序一律不看
不描述错误现象的程序更是瞅都不瞅

使用特权

评论回复
地板
不亦心| | 2009-5-17 00:37 | 只看该作者

呵呵,

呵呵,汇编程序确实不好看,除非自己编的才容易看懂
我刚做完这个,看到这里的字母也头疼,没心思看下去

这个程序是不是在那网站找的啊,我见过三四遍了,都是这。


我做了一个,用8255A扩展的I/O,顺便练一下8255
刚弄好,仿真通过,在我QQ空间第一篇日志里,自己去复制:395277303

使用特权

评论回复
5
lost1421| | 2009-5-17 11:48 | 只看该作者

为什么写程序老是不家注解呢?

;===============================================
;名称: INIT_LED_DATA
;输入: None
;输出: None
;功能: Initialize LED data
;===============================================
INIT_LED_DATA:
        JB    POWER_BIT,SET_SLEEP_STATUS
        JNB    TASK_BIT,SET_NO_TIMER
        CALL    HEX_TO_2LED        ; change the initialized time data to decimal and save in LED_DATA0/LED_DATA1
        RET
SET_NO_TIMER:
        MOV    LED_DATA0,#NONE        ; Set the point data
        MOV    LED_DATA1,#POINT    ; Show nothing
        CLR    TIME_FLAG_BIT        ; Clear displaying mark
        RET
SET_SLEEP_STATUS:
        MOV    LED_DATA0,#POINT    ; Set the point data
        MOV    LED_DATA1,#NONE        ; Show nothing
        MOV    TIMER_TICK,#TIMER_NUM    ; Reset the times of Timer0
        RET
;===============================================
;名称: LED_REFLASH
;输入: A
;输出: None
;功能: Reflash LED
;===============================================
LED_REFLASH:
        JB    TIME_FLAG_BIT,NEXT_LED    ; Check whick LED should been refresh this once
        CPL    TIME_FLAG_BIT        ; invers displaying mark
        CLR    LED1_PIN
        CLR    A
        CALL    DISPLAY_7LED        ; Clear 74HC164
        NOP
        MOV    A,LED_DATA0
        CALL    DISPLAY_7LED        ; Display a char
        SETB    LED0_PIN        ; Select the first 7-LED
;        SJMP    END_DISPLAY
        RET
    NEXT_LED:
        CPL    TIME_FLAG_BIT        ; invers displaying mark
        CLR    LED0_PIN
        CLR    A
        CALL    DISPLAY_7LED        ; Clear 74HC164
        NOP
        MOV    A,LED_DATA1
        CALL    DISPLAY_7LED        ; Display a char
        SETB    LED1_PIN        ; Select the second 7-LED
END_DISPLAY:
        RET
;===============================================
;名称: DISPLAY_7LED
;输入: A
;输出: None
;功能: Display data to LED
;===============================================
DISPLAY_7LED:
        MOV    DPTR,#CHAR        ; Set the first address of the Char Table
        MOVC    A,@A+DPTR        ; Look char in the Table
        MOV    SBUF,A            ; Send the char to buffer
WAIT_TI:
        JNB    TI,WAIT_TI        ; Wait the interrupt of serial comunication
        CLR    TI            ; Clear the bit of interrupt
        RET

使用特权

评论回复
6
McuPlayer| | 2009-5-17 12:07 | 只看该作者

罗斯特的程序注释很清晰

只是二姨家论坛的排版,让程序有点变形

使用特权

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

本版积分规则

91

主题

680

帖子

0

粉丝