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

📄 两片.asm

📁 两片18b20应用 同一总线方式 带有序列号检测功能 汇编程序
💻 ASM
字号:
;这是关于两个DS18B20的测温程序,数据脚为DQ,晶振是11.059MHZ
;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒
;显示温度从00到50度,精确到0.0625度
TEMPER_L EQU 29H;用于保存读出温度的低字节
TEMPER_H EQU 28H;用于保存读出温度的高字节
T_DF EQU 27H ;FORMAT后的小数部分(decimal fraction),半字节的温度小数(存在低四位)
T_INTEGER EQU 26H ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
FLAG1 BIT 50H;位地址50H是字节2AH的最低位,用作是否检测到DS18B20的标志位
DQ EQU P3.6
A_BIT EQU 20h ;十位数
B_BIT EQU 21h ;个位数
C_BIT EQU 22H ;个位小数
D_BIT EQU 23H ;十位小数
E_BIT EQU 24H ;百位小数
F_BIT EQU 25H ;千位小数

ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:   
           LCALL   INIT_RS232
           CLR P1.3
	          LCALL READ_CODE         ;----------用串口调试助手查看特征码--------------
	          LCALL D1S
	          LCALL D1S               ;------------------------------------------------  
           LCALL T_CONVERSION;调用测温度子程序
              LCALL D1S;延时1秒后再测
           LJMP MAIN
;-------------------读取特征码子程序----------------------------------------
READ_CODE:
LCALL INIT_1820;复位先
MOV A,#033H;
LCALL WRITE_1820;将读code命令:33h写入
LCALL D1MS
mov A,#0AAH
LCALL  TX_CHAR
LCALL READ_1820
MOV A,28H
LCALL  TX_CHAR
MOV A,29H
LCALL TX_CHAR
LCALL READ_1820
MOV A,28H
LCALL  TX_CHAR
MOV A,29H
LCALL TX_CHAR
LCALL READ_1820
MOV A,28H
LCALL  TX_CHAR
MOV A,29H
LCALL TX_CHAR
LCALL READ_1820
MOV A,28H
LCALL  TX_CHAR
MOV A,29H
LCALL TX_CHAR
MOV A,#0CDH
LCALL TX_CHAR
MOV A,#0DCH
LCALL TX_CHAR


PIPEI_0:                       ;-----------------------------匹配ROM(p3.6脚上的1820)-----------------------------
LCALL INIT_1820;复位先                     串口助手显示:     13 28 E4 E8 00 00 BF 00 
MOV A,#55H           
LCALL WRITE_1820 ;送入匹配ROM命令
MOV A,#28H
LCALL WRITE_1820
MOV A,#13H
LCALL WRITE_1820 
MOV A,#0E8H
LCALL WRITE_1820 
MOV A,#0E4H
LCALL WRITE_1820 
MOV A,#00H
LCALL WRITE_1820 
MOV A,#00H
LCALL WRITE_1820 
MOV A,#00H
LCALL WRITE_1820 
MOV A,#0BFH
LCALL WRITE_1820
ret                           ;-----------------------------匹配结束---------------------------


PIPEI_1:                      ;-------------------匹配P1.5上的,--------------  --------
LCALL INIT_1820;               ;串口助手显示:   11 28 27 85 00 01 36 00 
MOV A,#55H           
LCALL WRITE_1820 ;送入匹配ROM命令
MOV A,#28H
LCALL WRITE_1820
MOV A,#11H
LCALL WRITE_1820 
MOV A,#85H
LCALL WRITE_1820 
MOV A,#27H
LCALL WRITE_1820 
MOV A,#01H
LCALL WRITE_1820 
MOV A,#00H
LCALL WRITE_1820 
MOV A,#00H
LCALL WRITE_1820 
MOV A,#36H
LCALL WRITE_1820
ret              




;--------------DS18B20的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION:        LCALL INIT_1820;先复位DS18B20
                     JB FLAG1,T_C0
                     RET ; 判断DS1820是否存在  若DS18B20不存在则返回

