原创 我的DS18B20汇编程序

2008-11-22 03:04 2808 3 3 分类: MCU/ 嵌入式

我花了很长时间调出了这个程序


但是在温度显示的时候1秒左右会闪动一次


不晓得是什么原因


放上来让大家查查看


图片下次再发上来


TEMPER_L  EQU  29H  ;放读取的低8位
TEMPER_H  EQU  28H  ;放读取的高8位 
A_BIT  EQU  33H    ;百位存储单
B_BIT  EQU  32H    ;十位存储单元
C_BIT  EQU  31H    ;个位存储单元
D_BIT EQU 22H ;个位小数
E_BIT EQU 23H ;十位小数
F_BIT EQU 24H ;百位小数
G_BIT EQU 25H ;千位小数
T_DF EQU 27H
T_INTEGER EQU 30H
DQ  BIT  P3.7
;-------------------主程序---------------------
ORG  0030H
LOOP:
MOV SP,#60H
CLR  EA
LCALL CHU_1820
LCALL  DUWENDU
LCALL  GET_TEMPER
LCALL  T_FORMAT
 
;------------------------DS18B20初始化-----------------------
CHU_1820:
L0:SETB DQ
NOP
CLR DQ
MOV R2,#250
L1:
DJNZ R2,L1
SETB DQ
MOV R2,#25
L15:DJNZ R2,L15
CLR C
ORL C,DQ
JC L0
;CLR P2.0
MOV R6,#23
L16:ORL C,DQ
JC L3
DJNZ R6,L16
SJMP L0
L3:MOV R2,#120
DJNZ R2,$
RET


;------------------------设定暂存器----------------------------
DUWENDU:
CLR EA
LCALL CHU_1820        
JB DQ,TS1
RET
TS1:MOV A,#0CCH     ;跳过ROM匹配
LCALL XIE_1820
MOV A,#4EH    
LCALL XIE_1820
RET
;-----------------------读转换后的温度值------------------------
GET_TEMPER:
            SETB   DQ
            LCALL  CHU_1820
            JB     DQ,TSS2
            RET                  ;若不存在则返回
      TSS2: MOV  A,#0CCH        ;跳过ROM
            LCALL  XIE_1820
            MOV    A,#44H         ;发出温度转换命令
            LCALL   XIE_1820
            LCALL  DISPLAY                       ;延时
            LCALL    CHU_1820
            MOV  A,#0CCH        ;跳过ROM
            LCALL  XIE_1820
            MOV    A,#0BEH         ;发出读温度换命令
            LCALL   XIE_1820
            LCALL   RED_1820    ;读两个字节的温度
            RET



//----------------------写命令到1820--------------------------
XIE_1820:
        CLR EA
        MOV R2,#8
     L9:SETB DQ
        MOV R3,#7
        RRC A
        CLR DQ
        DJNZ R3,$
        MOV DQ,C
        MOV R3,#20
        DJNZ R3,$
        DJNZ R2,L9
        SETB DQ
        RET


//----------------------读出两字节温度数据-----------------------
RED_1820:
        MOV R2,#2
        MOV R1,#TEMPER_L  ;低位存入(TEMPER_L),高位存入(TEMPER_H)
     L7:MOV R3,#8
     L6:CLR C
        CLR DQ
        NOP
        NOP
        NOP
        SETB DQ     ;开始读数据,总线释放
        MOV R4,#4
        DJNZ R4,$         ;总线保持8us
        MOV C,DQ
        RRC A
        MOV R5,#30
     L5:DJNZ R5,L5        ;等待60us释放总线
        DJNZ R3,L6
        MOV @R1,A
        DEC R1     ;指向高8位存储单元
        DJNZ R2,L7
        SETB DQ
        RET


;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:  MOV A, #0FH
           ANL A, TEMPER_L
           MOV T_DF, A       ;获得小数部分(4位)
           MOV A, TEMPER_L
           SWAP A
           MOV TEMPER_L, A


           MOV A, TEMPER_H
           SWAP A
           MOV R0, #TEMPER_L
           XCHD A, @R0


           MOV T_INTEGER, A     ;获得整数部分(1字节)
     AJMP  DISPLAY
           RET


 


; -------------------DISPLAY---------------------
 DISPLAY: 
    MOV A, T_INTEGER
             MOV B,#10
             DIV AB
             MOV C_BIT,B ;个位存在C_BIT
    MOV B,#10
    DIV AB
    MOV A_BIT,A ;百位存在A_BIT
    MOV B_BIT,B ;十位存在B_BIT
             MOV A, T_DF
             MOV R0, #D_BIT
             MOV R2, #4
         D0: MOV B, #10
             MUL AB
             MOV B, #16
             DIV AB
             MOV @R0, A    ;从个位小数D_BIT,到十位E_BIT,百位F_BIT,千位G_BIT
             INC R0
             MOV A, B
             DJNZ R2, D0
             MOV R0,#4
       DPL1: MOV R1,#250 ;显示1000次
      DPLOP: MOV DPTR, #TAB1
          MOV A,C_BIT ;取个位数
             MOVC A,@A+DPTR
             MOV P0,A
             CLR  P1.1
             ACALL  D1MS
             SETB  P1.1
          MOV DPTR, #TAB
    MOV A,B_BIT ;取十位数
             MOVC A,@A+DPTR
             MOV P0,A
             CLR P1.0
             ACALL D1MS
             SETB  P1.0
    /*MOV DPTR, #TAB
    MOV A,A_BIT  ;取百位显示
    JZ  D1    ;判断百位是否是0,是则不显示
   D1: AJMP D2
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P2.1
    ACALL D1MS
    SETB P2.1
    MOV DPTR, #TAB
   D2:*/ MOV A,D_BIT  ;取个位小数
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P1.2
    ACALL D1MS
    SETB P1.2
    MOV DPTR, #TAB
    MOV A,E_BIT   ;取十位小数
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P1.3
    ACALL D1MS
    SETB P1.3
    MOV DPTR, #TAB
     MOV A,F_BIT   ;取百位小数
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P1.4
    ACALL D1MS
    SETB P1.4
    MOV DPTR, #TAB
    MOV A,G_BIT   ;取千位小数
    MOVC A,@A+DPTR
    MOV P0,A
    CLR P1.5
    ACALL D1MS
    SETB P1.5
             DJNZ  R1,DPLOP ;100次没完循环
             DJNZ  R0,DPL1 ;4个100次没完循环
             RET
 ;***********************************
             D1MS: MOV R7,#80   ;1MS延时(按12MHZ算)
             DJNZ R7,$
             RET
   
  //**不带小数点的共阳7段代码**//
;TAB: DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H  ;;共阳
TAB: DB  3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH          ; 共阴
;-------------带小数点的代码-----------
;TAB1:DB  40H,79H,24H,30H,19H,12H,2H,78H,00H,10H     ;共阳
TAB1:DB  0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH  ;共阴
END 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /4 下一条