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

📄 gpf_ds18b20(2gezhuanhuan).asm

📁 两个DB18B20来显示温度
💻 ASM
字号:
;================================================================================
;copyright belong to 贵鹏斐(通过按键(P2.1)来选择使用哪个DS18B20温度传感器)         
;               信电学院
;               2008.8.16
;================================================================================
P1MDOUT   DATA  0A5H                       ; Port 1 Output Mode Configuration 
P2MDOUT   DATA  0A6H                   	   ; Port 2 Output Mode Configuration  
XBR1      DATA  0E2H                       ; Port I/O Crossbar Control 1   
OSCICN    DATA  0B2H                   	   ; Internal Oscillator Control   
PCA0MD    DATA  0D9H                   	   ; PCA Mode   
DQ        EQU    P1.7   
;================================================================================   
    	ORG 0000H
		AJMP MAIN
		ORG 0030H
MAIN:
		MOV  P1MDOUT, #0FFH	
		MOV  P2MDOUT, #00Ch			   	   ;配置端口,P1,P2为数字输出口
    	MOV  XBR1,    #0C0H  
    	ANL  PCA0MD,  #0BFH
  		MOV  PCA0MD,  #000H
		MOV  OSCICN,  #081H
		MOV  SP,      #60H
		CLR P2.2
		CLR P2.3
		SETB P2.1						   ;一上电将P2.1口拉高
		CLR EA							   ;禁止任何中断
		LCALL INT						   ;调用初始化子程序
        MOV A,#55H						   
		LCALL WRITE						   ;发配置ROM命令
		LCALL FADIZHI					   ;发DS18B20地址
		MOV A,#44H						   
		LCALL WRITE						   ;发转换温度命令
		LCALL INT						   ;再次初始化
		MOV A,#55H
		LCALL WRITE						   ;再次发配置ROM命令
		LCALL FADIZHI					   ;调用发地址子程序
		MOV A,#0BEH
		LCALL WRITE						   ;读暂态寄存器
		LCALL READ
		MOV R7,A						   ;低字节在R7中
		LCALL READ
		MOV R6,A						   ;高字节在R6中
		SJMP MAIN
;====================================================================================
;初始化子程序
;====================================================================================
INT:					   			   ;初始化子程序
  		 CLR EA						   ;使用ds18b20一定要禁止任何中断的产生
		 SETB DQ
		 NOP
         NOP
      L0:CLR  DQ					   ;总线为低复位电平
		 call delay500us			   ;总线复位电平保持500us
		 SETB DQ					   ;释放总线
		 MOV R2,#50
      L1:djnz R2,L1					   ;延时25us
		 clr C						   ;清存在标志
		 orl C,DQ					   
		 jc L0 						   ;存在?不存在则从来
		 mov R3,#80
      L5:orl C,DQ
		 jc L3
		 nop
		 djnz R3,L5
		 sjmp L0
      L3:mov R2,#240
      L2:nop
		 djnz R2,L2
		 ret
;====================================================================================
;延迟500us子程序
;====================================================================================
delay500us:
		mov r6,#200
lpr6:
		nop
		nop
		djnz r6,lpr6
		ret
;====================================================================================
;写命令子程序
;====================================================================================
WRITE:			    					;向DS18B20写操作命令子程序
    	CLR EA
		MOV R3,#8						;写入DS18B20的bit数,一个字节8个bit
   WR1:	SETB DQ
        MOV R4,#8
		RRC A							;把一个字节分成8个位循环移给C
		CLR DQ							;开始写入ds18b20要求处于复位低电平
   WRR2:nop
      	djnz R4,WRR2 	
		MOV DQ,C						;写入一个位
        MOV R4,#40
    WR3:nop
  		DJNZ R4,WR3
		DJNZ R3,WR1						;写入下一位
		SETB DQ
		ret
;=====================================================================================
;读命令子程序
;======================================================================================
READ:
		CLR EA
		MOV R3,#8						;连续读8个BIT
    RE1:CLR DQ							;读前总线保持为低
		NOP
		NOP
		SETB DQ							;开始读,总线释放
        MOV R4,#4
    RE2:NOP
		DJNZ R4,RE2
		MOV C,DQ						;从ds18b20总线读一个位
		RRC A							;把读到的位循环位移给A
		MOV R4,#45
    RE3:NOP
		DJNZ R4,RE3
		DJNZ R3,RE1						;读下一位
		SETB DQ
		ret
;=======================================================================================
;发地址子程序(根据P2.7口的按键——即高低电平来判断发哪个温度传感器序列号)
;=======================================================================================       
FADIZHI:
        JB P2.1,YELLOW					;P2.1没有键按下,黄线的温度传感器开始测温
		MOV A,#28H						;P2.1有键按下,黑线的温度传感器开始测温
		LCALL WRITE
		MOV A,#0A2H
		LCALL WRITE
		MOV A,#0E2H
		LCALL WRITE
		MOV A,#13H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#0C5H
		LCALL WRITE
		SJMP LOOP
YELLOW:	MOV A,#28H
		LCALL WRITE
		MOV A,#92H
		LCALL WRITE
		MOV A,#0DCH
		LCALL WRITE
		MOV A,#13H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#00H
		LCALL WRITE
		MOV A,#0EH
		LCALL WRITE
LOOP:
		RET
;========================================================================================
        END       

⌨️ 快捷键说明

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