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

📄 8ds18d20.asm

📁 是proteus仿真的另一个实例
💻 ASM
字号:
;这是关于DS18B20的读写程序,数据脚P2.2,晶振12MHZ
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;12位转化时每一位的精度为0.0625度
;分辨率0.1℃,精度0.05℃
  ORG  0000H

;单片机内存分配申明!
TEMPER_L  EQU  29H  ;保存读出温度的低8位
TEMPER_H  EQU  28H  ;保存读出温度的高8位
T_DF   	EQU  27H	;保存读出温度的小数部份
FLAG1   EQU  38H  	;是否检测到DS18B20标志位
A_BIT   EQU  20H  	;百位数存放内存位置
B_BIT   EQU  21H  	;十位数存放内存位置
C_BIT   EQU  22H 	;个位数存放内存位置
D_BIT	EQU  23H	;个位小数存放内存位置
S_BIT   EQU  24H	;正负号存放内存位置
MAIN:   LCALL	GET_TEMPER ;调用读温度子程序



;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度的整数部份
;判别正负
  	
		MOV		A,29H
		MOV		T_DF,A	;温度低字节暂存,待后作小数处理
		MOV		A,#0FH  ;取小数值
  		ANL		A,T_DF
		MOV		D_BIT,A
		MOV		A,28H

	   	JNB		ACC.7,POSI
  		CLR		C		;为负,求其绝对值
		MOV		A,29H
  		SUBB	A,#01H
  		CPL		A
		MOV  	T_DF,A  ;温度低字节暂存
  		MOV		A,#0FH  ;取小数值
  		ANL		A,T_DF
		MOV		D_BIT,A
		MOV		A,28H
  		SUBB	A,#00H
  		CPL		A
  		MOV		28H,A
		
  		AJMP	NEG
PROD:  	MOV		A,T_DF
  		MOV  	C,40H  ;将28H中的最低位移入C
  		RRC  	A
  		MOV  	C,41H
  		RRC  	A
  		MOV  	C,42H
  		RRC  	A
  		MOV  	C,43H
  		RRC  	A
  		MOV  	29H,A
  		RET
POSI:	MOV		S_BIT,#00H ;正号不显示
		ACALL	PROD
		AJMP	MAIN1
NEG:	MOV		S_BIT,#40H ;显示“-”
		ACALL	PROD
MAIN1:  LCALL  DISPLAY  ;调用数码管显示子程序

  		AJMP  	MAIN

;这是DS18B20复位初始化子程序
INIT_1820: 
		SETB  	p2.2
  		NOP
  		CLR  	p2.2
;主机发出延时537微秒的复位低脉冲
  		MOV  	R1,#3
TSR1:  	MOV  	R0,#107
  		DJNZ  	R0,$
  		DJNZ  	R1,TSR1
  		SETB  	p2.2  ;然后拉高数据线
  		NOP
  		NOP
  		NOP
  		MOV  	R0,#25H
TSR2:  	JNB  	p2.2,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  	p2.2
  		RET

;读出转换后的温度值

GET_TEMPER: 
		SETB  	p2.2
  		LCALL  INIT_1820 ;先复位DS18B20
  		JB 	 	FLAG1,TSS2
  		RET    			;判断DS1820是否存在?若DS18B20不存在则返回

TSS2:  	MOV  	A,#0CCH  ;跳过ROM匹配
  		LCALL  WRITE_1820
  		MOV  	A,#44H   ;发出温度转换命令
  		LCALL  WRITE_1820

;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒

  		LCALL  DISPLAY

  		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  	p2.2
  		MOV  	R3,#6
  		DJNZ  	R3,$
  		RRC  	A
  		MOV  	p2.2,C
  		MOV  	R3,#23
  		DJNZ  	R3,$
  		SETB  	p2.2
  		NOP
  		DJNZ  	R2,WR1
  		SETB  	p2.2
  		RET

;读DS18B20的程序,从DS18B20中读出两个字节的温度数据

READ_18200: 
		MOV  	R4,#2   ;将温度高位和低位从DS18B20中读出
  		MOV  	R1,#29H  ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:  	MOV  	R2,#8  ;数据一共有8位
