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

📄 xl18b20.asm

📁 51单片机驱动DSB20单总线温度传感器
💻 ASM
📖 第 1 页 / 共 2 页
字号:
TEMP_COMP:
          SETB  TR0             ;启动中断
          MOV  A,TEMP_TH
          SUBB  A,TEMP_ZH       ;减数>被减数,则
          JC  CHULI1            ;借位标志位C=1,转
          MOV  A,TEMP_ZH
          SUBB  A,TEMP_TL       ;减数>被减数,则
          JC  CHULI2            ;借位标志位C=1,转
          JNB  FLAG2,T_COMP1    ;FLAG2=0,显示标记字符
          MOV  71H,#0AH         ;熄灭符
          MOV   TEMP_BUFF_S,#T_B_S
          LCALL  DISP1
          JMP  T_COMP2
T_COMP1:  MOV  71H,#00H
          MOV   TEMP_BUFF_S,#T_B_S
          LCALL  DISP1          ;显示"O"
T_COMP2:  CLR   RELAY           ;继电器吸合
          CLR  TR0              ;关闭中断
          RET
;---------------------------------------------
;超温处理
;---------------------------------------------
CHULI1:
          SETB  RELAY           ;继电器关闭
          JNB  FLAG2,CHULI10
          MOV  71H,#0AH         ;熄灭符
          MOV   TEMP_BUFF_S,#T_B_S
          LCALL  DISP1
          JMP  CHULI11
CHULI10:  MOV  71H,#0DH    
          MOV   TEMP_BUFF_S,#T_B_S     
          LCALL  DISP1          ;显示"H"
          ;CALL  BEEP_BL        ;蜂鸣器响
CHULI11:
          CLR  TR0              ;关闭中断
          RET
;---------------------------------------------
;欠温处理
;---------------------------------------------
CHULI2:                         ;欠温处理
          JNB  FLAG2,CHULI20
          MOV  71H,#0AH         ;熄灭符
          MOV   TEMP_BUFF_S,#T_B_S
          LCALL  DISP1
          JMP  CHULI21
CHULI20:  MOV  71H,#0CH         
          MOV   TEMP_BUFF_S,#T_B_S
          LCALL  DISP1          ;显示"L"
          ;CALL  BEEP_BL        ;蜂鸣器响
CHULI21:  CLR  TR0              ;关闭中断
          RET
;------------------------------------------------------------
;把 DS18B20 暂存器里的温度报警值拷贝到EEROM
;------------------------------------------------------------
WRITE_E2:
        CALL  RESET
        MOV  A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#48H         ;温度报警值拷贝到EEROM
        LCALL  WRITE
        RET
;--------------------------------------------------------------
;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器
;-------------------------------------------------------------
READ_E2:
        CALL  RESET
        MOV  A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#0B8H        ;温度报警值拷贝回暂存器
        CALL  WRITE
        RET

;*****************************************************
;  处理温度 BCD 码子程序
;****************************************************
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#80H
               JZ  TEMPC1         ;温度零上转
               CLR  C
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反加1
               ADD  A,#01H
               MOV  TEMPL,A
               MOV  A,TEMPH       ;-
               CPL  A
               ADDC  A,#00H
               MOV  TEMPH,A          ;TEMPHC HI =符号位
               MOV  TEMPHC,#0BH
               SJMP  TEMPC11

TEMPC1:        MOV  TEMPHC,#0AH     ;
TEMPC11:       MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH             ;乘0.0625
               MOV  DPTR,#TEMPDOTTAB
               MOVC  A,@A+DPTR
               MOV  TEMPLC,A            ;TEMPLC  LOW=小数部分 BCD

               MOV  A,TEMPL             ;整数部分
               ANL  A,#0F0H
               SWAP  A
               MOV  TEMPL,A
               MOV  A,TEMPH
               ANL  A,#0FH
               SWAP  A
               ORL  A,TEMPL
               MOV  TEMP_ZH,A           ;组合后的值存入TEMP_ZH
               LCALL  HEX2BCD1
               MOV  TEMPL,A
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R7
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R7,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R7
               MOV  TEMPHC,A
TEMPC12:       RET
;-----------------------------------------------------------
;  小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
             DB   06H,07H,08H,08H,09H,09H

;===========================================================

;显示区 BCD 码温度值刷新子程序

;===========================================================

DISPBCD:      MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  75H,A                 ;小数位
              MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  74H,A                 ;个位
              MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  73H,A                 ;十位
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  72H,A                 ;百位
              MOV  A,TEMPHC
              ANL  A,#0F0H
              CJNE  A,#010H,DISPBCD0
              SJMP  DISPBCD2

DISPBCD0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  DISPBCD2               ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  72H,#0AH               ;符号位不显示
              MOV  73H,A                  ;十位数显示符号
DISPBCD2:     RET

;***************************************************************

;     温度显示子程序

;***************************************************************
;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据,
;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。

;**********************************************************
; 数码管显示子程序
;**********************************************************
DISP1:                           ;显示子程序开始
                MOV 70H,#0AH
                MOV DIS_INDEX,#0
DISPLAY_START:                     ;显示一位开始
                CALL OFF_ALL       ;调用子程序关闭所有数码管的显示
                MOV DIS_DATA,#00 ;  6个数目管的公共显示数据写0关闭
		MOV A, DIS_INDEX
