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

📄 tmp.asm

📁 at89s51实验例程代码
💻 ASM
字号:
;以下程序测试控制程序
;
TIME0		EQU	0FC67H		;1MS
LEDPORT		EQU	P0
NOWTMPH		EQU	30H		;现在测到的温度整数部分
NOWTMPL		EQU	31H		;现在测到的温度的小数部分

DPLED1		EQU	32H		;显示LED第1位
DPLED2		EQU	33H		;显示LED第2位
DPLED3		EQU	34H		;显示LED第3位
LEDCOUNT	EQU	35H		;LED扫描计数器	
TMPCOUNT	EQU	36H
T0COUNT		EQU	37H

DS1820H		EQU	38H
DS1820L		EQU	39H


W1_PORT		BIT	P3.4		;1820接到的口线
;***********************************************************
E		BIT	P3.5		;LCD口线的定义
RW		BIT	P3.6
RS		BIT	P3.7

DSOKBIT		BIT	02H		;1820在线上标志
GET1_2BIT	BIT	03H		;是发转换指令,还是读温度

		ORG	0000H
		AJMP	MAIN
		ORG	000BH
		AJMP	TIME0_1

;以下为主程序的开始,完成对内存变量的初始化
		ORG	0100H
MAIN:		CLR	E		;取消LCD对LED的影响	
		CLR	RW
		SETB	RS

		MOV	R0,#20H
CLR0:		MOV	@R0,#00H
		INC	R0
		CJNE	R0,#60H,CLR0
		MOV	TH0,#HIGH(TIME0)
		MOV	TL0,#LOW(TIME0)
		MOV	TMOD,#01H
		SETB	TR0
		MOV	IE,#82H		
		MOV	T0COUNT,#14H
		MOV	TMPCOUNT,#0AH
MAIN4:		ORL	PCON,#01H
		AJMP	MAIN4
		
;以下为定时器中断程序		
		ORG	0200H
TIME0_1:	MOV	TH0,#HIGH(TIME0)
		MOV	TL0,#LOW(TIME0)
		DJNZ	T0COUNT,TODISPM
		MOV	T0COUNT,#14H		
TIME0_2:	DJNZ	TMPCOUNT,TODISPM
		MOV	TMPCOUNT,#0AH		;每200MS测一次温度
		AJMP	TPTMP_ST
TODISPM:	AJMP	TODISP		
;开始测1820的温度
TPTMP_ST:	JB	GET1_2BIT,GETTP2
		LCALL	GET_TMPER_1
		AJMP	JS_TMP
GETTP2:		LCALL	GET_TMPER_2
JS_TMP:		MOV	A,DS1820H
		ANL	A,#0FH
		SWAP	A
		MOV	B,A
		MOV	A,DS1820L
		ANL	A,#0F0H
		SWAP	A
		ORL	A,B
		MOV	NOWTMPH,A
		MOV	A,DS1820L
		ANL	A,#0FH
		MOV	B,#0AH			;X10先算出小数点后一位
		MUL	AB
		MOV	B,A
		ANL	A,#0F0H			;再除16,就是向右移4位
		SWAP	A		
		MOV	NOWTMPL,A
		MOV	A,B			
		ANL	A,#0FH
		MOV	B,#0AH			;再把余数X10
		MUL	AB
		ANL	A,#0F0H			;小数点后第二位四舍五入
		SWAP	A
		CJNE	A,#05H,JS_TMP1
JS_TMP1:	JC	TODISP
		INC	NOWTMPL
		MOV	A,NOWTMPL
		CJNE	A,#0AH,TODISP
		MOV	NOWTMPL,#00H
		INC	NOWTMPH	
TODISP:		NOP
;显示当前测到的温度
DISPNOW:	
		MOV	A,NOWTMPH
		MOV	B,#0AH
		DIV	AB
		ANL	A,#0FH
		MOV	DPLED1,A
		MOV	A,B
		ANL	A,#0FH
		MOV	DPLED2,A
		MOV	A,NOWTMPL
		ANL	A,#0FH
		MOV	DPLED3,A
		JB	DSOKBIT,TODISP_1
		MOV	DPLED1,#10H
		MOV	DPLED2,#10H
		MOV	DPLED3,#10H
;开始进行扫描显示
TODISP_1:	MOV	LEDPORT,#0FFH		;先关闭显示
		INC	LEDCOUNT
		MOV	A,LEDCOUNT
		CJNE	A,#03H,TODPLED2
		MOV	LEDCOUNT,#00H
		MOV	P2,#0F7H
		MOV	DPTR,#0700H
		MOV	A,DPLED1
		MOVC	A,@A+DPTR
		AJMP	TOLEDPORT
TODPLED2:	CJNE	A,#01H,TODPLED3
		MOV	P2,#0EFH
		MOV	DPTR,#0700H
		MOV	A,DPLED2
		MOVC	A,@A+DPTR
		CLR	ACC.7		
		AJMP	TOLEDPORT
