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

📄 1820program.txt

📁 用51系列单片机实现与DS1820的通信
💻 TXT
字号:
  ;晶振  12MHz
          TEMP_H EQU 20H
          TEMP_L EQU 21H
          FLAG   BIT P2.1
          DQ     BIT P2.0
          ORG 0000H
          ;MOV DPTR,#0000H
          ;MOV 8EH,#01H   ;AUXR中EXTRAM位置0.
          MOV 60H,#00H
          MOV 61H,#00H
          MOV R5,#127
          MOV R7,#0      ;按键计数.

    MAIN:
         ;SETB P1.3

         JNB P1.3,COUNT
         LJMP MAIN
   COUNT:
         INC R7
   CHECK:MOV A,R7
         MOV B,#2
         DIV AB
         MOV A,B
         JNZ WORK   ;按了奇数次,工作
         LJMP UNWORK ;按了偶数次,不工作


  UNWORK:           ;系统不工作.
         MOV P0,#00H
         CLR P1.0
         MOV R3,#2
         DJNZ R3,$
         SETB P1.0
         CLR P1.1
         MOV R3,#2
         DJNZ R3,$
         SETB P1.1
         CLR P1.2
         MOV R3,#2
         DJNZ R3,$
         SETB P1.2
         LJMP MAIN

    WORK:          ;系统工作.
          LCALL GET_TEMP
          LCALL TEMP_COV
          LCALL DATA_TRAN
          JZ INIT
   CONTU: JNB P1.3,COUNT
          LJMP CHECK

 GET_TEMP:         ;读出转换后的温度数据
          SETB DQ
      M01:
          LCALL INIT_1820
          JB FLAG,S01
          LJMP M01
      S01:
          LCALL DELAY0
          MOV A,#0CCH    ;跳过rom匹配
          LCALL WRITE_1820
          MOV A,#4EH     ;发写暂存存储器命令
          LCALL WRITE_1820
          MOV A,#1FH      ;选择9位温度分辨率
          LCALL WRITE_1820
          MOV A,#44H      ;发出温度转换命令
          LCALL WRITE_1820
          NOP
          LCALL DELAY1     ;94毫秒延时
      M02:
          LCALL INIT_1820
          JB FLAG,S02
          LJMP M02
      S02:
          LCALL DELAY0
          MOV A,#0CCH     ;跳过rom匹配
          LCALL WRITE_1820
          MOV A,#0BEH     ;发出读温度命令
          LCALL WRITE_1820
          LCALL READ_1820
          RET

    INIT:
         MOV R5,#127
         MOV 60H,#00H
         MOV 61H,#00H
         LJMP SD_COM
  SD_COM:

         LJMP CONTU




INIT_1820:         ;----------初始化1820.
          SETB DQ
          NOP
          CLR DQ
          MOV R0,#250
     TSR1:
          DJNZ R0,TSR1;延时500us
          SETB DQ
          NOP
          NOP
          NOP
          MOV R0,#40
     TSR2:
          JNB DQ,TSR3
          DJNZ R0,TSR2
          ;JNB DQ,TSR3
          LJMP TSR4
     TSR3:
          SETB FLAG
          LJMP TSR5
     TSR4:
          CLR FLAG
          LJMP TSR7
     TSR5:
          MOV R0,#100
     TSR6:
          DJNZ R0,TSR6
     TSR7:
          SETB DQ
          RET

WRITE_1820:           ;----------写1820,往1820中写入一个字节的数据.
           MOV R2,#8
           CLR C
       WR1:
           CLR DQ
           MOV R3,#3
           DJNZ R3,$
           RRC A
           MOV DQ,C
           MOV R3,#25
           DJNZ R3,$
           SETB DQ
           NOP
           NOP
           DJNZ R2,WR1
           SETB DQ
           RET

READ_1820:        ;---------读1820,从1820中读出两个字节的温度数据.
          MOV R4,#2         ;高位存入20h,低位存入21h
          MOV R1,#21H
     RE00:
          MOV R2,#8
     RE01:
          CLR C
          SETB DQ
          NOP
          NOP
          CLR DQ
          NOP
          NOP
          NOP
          SETB DQ
          MOV R3,#7
          DJNZ R3,$
          MOV C,DQ
          MOV R3,#23
          DJNZ R3,$
          RRC A
          DJNZ R2,RE01
          MOV @R1,A
          DEC R1
          DJNZ R4,RE00
          RET

   DELAY0:              ;64us延时
          MOV R2,#20H
          DJNZ R2,$
          RET

   DELAY1:             ;94ms延时
          MOV R2,#250
     DE01:
          MOV R1,#250
     DE02:
          DJNZ R1,DE02
          DJNZ R2,DE01
          RET

DATA_TRAN:
          MOV DPH,60H
          MOV DPL,61H
          MOV A,20H
          MOVX @DPTR,A
          INC DPTR
          MOV A,21H
          MOVX @R0,A
          INC DPTR
          MOV A,R5
          DEC R5
          MOV 60H,DPH
          MOV 61H,DPL
          RET

TEMP_COV:          ;-------将接收自1820的数据转化为数码管显示
         MOV A,20H         ;的温度数据,并分别送给377.
         JB ACC.0,SIGN
         SJMP UNSIGN
   SIGN:                ;接收到的温度数据为负值.
         MOV A,21H
         CPL A
         INC A
         CLR C
         RRC A
         MOV B,#10
         DIV AB
         MOV 30H,#10
         MOV 31H,A
         MOV 32H,B
         SJMP DISP
  UNSIGN:                ;接收到的温度数据为正值.
         MOV A,21H
         CLR C
         RRC A
         MOV B,#100
         DIV AB
         MOV 30H,A
         MOV A,B
         MOV B,#10
         DIV AB
         MOV 31H,A
         MOV 32H,B
    DISP:               ;分别送桑数码管显示.
         MOV DPTR,#TAB
         MOV A,30H
         MOVC A,@A+DPTR
         MOV P0,A
         CLR P1.0      ;选通第一个数码管
         NOP
         NOP
         NOP
         NOP
         NOP
         SETB P1.0
         MOV A,31H
         MOVC A,@A+DPTR
         MOV P0,A
         CLR P1.1      ;选通第二个数码管
         NOP
         NOP
         NOP
         NOP
         NOP
         SETB P1.1
         MOV A,32H
         MOVC A,@A+DPTR
         MOV P0,A
         CLR P1.2       ;选通第三个数码管
         NOP
         NOP
         NOP
         NOP
         NOP
         SETB P1.2
         RET
    TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H
         DB 7FH,6FH,40H
         END

⌨️ 快捷键说明

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