DIS0_B:		CJNE A,#0X00,DIS1_B
		CLR DIS_1
		JMP MOV_DAT
DIS1_B:
		CJNE A,#0X01,DIS2_B
		CLR DIS_2
		JMP MOV_DAT
DIS2_B:
		CJNE A,#0X02,DIS3_B
		CLR DIS_3
		JMP MOV_DAT
DIS3_B:
		CJNE A,#0X03,DIS4_B
		CLR DIS_4
		JMP MOV_DAT
DIS4_B:
		CJNE A,#0X04,DIS5_B
		CLR DIS_5
		JMP MOV_DAT
DIS5_B:
		CJNE A,#0X05,DIS_END
		CLR DIS_6
		JMP MOV_DAT         ;以上程序根据现在的显示位数进行条件分支,分别打开相应的显示使能位
MOV_DAT:        
                MOV A, DIS_INDEX
                MOV R1,TEMP_BUFF_S
                ADD A,R1              
                MOV R0,A
                MOV A,@R0           ;获得目前的显示位所对应自己的缓冲数据
		MOV DPTR,#DIS_TAB
		MOVC A,@A+DPTR
                ANL  A,#0XDF
                MOV  B,A
                MOV  A,DIS_INDEX
                CJNE A,#04,RE_DIS
                MOV  A,B
                ORL  A,#0X20
                JMP  RE_DIS1
RE_DIS:
                MOV  A,B
RE_DIS1:        MOV  DIS_DATA,A     ;将目前的显示数据经过查表获得对应的数码管段码
                CALL T1MS
                INC DIS_INDEX       ;显示位序加一,指向下一位
                MOV A,DIS_INDEX 
                CJNE  A,#6,DISPLAY_START ;以上两句判断是否循环显示够6位是的话返回到被调用的位置 否则进行下一次循环
                
DIS_END:
	        RET                    ;
OFF_ALL:                                 ;关闭所有显示位的子程序   
		SETB DIS_1        
		SETB DIS_2
		SETB DIS_3
		SETB DIS_4
		SETB DIS_5
		SETB DIS_6
                RET
T1MS: mov	r5,#00h				;延时子程序
tt:	mov	r6,#9
	djnz	r6,$
	djnz	r5,tt
	ret
DIS_TAB:                                ;0-9 所对应的数码管段码    最后一个00 是总关闭显示
		DB 0x7f,0x44,0xbd,0xf5,0xe6,0xf3,0xfb,0x65,0xff,0xf7,0x00,0x80,0X1A,0XCE


;单字节十六进制转 BCD
;******************************************************
HEX2BCD1:   MOV  B,#064H          
            DIV  AB               
            MOV  R7,A             
            MOV  A,#0AH
            XCH  A,B
            DIV  AB               
            SWAP  A
            ORL  A,B
            RET
;===============================================
;报警值 TH、TL 数据转换
;===============================================
ALERT_TL:
             MOV  75H,#0CH
             MOV  76H,#0BH
             MOV  A,TEMP_TL
             MOV  R0,#77H
             MOV  B,#064H
             DIV  AB
             CJNE  A,#01H,ALERT_TL1
             MOV  @R0,A
             JMP  ALERT_TL2
ALERT_TL1:   MOV  A,#0BH           ;显示“-”
             MOV  @R0,A
ALERT_TL2:   MOV  A,#0AH
             XCH  A,B
             DIV  AB
             INC  R0
             MOV  @R0,A
             MOV  7EH,A
             INC  R0
             MOV  @R0,B
             MOV  7DH,B
             RET
;-----------------------------------------------
ALERT_TH:
             MOV  75H,#0DH
             MOV  76H,#0BH
             MOV  A,TEMP_TH
             MOV  R0,#77H
             MOV  B,#064H
             DIV  AB
             CJNE  A,#01H,ALERT_TH1
             MOV  @R0,A
             JMP  ALERT_TH2
ALERT_TH1:   MOV  A,#0BH             ;显示“-”
             MOV  @R0,A
ALERT_TH2:   MOV  A,#0AH
             XCH  A,B
             DIV  AB
             INC  R0
             MOV  @R0,A
             MOV  7EH,A
             INC  R0
             MOV  @R0,B
             MOV  7DH,B
             RET
;===============================================
;报警值显示子程序
;===============================================
ALERT_PLAY:
MOV   TEMP_BUFF_S,#T_B_A
CALL  DISP1
             RET
;===============================================
;蜂鸣器响一声子程序
;P3.7=0,蜂鸣器响
;===============================================
BEEP_BL:
         MOV  R6,#100
 BL2:    CALL  DEX1
         CPL  BEEP        ;对 P3.7 取反
         DJNZ  R6,BL2
         MOV  R5,#10
         CALL  DELAY2
         RET
 DEX1:   MOV  R7,#180
 DE2:    NOP
         DJNZ  R7,DE2
         RET
DELAY2:                    ;(R5)*延时10MS
         MOV  R6,#200
 DEL1:   MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL1
         DJNZ  R5,DELAY2
         RET
;==================================================
         END

⌨️ 快捷键说明

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