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

📄 text1.asm

📁 基于DS18B20的数字温度驱动程序
💻 ASM
字号:
RTE EQU 22H
RTG EQU 30H
RTO EQU 32H
RSH EQU 35H
TEMPL EQU 40H;存放温度值低位
TEMPH EQU 41H;存放温度值高位
TEMP EQU 50H
ORG 000H
LJMP  MAIN
ORG 1000H
MAIN:MOV SP,#60H
     SETB P1.0
	 LCALL RST;调用复位子程序
	 JNB RTO,MA;判断复位是否成功
	 MOV A,#0CCH;跳过RAM
	 LCALL WRS ;调用写子程序
	 MOV A,#44H;启动温度转换
	 LCALL WRS
	 LCALL RST
	 MOV A,#0CCH
	 LCALL WRS
	 MOV A,#0BEH;读内部RAM命令
	 LCALL WRS
	 NOP
	 LCALL RRS
	 NOP
	 LCALL WDZ;调用温度转换子程序
	 LCALL SMX;调用数码管显示程序
 MA: LJMP MAIN

/*DS18B20初始复位程序*/
RST: SETB P1.0
     NOP 
	 NOP 
	 CLR P1.0 ;下拉数据线
	 LCALL DELAY1;调用延时程序延时540微妙
	 NOP
	 SETB P1.0;释放数据线
	 MOV RTE,#03H;短暂延时等待
RTD: DJNZ RTE,RTD
	 JNB P1.0,RTH;判断是否收到复位成功信号
	 CLR RTO;复位失败RT0清零
	 NOP
	 ACALL RTA
RTH: SETB RTO ;复位成功RT0置一
     NOP
     MOV RTG ,#5BH;短暂延时
RTT: DJNZ RTG ,RTT
RTA: SETB P1.0;使P1.0置一
     RET

/*DS18B20写时序子程序*/
WRS: CLR C ;
     MOV R4,#8;字节数
     NOP
W0:	 CLR P1.0
	 MOV R2,#05H
W1:	 DJNZ R2, W1
     RRC A ;循环右移
	 MOV P1.0,C	;将结果送入
	 NOP
	 MOV R3,#28;延时
W2:	 DJNZ R3,W2
     SETB P1.0
	 DJNZ R4,W0;判断送完没
	 SETB P1.0
	 RET

/*DS18B20读时序子程序*/
RRS:  MOV  R5, #2;字节行数
      MOV  R0,#40H
RL0	: MOV R6,#8;每行字节数
RL1: CLR C 
	 SETB P1.0
	 NOP 
	 NOP 
	 NOP 
	 CLR P1.0
	 MOV RSH ,#05H ;延时
RL2: DJNZ RSH,RL2
     NOP
	 SETB P1.0
	 NOP
	 NOP
	 NOP
	 MOV C,P1.0	;将P1.0位信息放到C
	 MOV R2, #30
RL3: DJNZ R2,RL3
     NOP
	 NOP
	 RRC A
	 DJNZ  R6,RL1;判断送完没
	 MOV @R0,A ;将数据放在TEMPL中
	 INC R0	   ;TEMPH
	 DJNZ R5, RL0;判断整个数据送完没
	 RET

/*温度转换子程序*/
WDZ:MOV A,TEMPH
    ANL A,#80H;判断温度正负
    JZ  WD2;正温度跳转WD2
	SETB  P1.1;负温度则使P1.1置1
	CLR C	  ;负温度转换部分
    MOV A,TEMPL
	CPL A ;取反
	ADD  A,#01H;加1
	MOV TEMPL,A
	MOV A,TEMPH
	CPL A
	ADDC A,#00H
 	MOV TEMPH,A
WD1:MOV A,TEMPL
    ANL A, #0F0H;屏蔽小数位
    SWAP A
    MOV TEMPL,A
    MOV A,TEMPH
    ANL A,#0FH	;屏蔽符号位
    SWAP A
    ORL A,TEMPL
    MOV TEMP,A	;将转换后温度置及8字节数据放在TEMP
    RET
WD2:CLR P1.1 ;使P1.1清零作为正温度标志
    LCALL WD1 ;转到温度处理部分
	RET
/*数码管显示子程序*/
SMX:MOV R5,#0
    MOV R0,#51H
	MOV A,TEMP
    MOV B,#100 ;百位数据
	DIV AB
	MOV 51H,A;将百位数据放在51H
	MOV 54H,B ;十位数据
	MOV B,#10
	MOV A,54H
	DIV AB
	MOV 52H,A ;十位数据送到52H
	MOV 57H,B ;个位数据
	MOV B,#1
	MOV A,57H
	DIV AB
	MOV 53H,A ;个位数据放到53H
	MOV 54H,B ;小数位为零放到54H
S1: MOV DPTR,#TABF
    MOV A,R5
    MOVC A,@A+DPTR ;查表2
    MOV P3,A
    MOV DPTR,#TABE
	JB P1.1, S3	;判断温度正负,负温度跳到S3
	MOV A,51H
	CJNE A,#0,S7;判断百位是否为零,为零则不显
	MOV 51H,#0AH
	MOV A,52H;判断十位是否为零,为零不显
    CJNE A,#0,S7
	MOV 52H,#0AH
S7:	MOV A,@R0
S8:  MOVC A,@A+DPTR;查表1
     MOV 56H,A
	 MOV A,R5
	 CJNE A,#2,S4;处理后个位后显示点
	 MOV A,56H
     ORL A,#80H
S5:  MOV P2,A
	 ACALL DELAY2
	 INC R5
	 INC R0
     CJNE  R5, #4,S1
	 RET
S3:	 MOV A,52H;判断温度十位是否为零
     CJNE A,#0,S31;不为零则百位显示—号
	 MOV 51H,#0AH;直接使负温度百位不显
	 MOV 52H,#0BH;负温度显示—号
	 LCALL S32
	 RET
S31:  MOV  51H,#0BH;使百位显示--号
S32:  LCALL S7
	  RET
S4:	  MOV A,56H
      LCALL S5
	  RET
/*延时子程序*/
DELAY1:MOV R0,#10
DE1:   MOV R1,#25
DE2:   DJNZ R1,DE2
	   DJNZ R0,	DE1
	   RET
/*延时子程序*/
DELAY2:MOV R7,#50
DE3:   MOV R6,#100
DE4:   DJNZ R6,DE4
       DJNZ R7,DE3
	   RET
TABE:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,00H,40H
        ;0 ,1,2,3,4,5,6,7,8,9,消零,--
TABF:DB 0FEH,0FDH,0FBH,0F7H
        ;百位,十位,个位,小位
 		END

⌨️ 快捷键说明

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