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

📄 text1.asm

📁 DS18B20温度采集芯片的简单应用
💻 ASM
字号:
RX      EQU   P1.6    ;DS18B20接收数据.
TX      EQU   P1.7    ;51发送数据.
FLAG1   EQU   00H     ;DS18B20初始化标志位. 
FLAG2   EQU   01H     ;通知水循环维持时间寄存器(WATER2)开始计时,间隔(WATER1)无需被操作.
FLAG3   EQU   02H     ;通知喂食维持时间寄存器(FEED2)开始计时,间隔(FEED1)无需被操作.
FLAG4   EQU   03H     ;被置1则可以去启动温度转换.
FLAG5   EQU   04H     ;被置1则可以去取转换好的温度.
TEMPL   EQU   26H     ;16位温度量低8位.
TEMPH   EQU   27H     ;16位温度量高8位.
TH      EQU   28H     ;温度上限值.
TL      EQU   29H     ;温度下限值.
TEMP1   EQU   30H     ;采集温度符号位.
TEMP2   EQU   31H     ;采集温度整数位.
TEMP3   EQU   32H     ;采集温度小数位.
ZC1     EQU   33H     ;数据暂存地址1.
ZC2     EQU   34H     ;数据暂存地址2.
ZC3     EQU   35H     ;数据暂存地址2.
HOUR    EQU   36H     ;小时数据暂存.
MINUTE  EQU   37H     ;分钟数据暂存.
SECOND  EQU   38H     ;秒数据暂存.
WATER1  EQU   39H     ;水循环开启间隔控制寄存器.  2h(max 12h)
WATER2  EQU   40H     ;水循环维持时间控制寄存器.  10min(max 30min)
HEAT1   EQU   41H     ;检测水温开启间隔控制寄存器. 5S
FEED1   EQU   42H     ;喂食开启间隔控制寄存器.     8h
FEED2   EQU   43H     ;喂食维持时间控制寄存器.     2S
COUNT1  EQU   44H     ;每1秒引发一次中断.
SETTEMP EQU   45H     ;采集温度低于此值加热棒开启.
ZC4     EQU   46H     ;装需要送显的数值
ZC5     EQU   47H     ;1秒显示ZC4中数值子程序.
ZC6     EQU   48H     ;1秒显示子程序十位值暂存.
 
ORG 0000H
SJMP INITIAL
ORG 0003H
LJMP INT0P
ORG 001BH
LJMP IT1P
ORG 0030H
;=====================================================
;各参数,元器件初始化
;=====================================================
INITIAL:
MOV   SP,#50H
MOV   TMOD,#00H
SETB  IT0
MOV   COUNT1,#140  ;140
MOV   SECOND,#00H
MOV   MINUTE,#00H
MOV   HOUR,#00H
MOV   HEAT1,#05H
MOV   FEED1,#8
MOV   FEED2,#2
MOV   WATER1,#2
MOV   WATER2,#10
MOV   SETTEMP,#17H
CLR   FLAG3
CLR   FLAG4
CLR   FLAG5
SETB  ET1
SETB  EA
MOV   TH1,#63H
MOV   TL1,#18H
SETB  RX
CLR   TX
CLR   P1.0
CLR   P1.1
CLR   P1.2
CLR   P2.5
CLR   P2.6
CLR   P2.7
SETB  P1.3
SETB  P1.4
SETB  P1.5
SETB  P3.3
SETB  TR1  ;启动定时器.
;=====================================================
;主程序
;=====================================================
MAIN:
JNB    P1.5,XSXS ;KEYLOCK
SETB   TR1
CLR   EX0
JB    FLAG4,ST1
ST2:
JB    FLAG5,ST3
SJMP  XS1
ST1:
LCALL TRANSFORM
SJMP  ST2
ST3:
LCALL GETTEMP
LCALL CONVERT
;================
JNB   P3.3,XS3   ;是否仍需比较,默认为需要.
;================
MOV   A,TEMP1
CJNE  A,#00H,ST4
MOV   A,TEMP2
CJNE  A,SETTEMP,ST5
ST5:
JC    ST6
CLR   P2.7
SJMP  XS1
ST4:
SETB  P2.7
SJMP  XS1
ST6:
SETB  P2.7
SJMP  XS1
;=================
XS3:
CLR   P2.7        ;若不需系统维持恒温,则总是关闭加热棒.
;=================
XS1:
JB    FLAG3,FOOD
CLR   P2.6
SJMP  XS2
FOOD:
SETB  P2.6

XS2:
JB    FLAG2,WATER
CLR   P2.5
SJMP  XS
WATER:
SETB  P2.5
SJMP  XS
;===========
XSXS:
CLR   P2.7
CLR   TR1   ;KEYLOCK
SETB  EX0
;===========
XS:

LCALL DISTIME
SJMP  MAIN
;=====================================================
;计时器T1中断服务程序
;=====================================================
IT1P:
PUSH PSW
PUSH ACC
MOV  TH1,#63H
MOV  TL1,#18H
DJNZ COUNT1,COMEBACK
MOV  COUNT1,#180

KAISHI:
DJNZ HEAT1,LOGIC1
MOV  HEAT1,#05H     ;TIME:  00 01 02 03 04 05   06 07 08 09 10 11 12 13
LOGIC1:             ;HEAT1: 5   4  3  2  1  5   4  3  2  1  5  4  3  2
MOV  A,HEAT1        ;FLAG4: 0   1  0  0  0  0   1  0  0  0  0  1  0  0
CJNE A,#4,LOGIC2    ;FLAG5: 0   0  0  0  1  0   0  0  0  1  0  0  0  0
SETB FLAG4
SJMP LOGIC6
LOGIC2:
CLR  FLAG4
CJNE A,#1,LOGIC3  
SETB FLAG5
SJMP LOGIC6
LOGIC3:
CLR  FLAG5
LOGIC6:
JNB   FLAG3,LOGIC
DJNZ  FEED2,LOGIC
MOV   FEED2,#2
MOV   FEED1,#8
CLR   FLAG3
LOGIC:
INC   SECOND             ;秒.
MOV   A,SECOND

CJNE  A,#60,COMEBACK

JNB   FLAG2,LOGIC8
DJNZ  WATER2,LOGIC8
MOV   WATER2,#10
MOV   WATER1,#8
CLR   FLAG2
LOGIC8:
MOV   SECOND,#00H
INC   MINUTE             ;分.
MOV   A,MINUTE

CJNE  A,#60,COMEBACK

JB    FLAG3,LOGIC4
DJNZ  FEED1,LOGIC4
SETB  FLAG3
LOGIC4:
JB    FLAG2,LOGIC7
DJNZ  WATER1,LOGIC7
SETB  FLAG2
LOGIC7:
MOV   MINUTE,#00H
INC   HOUR               ;时
MOV   A,HOUR

CJNE  A,#24,COMEBACK

MOV   HOUR,#00H
COMEBACK:
POP ACC
POP PSW
RETI
;=====================================================
;采集温度命令发出,及温度数据采回.
;=====================================================
TRANSFORM:
          LCALL RESET0
          JNB   FLAG1,TRANSFORM
          MOV A,#0CCH         ; 跳过ROM匹配
          LCALL WRITE
          MOV A,#044H         ; 发出温度转换命令
          LCALL WRITE
          RET

GETTEMP:  CLR   TR1
          LCALL RESET0
          JNB   FLAG1,GETTEMP
          MOV A,#0CCH         ; 跳过ROM匹配
          LCALL WRITE
          MOV A,#0BEH         ; 发出读温度命令
          LCALL WRITE
          LCALL  READ         ;读温度数据
	  SETB   TR1
          RET
;=====================================================
;DS18B20 复位与检测子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;=====================================================
RESET0:
          SETB TX
          NOP
          CLR TX
          MOV R7,#64H            ;主机发出延时600微秒的复位低脉冲
          MOV R6,#03H
RESET1:   DJNZ R7,$              ;200v
          MOV R7,#64H       
          DJNZ R6,RESET1
          SETB TX        ;然后拉高数据线
          NOP
          MOV R7,#25H
RESET2:   JNB RX,RESET3  ;等待DS18B20回应
          DJNZ R7,RESET2
          SJMP RESET4            ; 延时
RESET3:   SETB FLAG1            ; 置标志位,表示DS1820存在
          SJMP RESET5
RESET4:   CLR FLAG1             ; 清标志位,表示DS1820不存在
          SJMP RESET6
RESET5:   MOV R0,#0F0H
          DJNZ R0,$             ; 时序要求延时一段时间
RESET6:   SETB TX
          RET
;======================================================
;写1BYTE数据
;======================================================
WRITE:  MOV R7,#8            ;一共8位数据
        CLR CY
WR1:
        CLR TX        ;开始写入DS18B20总线要处于复位(低)状态
        MOV R6,#09
        DJNZ R6,$            ;总线复位保持18微妙以上
        RRC A                ;把一个字节DATA 分成8个BIT环移给C
        MOV TX,C      ;写入一个BIT
        MOV R6,#23
        DJNZ R6,$            ;等待46微妙
        SETB TX      ;重新释放总线
        NOP
        DJNZ R7,WR1          ;写入下一个BIT
        SETB TX
        RET
;======================================================
;从DS18B20中读出温度低位、高位和报警值TH、TL
;存入26H、27H、28H、29H
;======================================================
READ:    MOV R4,#4            ; 将温度高位和低位从DS18B20中读出
         MOV R1,#26H          ; 存入26H、27H、28H、29H
RE00:    MOV R2,#8
RE01:    CLR C
         SETB TX
         NOP
         NOP
         CLR TX        ;读前总线保持为低
         NOP
         NOP
         NOP
         SETB TX       ;开始读总线释放
         MOV R3,#09           ;延时18微妙
         DJNZ R3,$
         MOV C,RX      ;从DS18B20总线读得一个BIT
         MOV R3,#23
         DJNZ R3,$            ;等待46微妙
         RRC A                ;把读得的位值环移给A
         DJNZ R2,RE01         ;读下一个BIT
         MOV @R1,A
         INC R1
         DJNZ R4,RE00
         RET     

;=======================================================
;采集温度转化:符号位存于TEMP1(30H),
              ;整数位存于TEMP2(31H),
              ;小数位存于TEMP3(32H).
;=======================================================
CONVERT:    
            LCALL CONVERTZ
	    MOV A,TEMP1
	    CJNE A,#00H,LOOP
	    SJMP FANHUI
LOOP:       LCALL CONVERTF
FANHUI:     RET

CONVERTZ:   ;采集温度为+。
            MOV R7,#3
            MOV A,27H
CONVERT1:   CLR C
	    RRC A
	    DJNZ R7,CONVERT1
	    MOV TEMP1,A

            MOV R7,#4
            MOV A,TEMPH
	    MOV ZC2,TEMPL
CONVERT2:   CLR C
            RRC A
	    MOV ZC1,A
	    MOV A,TEMPL
	    RRC A
	    MOV TEMPL,A
	    MOV A,ZC1
	    DJNZ R7,CONVERT2
	    MOV A,TEMPL
	    CLR ACC.7
	    MOV TEMP2,A
	    MOV TEMPL,ZC2
            
CONVERT3:   MOV A,TEMPL
	    ANL A,#0FH
	    MOV TEMP3,A	  
  	    RET

CONVERTF:   ;采集温度为-。
	   MOV A,TEMP3
	   CPL A
	   ANL A,#0FH
	   MOV TEMP3,A

	   MOV A,TEMP2
	   CPL A
	   ANL A,#7FH
	   MOV TEMP2,A

	   MOV A,TEMP3
	   ADD A,#01H
	   CJNE A,#10H,LOOP1
	   MOV TEMP3,#0
	   MOV A,TEMP2
	   ADD A,#01H
	   MOV TEMP2,A
	   SJMP RETURN
LOOP1:     MOV TEMP3,A
RETURN:    RET
;=======================================================
;延时子程序
;=======================================================
DELAY:                        ;(1S)
         MOV R7,#10
D1:      MOV R6,#200
D2:      MOV R5,#250
         DJNZ R5,$
	 DJNZ R6,D2
         DJNZ R7,D1
         RET

DELAY1:                       ;(4MS)
         MOV R6,#10
D3:      MOV R5,#200
         DJNZ R5,$ 
         DJNZ R6,D3 
         RET	
;=======================================================
;温度表
;=======================================================
TAB1: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H,06H,07H,08H,08H,09H,09H     ;采集小数位(四舍五入).

TAB2: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH                     ;个位带小数点(共阴带小数点数码管表).

TAB3: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH                             ;十位,小数位不带小数点(共阴不带小数点数码管表).

TAB4: DB 00H,40H    ;符号位
;=======================================================
;温度显示子程序
;=======================================================
DISTEMP:
        MOV R7,#50
CB:     MOV A,TEMP3        ;显示小数位。
	MOV DPTR,#TAB1
	MOVC A,@A+DPTR
	MOV DPTR,#TAB3
	MOVC A,@A+DPTR
	MOV P0,A
	CLR P2.3
	LCALL DELAY1
	SETB P2.3

	MOV DPTR,#TAB2     ;显示个位。
	MOV A,TEMP2
	MOV B,#10
	DIV AB
	MOV 35H,A
	MOV A,B
        MOVC A,@A+DPTR
	MOV P0,A
	CLR P2.2
	LCALL DELAY1
	SETB P2.2

	MOV DPTR,#TAB3    ;显示十位。
	MOV A,35H
	MOVC A,@A+DPTR
	MOV P0,A
	CLR P2.1
	LCALL DELAY1
	SETB P2.1

	MOV DPTR,#TAB4    ;显示符号位。
	MOV A,TEMP1
	CJNE A,#00H,LOOP3
        SJMP LOOP4
LOOP3:	MOV  A,#01H
LOOP4:  MOVC A,@A+DPTR
	MOV P0,A
	CLR P2.0
	LCALL DELAY1
	SETB P2.0
	DJNZ R7,CB
	RET
;=======================================================
;时间显示子程序
;=======================================================       
DISTIME:
        MOV    DPTR,#TAB3  
        MOV    A,SECOND
        MOV    B,#10
        DIV    AB
        MOV    ZC3,A
        MOV    A,B
        MOVC   A,@A+DPTR
        MOV    P0,A
        CLR    P2.3
        LCALL  DELAY1
        SETB   P2.3
        MOV    A,ZC3
        MOVC   A,@A+DPTR
        MOV    P0,A
        CLR    P2.2
        LCALL  DELAY1
        SETB   P2.2
        
        MOV    DPTR,#TAB2
        MOV    A,MINUTE
        MOV    B,#10
        DIV    AB
        MOV    ZC3,A
        MOV    A,B
        MOVC   A,@A+DPTR
        MOV    P0,A
        CLR    P2.1
        LCALL  DELAY1
        SETB   P2.1
        MOV    DPTR,#TAB3
        MOV    A,ZC3
        MOVC   A,@A+DPTR
        MOV    P0,A
        CLR    P2.0
        LCALL  DELAY1
        SETB   P2.0
        RET

ZC4XS:  
        SETB    P2.0
	SETB    P2.1
        MOV    DPTR,#TAB3
        MOV    ZC5,#100
A1:     MOV    A,ZC4
	MOV    B,#10
	DIV    AB
	MOV    ZC6,A
	MOV    A,B
        MOVC   A,@A+DPTR
	MOV    P0,A
	CLR    P2.3
	LCALL  DELAY1
	SETB   P2.3
	MOV    A,ZC6
	MOVC   A,@A+DPTR
	MOV    P0,A
	CLR    P2.2
	LCALL  DELAY1
	SETB   P2.2
        DJNZ   ZC5,A1
	MOV P1,#78H
	RET
;==============================
;中断键盘扫描服务子程序
;==============================
INT0P:   
       CLR EA        ;保护现场,不允许任何中断。 
       PUSH ACC
       PUSH DPH
       PUSH DPL  
       PUSH PSW
       ;SETB EA   ;     ;若不加按键去抖则会出错,中断被触发多次引起误差。(只有此法可以解决按键乱跳问题)
G1:    MOV R7,#0FEH  ;第一行出0
       MOV A,#0
       MOV R6,#0     ;行值暂存
       MOV R5,#0     ;列值暂存

G2:    MOV A,R7
       MOV P1,A
       NOP
       NOP
       NOP
       MOV A,P1
       MOV R5,A     ;暂存列值。
       CPL A
       ANL A,#00011000B
       JNZ G3   ;累加器A若不为0,转到判列值子程序,否则进行下一行扫描。
       INC R6
       MOV A,R7
       SETB C
       RLC A
       MOV R7,A
       CJNE R6,#3,G2	 
       LJMP HUI

G3:    MOV A,R5
       JNB ACC.3,LIE0
       JNB ACC.4,LIE1
       LJMP HUI
                         ;/*赋列值*/
LIE0:  MOV R5,#0
       SJMP DECODE
LIE1:  MOV R5,#1
       SJMP DECODE

DECODE:MOV A,R6
       MOV B,#2
       MUL AB
       ADD A,R5
       CLR C
       RL  A
       MOV DPTR,#KeyTab
       JMP @A+DPTR             
             
;/*****按键功能子程序*****/	
KeyTab:
       SJMP Fu0
       SJMP Fu1
       SJMP Fu2
       SJMP Fu3
       SJMP Fu4
       SJMP Fu5		  
      
Fu0:  
       INC  MINUTE           ;分钟调整
       MOV  A,MINUTE
       CJNE A,#60,Fu01
       MOV  MINUTE,#00H
Fu01:  LJMP HUI

Fu1:   
       INC HOUR              ;小时调整.
       MOV A,HOUR
       CJNE A,#60,Fu11
       MOV  HOUR,#00H
Fu11:  LJMP HUI 

Fu2:   
       INC WATER1            ;水泵工作间隔调整.
       MOV A,WATER1
       CJNE A,#12,Fu21
       MOV  WATER1,#01H
Fu21:
       MOV  ZC4,WATER1
       LCALL ZC4XS
       LJMP  HUI

Fu3:  
       INC   SETTEMP        ;设定温度调整.
       MOV  A,SETTEMP
       CJNE A,#30,Fu31
       MOV SETTEMP,#20                   
Fu31:  MOV  ZC4,SETTEMP
       LCALL ZC4XS
       LJMP  HUI

Fu4:   
       LCALL DISTEMP
       LJMP  HUI
       
Fu5:                         ;水泵每次工作时间调整.
       INC  WATER2
       MOV  A,WATER2
       CJNE A,#60,Fu51
       MOV  WATER2,#01H
Fu51:
       MOV  ZC4,WATER2
       LCALL ZC4XS
HUI:
       ;CLR EA
       POP PSW
       POP DPL
       POP DPH
       POP ACC
       SETB EA       
       MOV P1,#78H
       SETB P1.6
       RETI
       END

⌨️ 快捷键说明

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