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

📄 18b20-1.asm

📁 IIC汇编子程序 在伟福仿真器调试通过 在主程序中 直接复制即可使用!
💻 ASM
字号:
;以下是DS18B20的程序: 
;|--------------------------------------------------------------| 
;| 获取单个ds1820转化的温度值的应用程序,P1.7接ds1820 | 
;|--------------------------------------------------------------| 
ORG 0000H 
AJMP MAIN 
ORG 0100H 
MAIN: 	 
		LCALL INT
		LCALL WAITMCU
		LCALL GET_TEMP
		LCALL CONVERT
		LCALL READ
						
;***18B20初始化****************************************************
INT:       CLR PSW.4 
           SETB PSW.3          ;设置工作寄存器当前所在的区域RS0
           CLR EA 			   	;使用ds1820一定要禁止任何中断产生 
L0:        CLR P1.7            ;ds1820总线为低复位电平 
           MOV R2,#200 
L1:        CLR P1.7 
           DJNZ R2,L1          ;总线复位电平保持600us 
           SETB P1.7           ;释放ds1820总线 
           MOV R2,#5 
L4:        DJNZ R2,L4          ;释放ds1820总线保持10us 
			RET                      
;*********************等待单片机信号
WAITMCU:
           CLR C               ;清存在信号(存在C=0,不存在C=1) 
           ORL C,P1.7 
           JC INIT_18B20        ;存在吗?不存在则重新来 
           MOV R6,#20 			 ;原来是80
L5:        ORL C,P1.7 			;等待单片机给应答信号 低电平有效
           JC INIT_18B20 
           DJNZ R6,L5
		   RET
		    
INIT_18B20: CLR P1.7            ;ds1820总线为低复位电平 
           MOV R2,#200 
L2:        CLR P1.7 
           DJNZ R2,L2          ;总线复位电平保持600us 
           SETB P1.7           ;释放ds1820总线 
           MOV R2,#5 
L3:        DJNZ R2,L3          ;释放ds1820总线保持10us 
	       AJMP WAITMCU 



;***************写入18B20命令************
						
                      
GET_TEMP:           
		   LCALL DELAY1MS
           MOV A,#0CCH 		   ;送入跳过ROM命令
           LCALL WRITE          
		   MOV A,#4EH		   ;写温度寄存器
		   LCALL WRITE		   
		   MOV A,#63H		   ;设定温度上限99
		   LCALL WRITE
		   MOV A,#01H		   ;设定温度下线0
		   LCALL WRITE
		   MOV A,#1FH		   ;设定温度精度9位
		   LCALL WRITE
		   
		   LCALL INT           ;温度转换完全,再次初使化ds1820
		   LCALL DELAY1MS
		   LCALL WAITMCU
		   
		   MOV A,#0CCH		   ;送入跳过ROM命令
		   LCALL WRITE
		   MOV A,#48H		   ;将寄存器中的温度报警值复制到EPROM中
		   LCALL WRITE
		   RET
          /* MOV A, #44H 
           LCALL WRITE         ;送入温度转换命令 
           LCALL INT           ;温度转换完全,再次初使化ds1820 
           MOV A,#0CCH 
           LCALL WRITE         ;送入跳过ROM命令 
           MOV A,#0BEH 
           LCALL WRITE         ;送入读温度暂存器命令 
           LCALL READ 
           MOV R7,A            ;读出温度值低字节存入R7 
           LCALL READ 
           MOV R6,A            ;读出温度值高字节存入R6 
           SETB EA 
           RET
		   */
		    


;****写数据****************************************************
WRITE:                         ;向ds1820写操作命令子程序 
           CLR EA 
           MOV R3,#8           ;写入ds1820的bit数,一个字节8个bit 
WR1:   	   RRC A               
           CLR P1.7
		   JC WRITE1

WRITE0:	    CLR P1.7				 ;写入0
		    MOV R4,#70
WAIT2:     	DJNZ R4,WAIT2 
			SETB P1.7          
	     	MOV R4,#2
WAIT3:		DJNZ R4,WAIT3
			DJNZ R3,WR1
			RET


WRITE1:	    CLR P1.7			  ;写入1
			MOV R4,#2
WAIT:		DJNZ R4,WAIT
			SETB P1.7
			MOV R4,#70
WAIT1:		DJNZ R4,WAIT1
			DJNZ R3,WR1
			RET	
		   /*CLR EA 
           MOV R3,#8           ;写入ds1820的bit数,一个字节8个bit 
WR1:       SETB P1.7 
           MOV R4,#8 		   
           RRC A               ;把一个字节data(A)分成8个bit环移给 C 
           CLR P1.7            ;开始写入ds1820总线要处于复位(低)状态 
WR2:       DJNZ R4,WR2         ;ds1820总线复位保持16us 
           MOV P1.7,C          ;写入一个bit 
           MOV R4,#30 
WR3:       DJNZ R4,WR3         ;原版的是等待40us 
           DJNZ R3,WR1         ;写入下一个bit 
           SETB P1.7           ;重新释放ds1820总线 
           RET*/
;****读温度*****************************************************
READ: 
		   CLR EA
		   LCALL INT
		   LCALL WAITMCU
		   LCALL DELAY1MS
		    MOV A,#0CCH 		   ;送入跳过ROM命令
           LCALL WRITE          	
		    MOV A,#0BEH 		   ;read scratchpad命令
           LCALL WRITE          	
          ;CLR EA 
           MOV R6,#8           ;连续读8个bit 
RE1:       CLR P1.7            ;读前总线保持为低 
           MOV R4,#4 
           NOP 
           SETB P1.7           ;开始读,总线释放 
RE2:       DJNZ R4,RE2         ;持续8us 
           MOV C,P1.7         ;从ds1820总线读得一个bit 
           RRC A               ;把读得的位值环移给 A 
           MOV R5,#30 
RE3:       DJNZ R5,RE3         ;持续60us 
           DJNZ R6,RE1         ;读下一个bit 
           SETB P1.7		   ;重新释放ds1820总线
		   MOV  R7,A			 
		   SETB EA
           RET
		    
;*********************延时1MS
DELAY1MS: ;精确延时1ms子程序
		   MOV R6,#2
	YS1MSD:MOV R7,#248
		   DJNZ R7,$
		   DJNZ R6,DELAY1MS
		   RET
;********************转换温度
CONVERT:   LCALL INT
		   LCALL WAITMCU
		   LCALL DELAY1MS
		   MOV A,#0CCH 		   ;送入跳过ROM命令
           LCALL WRITE          	
		    MOV A,#44H 		   ;CONVERT命令
           LCALL WRITE  
		   RET 


⌨️ 快捷键说明

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