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

📄 wendu.asm

📁 51单片机汇编语言编制的温度测量与显示程序
💻 ASM
字号:
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)
FLAG1 EQU 38H;是否检测到DS18B20标志位

		ORG 0000H
		LJMP MAIN
		ORG 0030H
MAIN: 	MOV R0,#00H		   ;内部RAM低128字节清0
		MOV R1,#80H
MAIN1:	MOV @R0,#00H
		INC R0
		DJNZ R1,MAIN1
		MOV SP,#60H
MAIN2:	LCALL INIT_1820;调用复位DS18B20子程序
		LCALL GET_TEMPER;调用读温度子程序
		MOV A,TEMPER_L
		MOV C,40H;将28H中的最低位移入C
		RRC A
		MOV C,41H
		RRC A
		MOV C,42H
		RRC A
		MOV 29H,A
		JNB ACC.0,loop8
		MOV 34H,#05H
		AJMP loop0
loop8:		mov 34h,#00h
loop0:		mov 33h,#0ah
		clr c
		rrc a		;移除小数部分
		mov b,#64h
		div ab
		mov 30h,a
		mov a,#0ah
		xch a,b
		div ab
		MOV 31H,A
		MOV 32H,B
		lcall DISPLAY
		AJMP MAIN2	
DISPLAY:	PUSH PSW
		PUSH ACC
		SETB RS0
		CLR C
		MOV R0,#30H   		;显示缓冲区首地址
		MOV R2,#08H
		MOV R3,#01H
LOOP2:		MOV A,@R0			;读显示数据
	    	MOV DPTR,#TAB
        	MOVC A,@A+DPTR      ; 转换为字行码
		CLR C
LOOP:		RLC A
		MOV P1.0,C          ;将字行码送595移位寄存器
		CLR P1.1
		SETB P1.1
		CLR P1.1
		DJNZ R2,LOOP
		MOV R2,#08H
		MOV A,R3            ;将位码送595移位寄存器
		CLR C
LOOP1:		RLC A
		MOV P1.0,C
		CLR P1.1
		SETB P1.1
		CLR P1.1
		DJNZ R2,LOOP1
		CLR P1.2       		;595锁存
		SETB P1.2
		CLR P1.2
	    	ACALL DIMS
	    	INC R0            	;显示缓冲区地址加1
		MOV A,R3
		JB ACC.4,QUIT
		RL A
        	MOV R3,A
        	MOV R2,#08H
        	AJMP LOOP2
 QUIT:  	POP ACC
        	POP PSW
        	CLR RS0
        	RET
 DIMS:  	MOV R7,#02H
 DL:		MOV R6,#0FFH
 DL1:		DJNZ R6,DL1
 		DJNZ R7,DL
 		RET
 D1S:   	MOV R7,#0AH
 DL5:		MOV R6,#0FFH
 DL4:		MOV R5,#0FFH
 DL2:		DJNZ R5,DL2
 DL3:		DJNZ R6,DL4
 		DJNZ R7,DL5
 		RET
 GET_TEMPER:	SETB P3.3 ; 定时入口
		LCALL INIT_1820;先复位DS18B20
		JB FLAG1,TSS2
		RET
TSS2:		MOV A,#0CCH ; 跳过ROM匹配
		LCALL WRITE_1820
		MOV A,#44H ; 发出温度转换命令
		LCALL WRITE_1820
		LCALL DIMS;这里通过调用子程序实现延时一段时间,等待AD转换结束,12位的话750微秒.
		LCALL INIT_1820;准备读温度前先复位
		MOV A,#0CCH ; 跳过ROM匹配
		LCALL WRITE_1820
		MOV A,#0BEH ; 发出读温度命令
		LCALL WRITE_1820
		LCALL READ_18200; 将读出的温度低位字节送TEMPER_L
		mov TEMPER_L,a
		LCALL READ_18200; 将读出的温度高位字节送TEMPER_H
		mov TEMPER_H,a
		RET
				
; DS18B20复位初始化程序
INIT_1820:SETB P3.3
		MOV R2,#200;主机发出延时600微秒的复位低脉冲
ini11:	CLR p3.3				
		DJNZ R2,ini11
		SETB p3.3	;然后拉高数据线
		MOV R2,#30
ini12:	DJNZ R2,ini12		;延时60微秒,等待DS18B20回应
 		clr c
 		ORL c,p3.3	;DS18B20数据线变低码
		jc INI16	;DS18B20未准备好
		SETB FLAG1
		mov r6,#80	
ini13:		orl c,p3.3
		jc ini14	;DS18B20数据线变高,初始化成功
		djnz r6,ini13
		AJMP INI16	
ini14:		mov r2,#240
ini15:		djnz r2,ini15
		SETB P3.3
		ret
INI16:		CLR FLAG1
		SETB P3.3
		RET
		
		
	
		
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:	MOV R3,#8;		一共8位数据
wr11:		setb p3.3
		mov r4,#8
		rrc a		;写入位从A中移到CY
		clr p3.3
wr12:		djnz r4,wr12	;等待16微秒
		mov p3.3,c	;命令字按位依次送给DS18B20
		mov r4,#20
wr13:		djnz r4,wr13
		djnz r3,wr11
		setb p3.3
		ret	
; 读DS18B20的程序
READ_18200:	MOV R6,#8 	; 一共8位数据
 rd11:		clr p3.3
 		mov r4,#4	;低电平持续2微秒
 		nop
 		setb p3.3	;口线设为输入
 rd12:	djnz r4,rd12	;等待8微秒
 		mov c,p3.3
 		rrc a
 		mov r5,#30			
rd13:	djnz r5,rd13	;保证读过程持续60微秒
		djnz r6,rd11
		setb p3.3
		RET
TAB:   	DB 0C0H,0F9H,0A4H,0B0H,99H
 		DB 92H, 82H,0F8H,80H,90H,7FH
        END

⌨️ 快捷键说明

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