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

📄 用89c2051做温度计.asm

📁 AT89C2051+DS18B20做的一个0-125度的温度计
💻 ASM
字号:
	ORG	0000H	;DS18B20.ASM        0-125度的温度计  原创:陈永飞  QQ:49204743  地址:江苏省南京市
	TEMPER_L	EQU	41H	;用于保存读出温度的低8位          信箱:baiyni888@163.com
	TEMPER_H	EQU	40H	;用于保存读出温度的高8位
	FLAG1	EQU	38H	;是否检测到DS18B20标志位
	A_BIT1	EQU	31H	;数码管个位数存放内存位置
	B_BIT1	EQU	32H	;数码管十位数存放内存位置
        D_BIT1	EQU	35H     ;数码管百位数存放内存位置
DQ	EQU	P3.2	;30H,31H,32H,33H:	X	个位	十位	X
MOD7:	MOV	SP,#60H
	LCALL	GET_TEMPER	;调用读温度子程序
	LCALL	TEMPCOV
	LCALL	DISPLAY	;调用数码管显示子程序
	AJMP	MOD7
TEMP0:	INC	A
	AJMP	TEMP1
TEMPCOV:	MOV	A,TEMPER_L	;数据处理子程序TEMPCOV
	MOV	B,#16
	DIV	AB
	JB	B.3,TEMP0
TEMP1:	MOV	34H,A	;将TEMPER_L的高四位右移四位,存入34H中(温度值)
	MOV	A,B	;将TEMPER_L的低四位X10/16得小数后一位数.
	MOV	B,#10
	MUL	AB
	MOV	B,#16
	DIV	AB
	MOV	30H,A	;将小数后一位数.存入30H中
	MOV	A,TEMPER_H	;TEMPER_H中存放高8位数,权重16
	MOV	B,#16
	MUL	AB
	ADD	A,34H	;34H中存入温度值的整数部分
	MOV	B,#10
	DIV	AB
	MOV	31H,B	;个位存入31H中
	MOV	B,#10	;
	DIV	AB	;
	MOV	32H,B	;十位存入32H中
	MOV	B,#10	;
	DIV	AB	;
	MOV	35H,B	;百位存入33H中
	MOV	A,TEMPER_H
	MOV	33H,#10H	;
	JB	ACC.7,EXIT7
	MOV	33H,#00H
EXIT7:	RET
INIT_1820:	;这是DS18B20复位初始化子程序
	SETB	DQ
	NOP
	CLR	DQ	;主机发出延时537微秒的复位低脉冲
	MOV	R1,#3
TSR1:	MOV	R0,#107
	DJNZ	R0,$
	DJNZ	R1,TSR1
	SETB	DQ	;然后拉高数据线
	NOP
	NOP
	NOP
	MOV	R0,#25H
TSR2:	JNB	DQ,TSR3	;等待DS18B20回应
	DJNZ	R0,TSR2
	LJMP	TSR4	;延时
TSR3:	SETB	FLAG1	;置标志位,表示DS1820存在
	LJMP	TSR5
TSR4:	CLR	FLAG1	;清标志位,表示DS1820不存在
	LJMP	TSR7
TSR5:	MOV	R0,#117
TSR6:	DJNZ	R0,TSR6	;时序要求延时一段时间
TSR7:	SETB	DQ
	RET
	;-------------------------------------------------
GET_TEMPER:	;读出转换后的温度值
	SETB	DQ
	LCALL	INIT_1820	;先复位DS18B20
	JB	FLAG1,TSS2
	RET	;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:	MOV	A,#0CCH	;跳过ROM匹配
	LCALL	WRITE_1820
	MOV	A,#44H	;发出温度转换命令
	LCALL	WRITE_1820
	LCALL	DISPLAY	;等待AD转换结束,12位的话750微秒
	LCALL	INIT_1820	;准备读温度前先复位
	MOV	A,#0CCH	;跳过ROM匹配
	LCALL	WRITE_1820
	MOV	A,#0BEH	;发出读温度命令
	LCALL	WRITE_1820
	LCALL	READ_18200	;将读出的温度数据保存到35H/36H
	RET
	;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:	MOV	R2,#8	;一共8位数据
	CLR	C
WR1:	CLR	DQ
	MOV	R3,#6
	DJNZ	R3,$
	RRC	A
	MOV	DQ,C
	MOV	R3,#23
	DJNZ	R3,$
	SETB	DQ
	NOP
	DJNZ	R2,WR1
	SETB	DQ
	RET
	;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:	MOV	R4,#2	;将温度高位和低位从DS18B20中读出
	MOV	R1,#TEMPER_L	;低位存入TEMPER_L(TEMPER_L),高位存入(TEMPER_H)
RE00:	MOV	R2,#8	;数据一共有8位
RE01:	CLR	C
	SETB	DQ
	NOP
	NOP
	CLR	DQ
	NOP
	NOP
	NOP
	SETB	DQ
	MOV	R3,#9
RE10:	DJNZ	R3,RE10
	MOV	C,DQ
	MOV	R3,#23
RE20:	DJNZ	R3,RE20
	RRC	A
	DJNZ	R2,RE01
	MOV	@R1,A
	DEC	R1
	DJNZ	R4,RE00
	RET
	;显示子程序
DISPLAY:	MOV	DPTR,#TAB	;指定查表启始地址
	MOV	R0,#4
DPL1:	MOV	R1,#250	;显示1000次
DPLOP:	MOV	A,A_BIT1	;取个位数
	MOVC	A,@A+DPTR	;查个位数的7段代码
	MOV	P1,A	;送出个位的7段代码
	CLR	P3.7	;开个位显示
	ACALL	D1MS	;显示1MS
	SETB	P3.7
	MOV	A,B_BIT1	;取十位数
	MOVC	A,@A+DPTR	;查十位数的7段代码
	MOV	P1,A	;送出十位的7段代码
	CLR	P3.5	;开十位显示
	ACALL	D1MS	;显示1MS
	SETB	P3.5
	MOV	A,D_BIT1	;取百位数
	MOVC	A,@A+DPTR	;查百位数的7段代码
	MOV	P1,A	;送出百位的7段代码
	CLR	P3.4	;开百位显示
	ACALL	D1MS	;显示1MS
	SETB	P3.4
	MOV	P1,#00H
	DJNZ	R1,DPLOP	;100次没完循环
	DJNZ	R0,DPL1	;4个100次没完循环
	RET
	;1MS延时(按12MHZ算)
D1MS:	MOV	R7,#0FFH
	DJNZ	R7,$
	;	DJNZ	R7,$
	RET
	;实验板上的7段数码管0~9数字的共阴显示代码
TAB:	        DB        07DH;0
        DB        018H;1
        DB        06EH;2
        DB        03EH;3
        DB        01BH;4
        DB        037H;5
        DB        077H;6
        DB        01CH;7
        DB        07FH;8
        DB        03FH;9
	
	END
	

⌨️ 快捷键说明

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