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

📄 ds18b20.asm

📁 基于单片机AT89C51和温度传感器DS18S20的测量温度源程序
💻 ASM
字号:
;*****************************************************************************************
;								MCS8051-III学习板演示程序
;							
;						(c) Copyright 2007-2007,广州恒芯电子
;								All Rights Reserved
;*****************************************************************************************

;*****************************************************************************************
;程序说明
;*****************************************************************************************
;名称: MCS8051-III学习板演示程序(温度芯片测试)
;功能: 读取芯片DS18B20的温度,并在数码管显示
;版本:2007-07-01

;*****************************************************************************************
;硬件说明
;*****************************************************************************************
;单片机:   兼容MCS-51单片机/STC89C51
;晶振频率: 12MHz

;*****************************************************************************************
;说明:程序预定义	
;*****************************************************************************************
LED7A_CTRL	EQU		P1.7					;数码管第一位控制引脚(0为有效,1为无效)
LED7B_CTRL	EQU		P1.6					;数码管第二位控制引脚(0为有效,1为无效)
LED7C_CTRL	EQU		P1.5					;数码管第三位控制引脚(0为有效,1为无效)
LED7D_CTRL	EQU		P1.4					;数码管第四位控制引脚(0为有效,1为无效)

LED7_STATUS	EQU		P0						;数码管状态引脚(0为有效,1为无效)

LED7A_DATA  EQU		70H						;数码管第一位显示值(千位)
LED7B_DATA  EQU		71H						;数码管第二位显示值(百位)
LED7C_DATA  EQU		72H						;数码管第三位显示值(十位)
LED7D_DATA  EQU		73H						;数码管第四位显示值(个位)

LED7_NUM	EQU		74H						;数码管动态扫描值(值为从0到3)

DQ			EQU		P3.2					;温度芯片数据端
TEML		EQU		76H						;温度数据低位
TEMH		EQU		77H						;温度数据高位

;*****************************************************************************************
;说明:程序开始	
;*****************************************************************************************
			ORG		0000H					;程序首地址 PC=0000H
			JMP		START					;程序跳转到START PC=0030H   
	
			ORG		000BH					;T0中断程序入口
			JMP		LED7SCAN				;跳到数码管动态扫描处理程序
	
			ORG		0030H					;程序开始
START:		
			MOV		DPTR, #LED7TAB			;数码管显示码表地址送DPTR
			MOV		LED7_NUM, #0			;数码管动态扫描值至0,扫描第一位
		
											;T0中断设定
		 	MOV		TMOD, #00000001B		;使用T0:GATE=0,C/T=0(定时),M1 M0=01(工作方式1)
			MOV		TH0, #0ECH				;中断时间为5毫秒 
			MOV		TL0, #078H
			SETB	ET0						;允许T0中断		
			SETB    TR0						;使T0工作
			SETB	EA						;总中断开启
L1:	
			MOV		LED7A_DATA, #16			;数码管第一位初始值
			MOV		LED7B_DATA, #16			;数码管第二位初始值
			MOV		LED7C_DATA, #0			;数码管第三位初始值
			MOV		LED7D_DATA, #0			;数码管第四位初始值
L2:
			CLR		TR0

			SETB	DQ
			CALL	INIT					;初始化
			
			MOV		A,	#0CCH				;跳过ROM匹配
			CALL	WRITE
			MOV		A,	#44H				;发出温度转换命令
			CALL	WRITE
			
			SETB	TR0

			MOV		R7,	#50H				;延时750us转换时间	 b;????? #50	=750us, #50H=#80=1200us
			CALL	DELAY
			
			CLR		TR0
			CALL	INIT					;准备读温度前先复位
			
			MOV		A,	#0CCH				;跳过ROM匹配
			CALL	WRITE
			
			MOV		A,	#0BEH				;发出读温度命令
			CALL	WRITE
			
			CALL	READ					;读出温度
			MOV		TEML,	A				
			CALL	READ
			MOV		TEMH,	A
			
			SETB	TR0

			MOV		A,	TEML				;温度转换
			ANL		A,	#0F0H
			SWAP	A
			MOV		TEML,	A

			MOV		A,	TEMH
			ANL		A,	#0FH
			SWAP	A
			
			ORL		A,	TEML

			MOV		R3,	A
			CLR		A			     ;记住,要清零
			CLR		C				 ;记住,要清零
L3:			ADD		A,	#01H	     ;妙,好,将十六进制的温度转换为十进制的温度数 
			DA		A
			DJNZ	R3,	L3
					
			MOV		TEML,	A
			
			ANL		A,	#0FH				;显示数据
			MOV		LED7D_DATA,	A
			MOV		A,	TEML
			SWAP	A
			ANL		A,	#0FH
			MOV		LED7C_DATA,	A
			
			MOV		R7,	#0FFH				;延时	;;;?????????  mei yong ba 
			CALL	DELAY
		   	MOV		R7,	#0FFH				;延时
			CALL	DELAY
			MOV		R7,	#0FFH				;延时
			CALL	DELAY
			MOV		R7,	#0FFH				;延时
			CALL	DELAY
			MOV		R7,	#0FFH				;延时
			CALL	DELAY
			MOV		R7,	#0FFH				;延时
			CALL	DELAY

			JMP		L2						;循环