T_C0:                MOV A,#0CCH ; 跳过ROM匹配
                     LCALL WRITE_1820
                     MOV A,#44H ; 发出温度转换命令
                     LCALL WRITE_1820
                     LCALL D1S   ;这里等待AD转换结束,12位的话要延时750m秒
                     LCALL INIT_1820;准备读温度前先复位
                     LCALL PIPEI_0
                     MOV A,#0BEH ; 发出读温度命令
                     LCALL WRITE_1820
                     LCALL READ_1820; 将读出的温度数据保存到28H(TEMPER_H)和29H(TEMPER_L)处
							LCALL T_FORMAT;将读出的2字节温度格式化
                     LCALL DISPLAY_0;调用显示子程序

							LCALL PIPEI_1
                     MOV A,#0BEH ; 发出读温度命令
                     LCALL WRITE_1820
                     LCALL READ_1820; 将读出的温度数据保存到28H(TEMPER_H)和29H(TEMPER_L)处
							LCALL T_FORMAT;将读出的2字节温度格式化
                     LCALL DISPLAY_1;调用显示子程序

							LCALL PIPEI_0     ;------------重丛俜⒁淮?--------------------------
                     MOV A,#0BEH 
                     LCALL WRITE_1820
                     LCALL READ_1820
							LCALL T_FORMAt
                     LCALL DISPLAY_0

							LCALL PIPEI_1
                     MOV A,#0BEH
                     LCALL WRITE_1820
                     LCALL READ_1820
							LCALL T_FORMAt
                     LCALL DISPLAY_1   ;---------------重发结束---------------------------
                     RET
;------DS18B20复位初始化程序-----------------------------------------
INIT_1820:   SETB DQ
                   NOP
                   CLR DQ
                   MOV R0,#3 ;主机发出延时720微秒的复位低脉冲
INIT0:         MOV R1,#120
                   DJNZ R1,$
                   DJNZ R0,INIT0

                   SETB DQ;然后拉高数据线
                   NOP

                   MOV R0, #18
INIT1:         JNB DQ, INIT3;延时72us等待DS18B20回应
                   DJNZ R0, INIT1
                   LJMP INIT4 ; 超时而没有响应
INIT3:         SETB FLAG1 ; 置标志位,表示DS1820存在
                   LJMP INIT5
INIT4:         CLR FLAG1 ; 清标志位,表示DS1820不存在
                   LJMP INIT6
INIT5:         mov  r0, #100	
                   DJNZ R0, $ ; 延时200us  存在时延
                   
            
                   
INIT6:         SETB DQ
			
			mov r0,#150
            djnz r0,$

                   RET

;---------写DS18B20的子程序(有具体的时序要求)-------------------------------------
WRITE_1820:   MOV R2,#8;一共8位数据
			  clr c
WR0:              CLR DQ
                     MOV R3,#6
                     DJNZ R3,$
                     RRC A
                     MOV DQ,C
                     MOV R3,#20
                     DJNZ R3,$
                     SETB DQ
                     NOP
                     NOP
                     DJNZ R2,WR0
                     SETB DQ
                     RET

;------读DS18B20的程序,从DS18B20中读出两个字节的数据--------------------------
READ_1820:      MOV R4,#2 ; 将高位和低位从DS18B20中读出
                MOV R1,#TEMPER_L ; 低位存入29H(TEMPER_L)
RE0:            MOV R2,#8
RE1:            SETB DQ
                   NOP
                   NOP
                   CLR DQ
                   NOP
                   NOP
                   SETB DQ
                   MOV R3,#5
                   DJNZ R3, $
                   MOV C,DQ
                   MOV R3,#20
                   DJNZ R3, $
                   RRC A
                   DJNZ R2,RE1
                   MOV @R1,A
                   DEC R1            ; 高位存入28H(TEMPER_H)
                   DJNZ R4,RE0
                   RET

;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:         MOV A, #0FH
                  ANL A, TEMPER_L       ;取低8位的低4位
                  MOV T_DF, A           ;获得小数部分(4位),送到T_DF

                  MOV A, TEMPER_L       
                  SWAP A
                  MOV TEMPER_L, A        ;将TEMPER_L高4位与低4位交换

                  MOV A, TEMPER_H        ;将 TEMPER_H送A然后将A的高4位与低4位交换
                  SWAP A
                  MOV R0, #TEMPER_L       
                  XCHD A, @R0            ;交换A和@R0的低4位

                  MOV T_INTEGER, A       ;获得整数部分(1字节)
                  RET                 

