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

📄 18b20.asm

📁 18b20测温芯片与4位数码管显示的源程序
💻 ASM
字号:
;本程序测量温度范围:0~125度,精确到0.06;
;综合接线图: 
;1 用一根单条数据线把18B20的JP39接到CPU部分的JP53(P3口)的P3.0 
;2用一条4PIN的排线,把数码管译码部份的JP19接到CPU部份
;P0口的JP51的P0.0,P0.1,P0.2,0.3 四个端口。(即插入P0口的上半部分)。 
;3 用一条8PIN的排线。 把数码管译码部份的输出端JP88,接到数码管部分的数据口JP5 
;4用一条4PIN的排线,把38译码部份的JP22接到CPU部份P0口的JP51
;的P0.4,P0.5,P0.6,07 四个端口。(即插入P0口的下半部分)。此处不太好插入, 小心操作。 
;5 用一条8PIN的排线。 把38译码部份的输出端JP25,接到数码管部分的显示位口JP8。
;********************************************************************************
;*  日期:  2007-3-25                                                            *
;*  版本:  3.0                                                                  *
;*  作者:  深圳学林电子有限公司     专业8051单片机教学站                        *
;*  邮箱: sxj1974@163.com                                                       *
;*  网站: http://www.51c51.com     http://www.8951.com    更多例程请登陆网站   *
;********************************************************************************
;*  硬件:此程序在本公司xlisp系列单片机实验仪运行通过                           *
;********************************************************************************
;* 【版权】 Copyright(C)深圳学林电子有限公司 www.51c51.com  All Rights Reserved *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
;********************************************************************************
DAT   BIT P3.0   				;数据通信口
WDLSB DATA 30H 					;读出的温度低字节
WDMSB DATA 31H 					;读出的温度高字节
;***************************************************************
      ORG 0000H
      LJMP MAIN
      ORG 000BH
      SJMP TIMER0 				;定时显示

;****************************************************************
						;定时显示子程序,采用循环扫描方式
						;显示缓冲区40H~47H
        ORG 0040H
TIMER0:

	MOV P0,40H        			;最后一位值送p0
	ORL P0,#70H				; 点亮最后一位
	CALL T1MS
	MOV P0,41H
	ORL P0,#60H
	CALL T1MS
	MOV P0,42H
	ORL P0,#50H
	CALL T1MS
	MOV P0,43H
	ORL P0,#40H
    MOV TH0,#LOW(65536-10000)  			;定时器10MS中断
	MOV TL0,#HIGH(65536-10000)
	RETI
T1MS: mov	r5,#00h				;延时子程序
tt:	mov	r6,#9
	djnz	r6,$
	djnz	r5,tt
	ret
;*********************************************************
						;主程序:
MAIN:   MOV SP,#60H
	MOV P2,#0FFH
	MOV R2,#8
	MOV R0,#40H ;
OVER:   MOV @R0,#00H
        INC R0
	DJNZ R2,OVER
	MOV TMOD,#01H
	MOV TH0,#LOW(65536-10000)
	MOV TL0,#HIGH(65536-10000)
	SETB EA
	SETB ET0
	SETB TR0
LOOP:   LCALL DSWD 				;调用读出DS18B20温度程序
	SJMP LOOP                                                ; 读出DS18B20温度程序
DSWD:
	CLR EA
	LCALL RST
	JNB F0,KEND 				;如果没有应答,返回主程序
	MOV R0,#0CCH
	LCALL SEND_BYTE 			;跳过ROM匹配
	MOV R0,#44H				;发出温度转换命令
	LCALL SEND_BYTE
	SETB EA
	MOV P1,#00001111B
	MOV 48H,#1 				;廷时75ms以上准备读
SS2:    MOV 49H,#255
SS1:    MOV 4AH,#255
SS0:    DJNZ 4AH,SS0
 	DJNZ 49H,SS1
	DJNZ 48H,SS2
	MOV P1,#11111100B
	CLR EA
	LCALL RST
	JNB F0,KEND
	MOV R0,#0CCH 				;跳过ROM匹配
	LCALL SEND_BYTE
	MOV R0,#0BEH 				;发出读温度命令
	LCALL SEND_BYTE
	LCALL READ_BYTE
	MOV WDLSB,A
	LCALL READ_BYTE
	MOV WDMSB,A
	LCALL TRANS12
KEND:   mov p1,#01010101b
	SETB EA
	RET
;**********************************************************
;温度转换程序:精确到:0.06 ;
TRANS12:MOV A,30H
	ANL A,#0F0H
	MOV 3AH,A
	MOV A,31H
	ANL A,#0FH
	ORL A,3AH
	SWAP A
	MOV B,#10
	DIV AB
	MOV 43H,A
	MOV 42H,B ;
	MOV DPTR,#TABB
	MOV A,30H
	ANL A,#0FH
	MOV B,#2
	MUL AB
	MOVC A,@A+DPTR
	MOV 41H,A
	MOV A,30H
	ANL A,#0FH
	MOV B,#2
	MUL AB
	INC A
	MOVC A,@A+DPTR
	MOV 40H,A
	RET
TABB:   DB 0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0
	DB 5,6,6,2,6,8,7,5,8,1,8,7,9,3
;*************************************************

SEND_BYTE: 					;发送一个字节程序
	MOV A,R0
	MOV R5,#8
SEN3: 	CLR C
	RRC A
	JC SEN1
	LCALL WRITE_0
	SJMP SEN2
SEN1:   LCALL WRITE_1
SEN2: 	DJNZ R5,SEN3                    	; 循环8次,写一个字节
	RET
READ_BYTE: 					;读一个字节程序
	MOV R5,#8
READ1:  LCALL READ
	RRC A
	DJNZ R5,READ1                   	; 循环8次,读一个字节
	MOV R0,A
	RET
						;复位程序,如果复位置位F0,没有就复位F0
RST: 	SETB  DAT
	NOP
	NOP
	CLR DAT
	MOV R6,#250 				;主机发复位脉冲持续3μs×200=600μs
	DJNZ R6,$
	MOV R6,#50
	DJNZ R6,$
	SETB DAT                         	;主机释放总线,口线改为输入
	MOV R6,#15
	DJNZ R6,$
	CALL CHCK 				;调用应答检查程序
	MOV R6,#60
	DJNZ R6,$
	SETB DAT
	RET
CHCK: 	MOV C,DAT
	JC RST0
	SETB F0                          	;检测到信号,置位F0
	SJMP    CHCK0
RST0: 	CLR F0                           	;未准备好F0复位
CHCK0:  RET

WRITE_0: 				    	;写0
        CLR DAT
	MOV R6,#30
	DJNZ R6,$
	SETB DAT
	RET
WRITE_1:CLR DAT                             	;写1
	NOP
	NOP
	NOP
	NOP
    NOP
	SETB DAT
	MOV R6,#30
	DJNZ R6,$
	RET
						;读一位数据程序
READ: 	SETB DAT                     		;先复位至少1US产生读起始信号
	NOP
	NOP
	CLR DAT
	NOP
	NOP
	SETB DAT                      		;置位DAT准备接收数据
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	MOV C,DAT
	MOV R6,#23
	DJNZ R6,$
	RET
	END


⌨️ 快捷键说明

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