;*****************************************************************************************		
;函数:INIT
;说明: 初始化子程序	
;参数: 无
;返回; 无
;*****************************************************************************************						
INIT:
     SETB DQ
     NOP
     CLR DQ

     MOV R7,#34 							;延时510us
     CALL DELAY

     SETB DQ

     MOV R7,#04  							;延时60us
     CALL DELAY

     MOV R7,#28  							;延时420us
     CALL DELAY

     SETB DQ     							;然后拉高数据线
BACK:RET

;*****************************************************************************************		
;函数:WRITE
;说明: DS18B20写字节操作	
;参数: A存放写入数据
;返回; 无
;*****************************************************************************************						
WRITE:
        CLR C
        MOV R2,#8     						;一共8位数据
WR1:				 	
        CLR DQ

        MOV R7,#1
        CALL DELAY

        RRC A
        MOV DQ,C
        MOV R7,#1
        CALL DELAY

        SETB DQ
        NOP
        DJNZ R2,WR1
        SETB DQ
        RET

;*****************************************************************************************		
;函数:READ
;说明: DS18B20读字节操作	
;参数: 无
;返回; A存放读出数据
;*****************************************************************************************						
READ:
     MOV R2,#8   ;数据一共有8位
WIN01:
     CLR C
     SETB DQ
     NOP
     NOP
     CLR DQ
     NOP
     NOP
     NOP
     SETB DQ

     MOV R7,#01
     CALL DELAY

     MOV C,DQ

     MOV R7,#03
     CALL DELAY

     RRC A
     DJNZ R2,WIN01

     RET
						
;*****************************************************************************************		
;函数:LEDSCAN
;说明: 数码管动态扫描处理程序	
;参数: 无
;返回; 无
;*****************************************************************************************						
LED7SCAN:				
			PUSH	ACC						;ACC入栈
			PUSH	PSW						;PSW入栈
					
			MOV		A, LED7_NUM				;数码管动态扫描值送A
		
			CJNE	A, #0, LED7SCAN_1		;若数码管动态扫描值为0,则处理数码管的第一位,否则跳转到LED7SCAN_1
			SETB	LED7D_CTRL				;设置数码管第四位无效
			MOV		A, LED7A_DATA			;将千位值送A
			MOVC	A, @A+DPTR				;将显示码送A
			CLR		LED7A_CTRL				;设置数码管第一位有效
			JMP		LED7SCAN_4				;跳转到LED7SCAN_4
				
LED7SCAN_1:
			CJNE	A, #1, LED7SCAN_2		;若数码管动态扫描值为1,则处理数码管的第二位,否则跳转到LED7SCAN_2
			SETB	LED7A_CTRL				;设置数码管第一位无效
			MOV		A, LED7B_DATA			;将百位值送A
			MOVC	A, @A+DPTR				;将显示码送A
			CLR		LED7B_CTRL				;设置数码管第二位有效
			JMP		LED7SCAN_4				;跳转到LED7SCAN_4
				
LED7SCAN_2:
			CJNE	A, #2, LED7SCAN_3		;若数码管动态扫描值为2,则处理数码管的第三位,否则跳转到LED7SCAN_3
			SETB	LED7B_CTRL				;设置数码管第二位无效
			MOV		A, LED7C_DATA			;将十位值送A
			MOVC	A, @A+DPTR				;将显示码送A
			CLR		LED7C_CTRL				;设置数码管第三位有效
			JMP		LED7SCAN_4				;跳转到LED7SCAN_4
				
LED7SCAN_3:
			SETB	LED7C_CTRL				;设置数码管第三位无效
			MOV		A, LED7D_DATA			;将个位值送A
			MOVC	A, @A+DPTR				;将显示码送A
			CLR		LED7D_CTRL				;设置数码管第四位有效

			MOV		LED7_NUM, #0			;数码管动态扫描值置0
			JMP		LED7SCAN_5				;跳转到LED7SCAN_5

LED7SCAN_4:
			INC		LED7_NUM				;数码管动态扫描值加1
LED7SCAN_5:	
			MOV		LED7_STATUS, A			;显示码送数码管状态引脚
			
			MOV		TH0, #0ECH				;重新设置T0定时值
			MOV		TL0, #078H
			
			POP		PSW						;PSW出栈
			POP		ACC						;ACC出栈
			RETI							;中断返回
			
;*****************************************************************************************		
;函数:DELAY
;说明:程序延时	
;参数: R7存放延时数据
;返回: 无
;*****************************************************************************************		
DELAY:		
			MOV		R6, #04H
DELAY_1:
			DJNZ	R6, $
			DJNZ	R7, DELAY

			RET

;*****************************************************************************************
;说明:七段数码管十六进制显示码表		
;*****************************************************************************************
LED7TAB:		
			DB		0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H	;从'0'到'9'
			DB		088H,083H,0C6H,0A1H,086H,08EH,0FFH			     	;从'A'到'F'	
	
		
;*****************************************************************************************		
;说明:程序结束	
;*****************************************************************************************		
			END								;程序结束


⌨️ 快捷键说明

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