RE01:  	CLR  	C
  		SETB  	p2.2
  		NOP
  		NOP
  		CLR  	p2.2
  		NOP
  		NOP
  		NOP
  		SETB  	p2.2

 		MOV  	R3,#9
RE10:   DJNZ  	R3,RE10

 		MOV  	C,p2.2

  		MOV  	R3,#23
RE20:   DJNZ  	R3,RE20

  		RRC  	A
  		DJNZ  	R2,RE01
 		MOV  	@R1,A
  		DEC  	R1
  		DJNZ  	R4,RE00
  		RET

;显示子程序

DISPLAY:  
		MOV  	A,29H  ;将29H中的十六进制数转换成10进制
  		MOV  	B,#100   
  		DIV  	AB
		MOV		A_BIT,A
		MOV		A,B
 	    MOV  	B,#10   
  		DIV  	AB
		MOV		B_BIT,A
  		MOV		A,B  
  		MOV		B,#10
  		DIV		AB
  		
  		MOV		C_BIT,B

  		MOV  	R0,#2
DPL1:   MOV  	R1,#250  ;显示500次
DPLOP:  MOV		A,D_BIT
  		MOV		DPTR,#DFTAB
		MOVC  	A,@A+DPTR  ;查个位小数的7段代码
 		MOV  	P1,A   ;送出个位小数的7段代码
  		CLR  	P3.7   ;开个位小数显示
		ACALL  	D1MS   ;显示1ms
  		SETB  	P3.7
		MOV  	A,C_BIT  ;取个位数
   		MOV  	DPTR,#NUMTAB  ;指定查表启始地址
 		MOVC  	A,@A+DPTR  ;查个位数的7段代码
 		MOV  	P1,A   ;送出个位数的7段代码
  		CLR  	P3.6  ;开个位显示
  		SETB	P1.7   ;个位小数点显示
  		ACALL  D1MS   ;显示1ms
  		SETB  	P3.6
  		MOV  	A,B_BIT  ;取十位数
  		CJNE	A,#00H,DISP1
		SETB	P3.5
		AJMP	DISP2
DISP1:	MOVC  	A,@A+DPTR  ;查十位数的7段代码
		MOV  	P1,A   ;送出十位的7段代码
		CLR  	P3.5  ;开十位显示
		ACALL  D1MS   ;显示1ms
	    SETB	P3.5
DISP2:	MOV		A,A_BIT		;取百位数
		CJNE	A,#00H,DISP3;百位数是0,转DISP4
		AJMP	DISP4
DISP3:	MOV		A,B_BIT
		MOVC  	A,@A+DPTR  ;查十位数的7段代码
		MOV  	P1,A   ;送出十位的7段代码
		CLR		P3.5
		ACALL	D1MS
		SETB	P3.5
		MOV		A,A_BIT
		MOVC	A,@A+DPTR		
		MOV		P1,A
		CLR		P3.4
		ACALL	D1MS
		SETB	P3.4
				
DISP4:  		
		MOV		A,S_BIT
		MOV		P1,A
		CJNE	A,#00H,D41
		
  		AJMP	DISP5
D41:	CLR		P3.4	;因负温度最小55度,‘-’移到百位	
		ACALL	D1MS
		SETB	P3.4
	
DISP5:  DJNZ  	R1,DPLOP  ;250次没完循环
  		DJNZ  	R0,DPL1  ;2个250次没完循环
  		RET

;1MS延时(按12MHZ算)

D1MS:   MOV		R7,#2
		MOV  	R6,#250
 		DJNZ  	R6,$
		DJNZ	R7,$-4
  		RET

;7段数码管0~9数字的共阴显示代码

NUMTAB: DB      3FH;0
        DB      06H;1
        DB      5BH;2
        DB      4FH;3
        DB      66H;4
        DB      6DH;5
        DB      7DH;6
        DB      07H;7
        DB      7FH;8
        DB      6FH;9
DFTAB:	DB		3FH,06H,06H,5BH
		DB		4FH,4FH,66H,66H
		DB		6DH,7DH,7DH,07H
		DB		7FH,7FH,6FH,6FH

  		END

⌨️ 快捷键说明

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