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

📄 ds18b20asma.asm

📁 ds18b20温度检测
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          ANL     A,#0FH           ;
          SWAP    A                ; TEMPLC HI = 个位数 BCD
          ORL     A,TEMPLC         ;
          MOV     TEMPLC,A         ;
          MOV     A,R7             ;
          JZ      TEMPOUT          ;
          ANL     A,#0FH           ;
          SWAP    A                ;
          MOV     R7,A             ;
          MOV     A,TEMPHC         ; TEMPHC HI = 百位数 BCD
          ANL     A,#0FH           ;
          ORL     A,R7             ;
          MOV     TEMPHC,A         ;
TEMPOUT:  RET                      ;
;**************************************
;小数部分分码表
;**************************************
TEMPDOTTAB: DB  00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
            DB  06H,07H,08H,08H,09H,09H ;

;**************************************
;显示区 BCD 码温度值刷新子程序
;**************************************
;温度暂存器内的2字节中,高字节的低半字节和低字节的高半字节组成一个字节,
;这个字节的二进制值转换为十进制后,就是温度值的百、十、个位值,而剩下的低字节化为
;十进制后,就是温度值的小数部分.
;**************************************
DISPBCD: 
         MOV      A,TEMPLC         ; 温度数据移入显示寄存器
         ANL      A,#0FH           ; 取低字节的低4位(小数部分)
         MOV      BUF1,A           ; 小数部分放入寄存器
         MOV      A,TEMPLC         ; 取低字节的高4位(个位数)
         SWAP     A                ;
         ANL      A,#0FH           ; 
         MOV      BUF2,A           ; 个位数放入寄存器

         MOV      A,TEMPHC         ; 取高字节的低4位(十位数)
         ANL      A,#0FH           ;
         MOV      BUF3,A           ; 十位数放入寄存器
         MOV      A,TEMPHC         ; 取高字节的高4位(百位数)
         SWAP     A                ;
         ANL      A,#0FH           ;
         MOV      BUF4,A           ; 百位数放入寄存器

         MOV      A,TEMPHC         ;
         ANL      A,#0F0H          ;
         CJNE     A,#10H,DISPBCD0  ; 百位数=0?
         SJMP     DISPOUT          ;
;*************************************
;最高位为0和正数的符号位都不显示
;*************************************
DISPBCD0:
         MOV      A,TEMPHC         ;
         ANL      A,#0FH           ;
         JNZ      DISPOUT          ; 十位数是0?
         MOV      A,TEMPHC         ;
         SWAP     A                ;
         ANL      A,#0FH           ;
         MOV      BUF4,0AH         ; 符号位不显示
         MOV      BUF3,A           ; 十位数显示符号
DISPOUT: RET                       ;
;*************************************
;单字节十六进制转BCD
;*************************************
HEX2BCD1:MOV     B,#64H            ; 十六进制 ->BCD
         DIV     AB                ; B=A%100
         MOV     R7,A              ; R7=百位数
         MOV     A,#0AH            ;
         XCH     A,B               ;
         DIV     AB                ; B=A%B
         SWAP    A                 ;
         ORL     A,B               ;
         RET                       ;
;*************************************
; Calculate CRC-8 Values, Uses The
; CCITT-8 Polynomial,Expressed As
; X^8+X^5+X^4+1
;CRC8  = X8+X5+X4+1

;X8 表示第7位需要异或运算
;X5 表示第4位需要异或运算
;X4 表示第3位需要异或运算
;1  表示第0位需要异或运算

;*************************************
CRC8CAL: 
         PUSH    ACC               ;
         MOV     R7,#08H           ; Number Bits Byte
CRC8LOOP1:
         XRL     A,B               ; Calculate CRC
         RRC     A                 ; Move T0 Carry
         MOV     A,B               ; Get The Last CRC Value
         JNC     CRC8LOOP2         ; Skip If Data==0
         XRL     A,#18H            ; Update The CRC Value
CRC8LOOP2:
         RRC     A                 ; Position The New CRC
         MOV     B,A               ; Store The New CRC
         POP     ACC               ; Get The Remaining Bits
         RR      A                 ; Possition The Next Bit
         PUSH    ACC               ; Save The Remaining Bits
         DJNZ    R7,CRC8LOOP1      ; Repeat For 8 Bits
         POP     ACC               ;
         RET                       ;
