⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 at89s51+ds1820.asm.txt

📁 AT89S51控制DS1820日期芯片的源程序
💻 TXT
字号:
我这里有我以前用AT89S51系列单片机写的程序,用PIC没有时间写,大家感兴趣的可以看看!

TEMPER_H    EQU   36H
TEMPER_L    EQU   35H
TEMPER_NUM  EQU   30H
FLAG1       BIT   00H
DQ          BIT   P1.1
        ORG    0000H
        AJMP   START
        ORG    0030H
START:  MOV SP, #60H
        MOV IE, #00H
        MOV TCON,#00H
        MOV TMOD,#10H
        SETB   DQ
        MOV R0, #20H
        MOV R1, #20H
        MOV A,  #00H
START_1:MOV @R0, A
        INC  R0
        DJNZ R1,START_1
START_2:ACALL DISPLAY
        ACALL  INIT_1820       ;DS1820初始化程序
        JNB  FLAG1, START_2  
        NOP      
        ACALL RE_CONFIG        ;重新写DS18B20暂存存储器设定值          
        ACALL GET_TEMPER       ;采集温度值
        ACALL TEMPER_COV       ;温度值转换
        ACALL DISPLAY
        ACALL DISPLAY
        SJMP  START_2
;------DS18B20初始化程序
INIT_1820:
        SETB  DQ
        NOP
        NOP
        CLR   DQ          ; 将数据线下拉500
        ACALL YS500       ; 500延时子程序
        SETB  DQ          ; 释放数据线
        ORL  P1,#02H      ; P1.1转为输入
        ACALL  DELAY1     ; 80延时子程序
        JNB  DQ,TSR3      ; 判断DS18B20是否存在
        AJMP  TSR4        ; 不存在,转TSR4
TSR3:   SETB  FLAG1       ; 置标志位,表示DS1820存在
        AJMP  TSR5
TSR4:   CLR   FLAG1       ; 清标志位,表示DS1820不存在
        AJMP  TSR7
TSR5:   MOV  R0, #6BH     ; 200
TSR6:   DJNZ R0, TSR6     ; 延时
TSR7:   SETB   DQ
        RET
;----重新写DS18B20暂存存储器设定值
RE_CONFIG:
        MOV  A, #0CCH      ;发SKIP ROM命令
        LCALL  WRITE_1820
        MOV  A, #4EH       ;发写暂存存储器命令
        LCALL  WRITE_1820
        MOV  A, #1FH       ;选择9位温度分辨率
        LCALL  WRITE_1820
        RET
;----写DS18B20的程序
WRITE_1820:
        MOV  R2, #8
        CLR  C
WRITE1: CLR  DQ
        MOV  R3, #7        ;延时14
        DJNZ R3, $
        RRC  A
        MOV  DQ, C
        MOV  R3, #21       ;延时45
        DJNZ R3, $
        SETB DQ
        NOP
        DJNZ R2, WRITE1
        SETB DQ
        RET
;-----读出转换后的温度值
GET_TEMPER:
        SETB  DQ           ;定时入口
GET_TMP1:
        LCALL INIT_1820    ;第一步,完成对18B20初始化
        JB FLAG1, GET_TMP2
        LJMP  GET_TMP1     ;若DS18B20不存在,则继续初始化
GET_TMP2:
        LCALL DELAY1       ;延时80
        MOV  A, #0CCH      ;第二步,ROM命令,跳过ROM匹配-0CC
        LCALL  WRITE_1820
        MOV   A, #44H      ;
        LCALL  WRITE_1820
GET_TMP5:
        CLR   DQ
        NOP
        NOP
        SETB  DQ
        MOV  R3, #4
        DJNZ R3, $
        CLR  C
        MOV  C, DQ
        JNC  GET_TMP5
GET_TMP3:
        LCALL  INIT_1820
        JB   FLAG1, GET_TMP4
        LJMP  GET_TMP3
GET_TMP4:
        LCALL DELAY1
        MOV  A, #0CCH
        LCALL  WRITE_1820
        MOV  A, #0BEH
        LCALL  WRITE_1820
        LCALL  READ_1820
        RET
;----读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_1820:
        MOV  R4, #2
        MOV  R1, #35H
READ0:  MOV  R2, #8
        MOV  A,  #00H
READ1:  CLR  C
        SETB  DQ
        NOP
        NOP
        CLR   DQ
        NOP
        NOP
        SETB  DQ
        MOV   R3, #3
        DJNZ  R3, $
        MOV   C,  DQ
        RRC   A
        MOV   R3, #26
        DJNZ  R3, $
        DJNZ  R2, READ1
        MOV   @R1, A
        INC   R1
        DJNZ  R4, READ0
        SETB  DQ
        NOP
        NOP
        CLR   DQ
        ACALL  DELAY1
        SETB   DQ
        RET
;------将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
        MOV A, TEMPER_H
        CJNE A, #0F8H, TEMPER_COV1
        CLR  C
TEMPER_COV1:
        JC  TEMPER_COV2
        CPL  A
        MOV  TEMPER_H, A
        MOV  A, TEMPER_L
        CPL  A
        ADD  A, #01H
        MOV  TEMPER_L, A
TEMPER_COV2:
        MOV  A, TEMPER_L        ;舍去温度低位中小数点后的四位温度数值
        ANL  A, #0F0H
        SWAP  A
        MOV  TEMPER_NUM, A
TEMPER_COV3:
        MOV  A, TEMPER_H
        ANL  A, #07H
        SWAP A
        ORL  A, TEMPER_NUM
        MOV  TEMPER_NUM, A      ;保存变换后的温度数据
        LCALL  BIN_BCD
        RET
;---------将十六进制的温度数据转换成压缩BCD码
BIN_BCD:MOV  DPTR, #TEMP_TAB
        MOV  A,  TEMPER_NUM
        MOVC A, @A+DPTR
        MOV  TEMPER_NUM, 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
;-----显示程序
DISPLAY:SETB  P2.0
        SETB  P2.1
        SETB  P2.2
        SETB  P2.3
        SETB  P2.4
        SETB  P2.5
        MOV DPTR, #TABB
        MOV A, TEMPER_NUM
        ANL A, #0FH
        MOVC A, @A+DPTR
        MOV P0, A
        CLR  P2.7
        SETB P2.6
        LCALL DELAY
        MOV A, TEMPER_NUM
        SWAP A
        ANL A, #0FH
        MOVC A, @A+DPTR
        MOV P0, A
        SETB P2.7
        CLR  P2.6
        LCALL DELAY
        RET
TABB:   DB 28H,7EH,0A2H,62H,74H,61H,21H,7AH,20H,60H
DELAY:  MOV R6, #014H
DEL1:   MOV R7, #0FAH
DEL2:   DJNZ R7, DEL2
        DJNZ R6, DEL1
        RET
DELAY1: MOV R7, #27H
        DJNZ R7, $
        RET
YS500:  MOV R7, #0F9H
YS500_1:DJNZ R7, YS500_1
        RET
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -