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

📄 18b20.asm

📁 8通道自动温度检测系统仿真.一个用一线控制8个DS18B20的实例!
💻 ASM
📖 第 1 页 / 共 2 页
字号:
CLR C 
SETB P1.4H 
NOP 
NOP 
CLR P1.4H 
NOP 
NOP 
NOP 
SETB P1.4H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.4H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE15
RET 
;=============================
WRITE_18205: 
MOV R2,#8 
CLR C 
WR15: 
CLR P1.4H 
MOV R3,#6 
DJNZ R3,$ 
RRC A 
MOV P1.4H,C 
MOV R3,#23 
DJNZ R3,$ 
SETB P1.4H 
NOP 
DJNZ R2,WR15
SETB P1.4H 
RET
;=======================================
READ_182005: 
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 
MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H) 
RE005: 
MOV R2,#8 
RE015: 
CLR C 
SETB P1.4H 
NOP 
NOP 
CLR P1.4H 
NOP 
NOP 
NOP 
SETB P1.4H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.4H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE015
MOV @R1,A 
DEC R1 
DJNZ R4,RE005
RET 
;=======================================
INIT_18205: 
SETB P1.4H 
NOP 
CLR P1.4H 
MOV R0,#250
TSR15: 
DJNZ R0,TSR15 ; 延时520us 
SETB P1.4H 
MOV R0,#25H ;96US-25H 
TSR25: 
DJNZ R0,TSR25
JNB P1.4H,TSR35;如D0为低则复位成功,DS18B20存在 
LJMP TSR45 ; 延时 
TSR35: 
SETB 00H ; 置标志位,表示DS1820存在 
LJMP TSR55 
TSR45: 
CLR 00H ; 清标志位,表示DS1820不存在 
LJMP TSR75
TSR55: 
MOV R0,#06BH ;200US 
TSR65: 
DJNZ R0,TSR65 ; 延时 
TSR75: 
SETB P1.4H ;拉高总线
RET
;=============================== 
GET_TEMPER6: 
          SETB      P1.5H ; 定时入口 
BCD6:      LCALL     INIT_18206
          JB        00H,S226
          LJMP      BCD6; 若DS18B20不存在则返回 

S226:     LCALL     DELAY1 
         MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
         LCALL     WRITE_18206
MOV A,#44H ; 发出温度转换命令 
LCALL WRITE_18206
NOP 
LCALL DELAY1 
CBA6:LCALL INIT_18206
JB 00H,ABC6
LJMP CBA6
ABC6:LCALL DELAY1 
MOV A,#0CCH ; 跳过ROM匹配 
LCALL WRITE_18206
MOV A,#0BEH ; 发出读温度命令 
LCALL WRITE_18206
LCALL READ_182006 ;READ_1820 
RET 
;==============================
READ_18206: 
MOV R2,#8 
RE16: 
CLR C 
SETB P1.5H 
NOP 
NOP 
CLR P1.5H 
NOP 
NOP 
NOP 
SETB P1.5H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.5H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE16
RET 
;=============================
WRITE_18206: 
MOV R2,#8 
CLR C 
WR16: 
CLR P1.5H 
MOV R3,#6 
DJNZ R3,$ 
RRC A 
MOV P1.5H,C 
MOV R3,#23 
DJNZ R3,$ 
SETB P1.5H 
NOP 
DJNZ R2,WR16
SETB P1.5H 
RET
;=======================================
READ_182006: 
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 
MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H) 
RE006: 
MOV R2,#8 
RE016: 
CLR C 
SETB P1.5H 
NOP 
NOP 
CLR P1.5H 
NOP 
NOP 
NOP 
SETB P1.5H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.5H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE016
MOV @R1,A 
DEC R1 
DJNZ R4,RE006
RET 
;=======================================
INIT_18206: 
SETB P1.5H 
NOP 
CLR P1.5H 
MOV R0,#250
TSR16: 
DJNZ R0,TSR16 ; 延时520us 
SETB P1.5H 
MOV R0,#25H ;96US-25H 
TSR26: 
DJNZ R0,TSR26
JNB P1.5H,TSR36;如D0为低则复位成功,DS18B20存在 
LJMP TSR46 ; 延时 
TSR36: 
SETB 00H ; 置标志位,表示DS1820存在 
LJMP TSR56 
TSR46: 
CLR 00H ; 清标志位,表示DS1820不存在 
LJMP TSR76
TSR56: 
MOV R0,#06BH ;200US 
TSR66: 
DJNZ R0,TSR66 ; 延时 
TSR76: 
SETB P1.5H ;拉高总线
RET
;=============================== 
GET_TEMPER7: 
          SETB      P1.6H ; 定时入口 
BCD7:      LCALL     INIT_18207
          JB        00H,S227
          LJMP      BCD7; 若DS18B20不存在则返回 

S227:     LCALL     DELAY1 
         MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
         LCALL     WRITE_18207
MOV A,#44H ; 发出温度转换命令 
LCALL WRITE_18207
NOP 
LCALL DELAY1 
CBA7:LCALL INIT_18207
JB 00H,ABC7
LJMP CBA7
ABC7:LCALL DELAY1 
MOV A,#0CCH ; 跳过ROM匹配 
LCALL WRITE_18207
MOV A,#0BEH ; 发出读温度命令 
LCALL WRITE_18207
LCALL READ_182007 ;READ_1820 
RET 
;==============================
READ_18207: 
MOV R2,#8 
RE17: 
CLR C 
SETB P1.6H 
NOP 
NOP 
CLR P1.6H 
NOP 
NOP 
NOP 
SETB P1.6H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.6H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE17
RET 
;=============================
WRITE_18207: 
MOV R2,#8 
CLR C 
WR17: 
CLR P1.6H 
MOV R3,#6 
DJNZ R3,$ 
RRC A 
MOV P1.6H,C 
MOV R3,#23 
DJNZ R3,$ 
SETB P1.6H 
NOP 
DJNZ R2,WR17
SETB P1.6H 
RET
;=======================================
READ_182007: 
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 
MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H) 
RE007: 
MOV R2,#8 
RE017: 
CLR C 
SETB P1.6H 
NOP 
NOP 
CLR P1.6H 
NOP 
NOP 
NOP 
SETB P1.6H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.6H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE017
MOV @R1,A 
DEC R1 
DJNZ R4,RE007
RET 
;=======================================
INIT_18207: 
SETB P1.6H 
NOP 
CLR P1.6H 
MOV R0,#250
TSR17: 
DJNZ R0,TSR17 ; 延时520us 
SETB P1.6H 
MOV R0,#25H ;96US-25H 
TSR27: 
DJNZ R0,TSR27
JNB P1.6H,TSR37;如D0为低则复位成功,DS18B20存在 
LJMP TSR47; 延时 
TSR37: 
SETB 00H ; 置标志位,表示DS1820存在 
LJMP TSR57 
TSR47: 
CLR 00H ; 清标志位,表示DS1820不存在 
LJMP TSR77
TSR57: 
MOV R0,#06BH ;200US 
TSR67: 
DJNZ R0,TSR67; 延时 
TSR77: 
SETB P1.6H ;拉高总线
RET
;=============================== 
GET_TEMPER8: 
          SETB      P1.7H ; 定时入口 
BCD8:      LCALL     INIT_18208
          JB        00H,S228
          LJMP      BCD8; 若DS18B20不存在则返回 

S228:     LCALL     DELAY1 
         MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
         LCALL     WRITE_18208
MOV A,#44H ; 发出温度转换命令 
LCALL WRITE_18208
NOP 
LCALL DELAY1 
CBA8:LCALL INIT_18208
JB 00H,ABC8
LJMP CBA8
ABC8:LCALL DELAY1 
MOV A,#0CCH ; 跳过ROM匹配 
LCALL WRITE_18208
MOV A,#0BEH ; 发出读温度命令 
LCALL WRITE_18208
LCALL READ_182008 ;READ_1820 
RET 
;==============================
READ_18208: 
MOV R2,#8 
RE18: 
CLR C 
SETB P1.7H 
NOP 
NOP 
CLR P1.7H 
NOP 
NOP 
NOP 
SETB P1.7H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.7H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE18
RET 
;=============================
WRITE_18208: 
MOV R2,#8 
CLR C 
WR18: 
CLR P1.7H 
MOV R3,#6 
DJNZ R3,$ 
RRC A 
MOV P1.7H,C 
MOV R3,#23 
DJNZ R3,$ 
SETB P1.7H 
NOP 
DJNZ R2,WR18
SETB P1.7H 
RET
;=======================================
READ_182008: 
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 
MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H) 
RE008: 
MOV R2,#8 
RE018: 
CLR C 
SETB P1.7H 
NOP 
NOP 
CLR P1.7H 
NOP 
NOP 
NOP 
SETB P1.7H 
MOV R3,#7 
DJNZ R3,$ 
MOV C,P1.7H 
MOV R3,#23 
DJNZ R3,$ 
RRC A 
DJNZ R2,RE018
MOV @R1,A 
DEC R1 
DJNZ R4,RE008
RET 
;=======================================
INIT_18208: 
SETB P1.7H 
NOP 
CLR P1.7H 
MOV R0,#250
TSR18: 
DJNZ R0,TSR18 ; 延时520us 
SETB P1.7H 
MOV R0,#25H ;96US-25H 
TSR28: 
DJNZ R0,TSR28
JNB P1.7H,TSR38;如D0为低则复位成功,DS18B20存在 
LJMP TSR48; 延时 
TSR38: 
SETB 00H ; 置标志位,表示DS1820存在 
LJMP TSR58
TSR48: 
CLR 00H ; 清标志位,表示DS1820不存在 
LJMP TSR78
TSR58: 
MOV R0,#06BH ;200US 
TSR68: 
DJNZ R0,TSR68; 延时 
TSR78: 
SETB P1.7H ;拉高总线
RET
;=============================== 
;======================================
DELAY1:MOV R7,#20H 
DJNZ R7,$ 
RET

;====================================
TEMPRRO:MOV 33H,#00H;初始化0
MOV A,30H
ANL A,#0FH
SWAP A
MOV 33H,A
MOV A,31H
ANL A,#0F0H
SWAP A
ORL 33H,A;重新组合成的带符号数据(整数部分)
MOV A,33H
ANL A,#80H;判断符号

JZ TEMPP
MOV A,33H
CPL A
;ADD A,#01H
SJMP TEMPP1
TEMPP:MOV A,33H;正数处理程序
      LCALL HBCD
      MOV A,31H
      ANL A,#0FH
      MOV DPTR,#TEMPTAB;小数查表
      MOVC A,@A+DPTR
      MOV 36H,A
      CLR P3.7;表示正数
      SJMP EXIT
TEMPP1:LCALL HBCD;负数处理程序
       MOV A,31H
       ANL A,#0FH
       ORL A,#0F0H
       CPL A
       ADD A,#01H
       MOV DPTR,#TEMPTAB
       MOVC A,@A+DPTR;小数查表
       MOV 36H,A
       SETB P3.7;表示负数
EXIT:RET

HBCD:	MOV	B,#100	;分离出百位,存放在R3中
	DIV	AB
	MOV	R3,A
	MOV	A,#10	;余数继续分离十位和个位
	XCH	A,B
	DIV	AB
	SWAP	A
	ORL	A,B	;将十位和个位拼装成BCD码
	MOV 34H,R3
	MOV 35H,A
	RET
TEMPTAB:DB 00H,01H,01H,02H,03H,03H,04H,04H
        DB 05H,06H,06H,07H,08H,08H,09H,09H;0~16*0.0652
;==================================================
CBCD:;MOV R2,#04H;5个待分离的BCD
CL:MOV A,@R1     ;分离后将占10个单元
   MOV B,A
   ANL A,#0F0H
   SWAP A
   MOV 4CH,A
   MOV A,B
   ANL A,#0FH
   MOV 4DH,A
   MOV @R0,4CH
   INC R0
   MOV @R0,4DH
   INC R0
   INC R1
   DJNZ R2,CL
   RET
;===================================================
DISPLAY:MOV R0,#38H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示缓冲区首地址
        MOV R2,#04
DISP_LOOP:MOV A,@R0
          LCALL DISP
          INC R0
	  DJNZ R2,DISP_LOOP
          CLR  P0.2
          NOP
          NOP
          SETB P0.2      ;上升沿将数据送到输出锁存器
          NOP
          NOP
          NOP
          CLR  P0.2
          RET
DISP:MOV R4,#08H;移位寄存器接收数据
WR_LOOP: RLC A
         MOV P0.1,C
         SETB P0.0        ;上升沿发生移位
         NOP
         NOP
         CLR P0.0
         DJNZ R4,WR_LOOP
	 RET
;=============================
PRO: MOV R2,#03H;N个待分离的BCD
     MOV R0,#37H;分离后BCD首地址
     MOV R1,#34H;待分离BCD首地址
     LCALL CBCD;分离压缩的BCD码
     MOV 3BH,3CH;小数处理

     MOV R0,#38H;显示数据首地址
     MOV R1,#38H;显示缓冲区首地址
     MOV R2,#04;数据个数
RES_LOOP:MOV A,@R0
         LCALL RES
         MOV @R1,A
	 INC R0
	 INC R1
	 DJNZ R2,RES_LOOP  
      ORL 3AH,#80H;小数点
      LCALL DISPLAY
LCALL DELAYS
LCALL DELAYS
LCALL DELAYS
LCALL DELAYS
LCALL DELAYS
LCALL DELAYS
RET
;==============================
RES:MOV DPTR,#TAB
    MOVC A,@A+DPTR
    RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
;======================================
DELAYS:MOV R5,#0FFH
LOOP2:MOV R4,#0FFH
LOOP1:NOP
      NOP
      DJNZ R4,LOOP1
      DJNZ R5,LOOP2
      RET
                END

⌨️ 快捷键说明

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