;******************************************
;读DS18B20的程序,从DS18B20中读出9个字节数据
;开始的两个字节为温度数据
;******************************************
READ_18200:
           MOV     R4,#9            ; 将温度高位和低位从DS18B20中读出
           MOV     R1,#TEMPER_L     ; 低位存入40H(TEMPER_L),高位存入41H(TEMPER_H)
           MOV     B, #00H          ;
;************************************
RE00:
           MOV     R2,#8            ; 数据一共有8位
RE01:
           CLR     C
           SETB    TEMPDIN          ; 拉高数据端口
           NOP
           NOP
           CLR     TEMPDIN          ; 拉低数据端口
           NOP
           NOP
           NOP

           SETB    TEMPDIN          ; 
           MOV     R3,#9            ; 延时
RE10:
           DJNZ    R3,RE10          ;
           MOV     C,TEMPDIN        ; 读出数据
           MOV     R3,#23           ; 延时
RE20:
           DJNZ    R3,RE20          ;
           RRC     A                ; 数据右移一位
           DJNZ    R2,RE01          ; 是否读完一个字节?
;************************************
           MOV     @R1,A            ;
           INC     R1               ; 读下一字节
           LCALL   CRC8CAL          ; 数据验证
           DJNZ    R4,RE00          ; 9字节数据是否读完?
           MOV     A,B              ; 验证数据放入A中
           JNZ     READ_OUT         ; 验证出错则不改变温度值

           MOV     TEMPL,TEMPER_L   ; 温度数据的低字节放入寄存器
           MOV     TEMPH,TEMPER_H   ; 温度数据的高字节放入寄存器
READ_OUT:  RET
;*****************************************
;显示子程序
;*****************************************
DISPLAY:
           MOV     DPTR,#NUMTAB     ; 指定查表启始地址
           MOV     R0,#4            ; 显示4位数据
DP11:      MOV     R1,#250          ; 显示1000次

DPLP:      SETB    P1.7             ; 小数点不亮
           MOV     A,BUF1           ; 取小位数
           MOVC    A,@A+DPTR        ; 查小位数的7段代码
           MOV     P1,A             ; 送出小位的7段代码
           CLR     P3.0             ; 开小位显示
           ACALL   DL1ms            ; 显示1ms
           SETB    P3.0             ; 关小数显示

           MOV     A,BUF2           ; 取个位数
           MOVC    A,@A+DPTR        ; 查个位数的7段代码
           MOV     P1,A             ; 送出个位的7段代码
           CLR     P1.7             ; 小数点亮
           CLR     P3.1             ; 开个位显示
           ACALL   DL1ms            ; 显示1ms
           SETB    P3.1             ; 关个位显示

           SETB    P1.7             ; 小数点不亮
	   MOV     A,BUF3           ; 取十位数
           MOVC    A,@A+DPTR        ; 查十位数的7段代码
           MOV     P1,A             ; 送出十位的7段代码

           CLR     P3.2             ; 开十位显示
           ACALL   DL1ms            ; 显示1ms
           SETB    P3.2             ; 关十位显示
           
	   SETB    P1.7             ; 小数点不亮
           MOV     A,BUF4           ; 取百位数
           MOVC    A,@A+DPTR        ; 查百位数的7段代码
           MOV     P1,A             ; 送出百位的7段代码
           CLR     P3.3             ; 开百位显示
           ACALL   DL1ms            ; 显示1ms
           SETB    P3.3             ; 关百位显示

           DJNZ    R1,DPLP          ; 250次没完循环
           DJNZ    R0,DP11          ; 4个100次没完循环
           RET
;****************************************
;0.2MS延时(按12MHZ算)
;****************************************
DL1MS:     MOV     R7,#100
           DJNZ    R7,$
           RET
;****************************************
;7段数码管0~9数字的共阳显示代码
;****************************************
NUMTAB:   DB    0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH ;
;               "0"  "1"  "2"  "3"  "4" "5" "6" "7"  "8" "9" "不亮" "-"
;****************************************
          END

⌨️ 快捷键说明

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