TODPLED3:	MOV	P2,#0DFH
		MOV	DPTR,#0700H
		MOV	A,DPLED3
		MOVC	A,@A+DPTR
TOLEDPORT:	MOV	LEDPORT,A
		
TIME0_RE:	RETI







;测18B20要用到的子程序
;DS复位初始化程序
INIT_1820:	SETB	W1_PORT
		NOP
		CLR	W1_PORT
		MOV	R1,#03H
TSR1:		MOV	R0,#6BH	
		DJNZ	R0,$
		DJNZ	R1,TSR1
		SETB	W1_PORT
		NOP
		NOP
		NOP
		MOV	B,#25H
TSR2:		JNB	W1_PORT,TSR3
		DJNZ	B,TSR2
		LJMP	TSR4
TSR3:		SETB	DSOKBIT		;表示DS1820存在
		LJMP	TSR5
							
TSR4:		CLR	DSOKBIT		;表示DS1820不存在
		LJMP	TSR7

TSR5:		MOV	B,#117
		DJNZ	B,$	
TSR7:		SETB	W1_PORT
		RET

;读出转换后的温度值
GET_TMPER_1:	SETB	W1_PORT		;发出转换命令,要780MS才能转换完成
		LCALL	INIT_1820
		JB	DSOKBIT,TSS2
		CLR	GET1_2BIT
		RET
TSS2:		MOV	A,#0CCH		;跳过ROM匹配
		LCALL	WRITE_1820
		MOV	A,#44H		;发出温度转换命令
		LCALL	WRITE_1820
		SETB	GET1_2BIT
		MOV	TMPCOUNT,#32H	;要780MS才能转换完成,就等1S后读
		RET
		
GET_TMPER_2:	LCALL	INIT_1820	;准备读温度前先复位
		MOV	A,#0CCH		;跳过ROM匹配
		LCALL	WRITE_1820
		MOV	A,#0BEH
		LCALL	WRITE_1820				
		LCALL	READ_1820	;将读出的温度数据保存在DS1820H,DS1820L
		CLR	GET1_2BIT
		RET
	
;写DS1820的子程序
WRITE_1820:	MOV	R2,#08H
		CLR	C
WR1:		CLR	W1_PORT
		MOV	R3,#05H
		DJNZ	R3,$
		RRC	A
		MOV	W1_PORT,C	;把数据写到1W总线上
		MOV	R3,#15H
		DJNZ	R3,$
		SETB	W1_PORT
		NOP
		DJNZ	R2,WR1
		SETB	W1_PORT
		RET

;读DS1820的子程序
READ_1820:	MOV	R2,#08H
RE01:		CLR	C
		SETB	W1_PORT
		NOP
		NOP
		CLR	W1_PORT
		NOP
		NOP
		NOP
		SETB	W1_PORT
		MOV	R3,#08H
		DJNZ	R3,$
		MOV	C,W1_PORT
		MOV	R3,#15H
		DJNZ	R3,$
		RRC	A
		DJNZ	R2,RE01
		MOV	DS1820L,A
		MOV	R2,#08H
RE02:		CLR	C
		SETB	W1_PORT
		NOP
		NOP
		CLR	W1_PORT
		NOP
		NOP
		NOP
		SETB	W1_PORT
		MOV	R3,#08H
		DJNZ	R3,$
		MOV	C,W1_PORT
		MOV	R3,#15H
		DJNZ	R3,$
		RRC	A
		DJNZ	R2,RE02
		MOV	DS1820H,A
		RET

;重新写DS1820暂存存储器设定值
RE_CONFIG:	JB	DSOKBIT,RE_CONFIG1
		RET
RE_CONFIG1:	MOV	A,#0CCH		;发SKIP ROM命令
		LCALL	WRITE_1820
		MOV	A,#4EH		;发写暂存存储器命令	
		LCALL	WRITE_1820
		MOV	A,#00H
		LCALL	WRITE_1820
		MOV	A,#00H
		LCALL	WRITE_1820
		MOV	A,#7FH
		LCALL	WRITE_1820
		RET		
		
		
		ORG	0700H
;8字LED的连接方法
;P0.7	P.06	P0.5	P0.4	P0.3	P0.2	P0.1	P0.0
; H      G	 F	 E	 D	 C	 B 	 A
;LED字段码表
LEDCODE:	DB	0C0H		;0
		DB	0F9H		;1
		DB	0A4H		;2
		DB	0B0H		;3
		DB	99H		;4
		DB	92H		;5
		DB	82H		;6
		DB	0F8H		;7
		DB	80H		;8
		DB	90H		;9
		DB	88H		;A
		DB	83H		;B
		DB	0C6H		;C
		DB	0A1H		;D
		DB	86H		;E
		DB	8EH		;F
        	DB      0BFH		;-
		DB	0FFH		
		END	

⌨️ 快捷键说明

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