;-------显示的子程序(显示前先格式转换)---------------------------------------
DISPLAY_0:             mov a, T_INTEGER
                     mov b,#10
                     div ab
                     mov A_BIT,a ;十位存在A_B
                     mov B_BIT,b ;个位存在B_BIT
                     MOV A, T_DF
                     MOV R0, #C_BIT
                     MOV R2, #4
               	D0:  MOV B, #10
                     MUL AB
                     MOV B, #16
                     DIV AB
                     MOV @R0, A      ;从个位小数C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
                     INC R0
                     MOV A, B
                     DJNZ R2, D0        ;/*
                     ;----二进制到ASCII码转换--------------,不转换的话就是温度的各位了
                     MOV A, #30H
                     ORL A_BIT, A
                     ORL B_BIT, A
                     ORL C_BIT, A
                     ORL D_BIT, A
                     ORL E_BIT, A
                     ORL F_BIT, A       ; */                     
                     ;//-------------------------------------
                    ; MOV A, #10000000B               
                    ; MOV   DPTR, #LINE1
                     MOV A, A_BIT
                     LCALL TX_CHAR
                     MOV A, B_BIT
		               LCALL TX_CHAR        
                     MOV A, #2EH
                     LCALL TX_CHAR;'.'字符
                     MOV A, C_BIT
		               LCALL TX_CHAR
                     MOV A, D_BIT
		               LCALL TX_CHAR
                     MOV A, E_BIT
		               LCALL TX_CHAR
                     MOV A, F_BIT
		               LCALL TX_CHAR
                     MOV A, #35                        ;下面两个是摄氏度的数字符号
		               LCALL TX_CHAR
                     MOV A, #43
		               LCALL TX_CHAR
                     MOV A, #36
		               LCALL TX_CHAR
                     
                    ; mov a, #11000000B                 ; LINE2: DB 'WANG XUE MIN!',00H
                     RET                                      

							;-------显示的子程序(显示前先格式转换)---------------------------------------
							;-------显示的子程序(显示前先格式转换)---------------------------------------
DISPLAY_1:           Mov a, T_INTEGER
                     Mov b,#10
                     Div ab
                     mov A_BIT,a ;十位存在A_B
                     mov B_BIT,b ;个位存在B_BIT
                     MOV A, T_DF
                     MOV R0, #C_BIT
                     MOV R2, #4
               	D9:  MOV B, #10
                     MUL AB
                     MOV B, #16
                     DIV AB
                     MOV @R0, A      ;从个位小数C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
                     INC R0
                     MOV A, B
                     DJNZ R2, D9        ;/*
                     ;----二进制到ASCII码转换--------------,不转换的话就是温度的各位了
                     MOV A, #30H
                     ORL A_BIT, A
                     ORL B_BIT, A
                     ORL C_BIT, A
                     ORL D_BIT, A
                     ORL E_BIT, A
                     ORL F_BIT, A       ; */                     
                     ;//-------------------------------------
                    ; MOV A, #10000000B               
                    ; MOV   DPTR, #LINE1
                     MOV A, A_BIT
                     LCALL TX_CHAR
                     MOV A, B_BIT
		               LCALL TX_CHAR        
                     MOV A, #2EH
                     LCALL TX_CHAR;'.'字符
                     MOV A, C_BIT
		               LCALL TX_CHAR
                     MOV A, D_BIT
		               LCALL TX_CHAR
                     MOV A, E_BIT
		               LCALL TX_CHAR
                     MOV A, F_BIT
		               LCALL TX_CHAR
                     MOV A, #35                        ;下面两个是摄氏度的数字符号
		               LCALL TX_CHAR
                     MOV A, #43
		               LCALL TX_CHAR
                     MOV A, #33
		               LCALL TX_CHAR
                     
                    ; mov a, #11000000B                 ; LINE2: DB 'WANG XUE MIN!',00H
                     RET                                      

							;-------显示的子程序(显示前先格式转换)---------------------------
                                 
;---1mS延时(按12MHZ算)--------------------------------------------------------------
D1mS:      MOV R7,#250        ;4*250+1=1001us
LOOP0:    NOP
              NOP
              DJNZ R7,LOOP0
              RET
;----1S延时(按12MHZ算)---------------------------------------------------------------
D1S:      Mov R6,#4
LOOP2:    mov R5,#250
LOOP1:    LCALL D1mS
              DJNZ R5,LOOP1
              DJNZ R6,LOOP2
              RET

INIT_RS232:                         ;----------------串口初始化----------------------
	MOV SCON,#50H
	MOV TMOD,#20H
	MOV TH1,#0FDH
	SETB TR1
	SETB TI
	RET
;-----------------------
TX_CHAR:
	JNB TI,$
	CLR TI
	MOV SBUF, A
	RET
;--------------------------------------------------------------------------------------
END

⌨️ 快捷键说明

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