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

📄 ok_18b20.asm

📁 基于c8051f020的温度传感器18b20编程
💻 ASM
字号:
;根据逻辑分析仪的检测,在复位拉低总线后497微秒再释放总线时,
;18b20的应答时间为30.8微秒,所以至少等待30微秒以上
;程序功能:读18B20的数据转换后放在固定地址中,72H(百位),73H(十位),74H(个位),75H(小数位)
;2007-07-17
$INCLUDE(C8051F020.INC)
CS1 EQU P0.2

	ORG 00H
	LJMP MAIN
	ORG 100H
MAIN:MOV WDTCN,#0DEH
	   MOV WDTCN,#0ADH
	   MOV IE,#00H
;配置系统时钟使用外部晶振22.1184MHz
CLOCK:      MOV  OSCXCN,#67H        ;外部晶振模式,大的晶振驱动电流
						CLR  A
						DJNZ ACC,$
						DJNZ ACC,$
  		LOOP:	MOV  A,OSCXCN           ;OSCXCN.7为0时表明外部晶振没有起振或不稳定,为1时表明稳定运行
		      	JNB  ACC.7,LOOP
		      	orl  OSCICN,#08H        ;内部晶振禁止
;初始化交叉开关
PORT:       MOV  XBR0,#04H          ;UART0 TX0配置到P0.0口,RX0配置到P0.1口
	      		MOV  XBR1,#00H          ;定时器、中断端口不配置
	      		MOV  XBR2,#40H          ;交叉开关 Crossbar开启
	      		ORL  P0MDOUT,#0FFH       ;P0.1推挽
						ORL  P1MDOUT,#40H
;UART0 用T1作波特率发生器

;UART0_Init:
						MOV  SCON0,#50H	;SCON0: 模式1, 10-bit UART, 使能RX
						MOV  TMOD,#20H	;TMOD: 定时器T1, 模式2, 8-bit 自动重载
						MOV  TH1,#0B8H	;设置定时器1作为波特率的重载值TH1=256-(22118400/19200/16)D
            SETB TR1       					;打开定时器1 
					  ORL  CKCON,#10H	;定时器1用系统时钟作为它的时基
						ORL  PCON,#80H	;SMOD0 = 1;波特效率加倍
  					SETB  TI        ;初始化发送标志	      	
BEGAIN:  
       
       LCALL B20_INIT     ;1 初始化
       MOV A,#0CCH        ;2 跳过读序列号
       LCALL WRITE
			 MOV A,#44H         ;3 启动温度转换
			 LCALL WRITE
       
			 LCALL B20_INIT	  ;1 初始化
       MOV A,#0CCH	  ;2 跳过读序列号,ROM命令
       LCALL WRITE
			 MOV A,#0BEH	  ;3 读取温度寄存器
       LCALL WRITE

       LCALL READ	  ;读取从机发来的数据
       MOV R0,A
			 LCALL DELAY
       LCALL READ
       MOV R1,A
       LCALL DELAY
			 LCALL EXCHANG
;开始发送
       ;MOV A,R0
      ; MOV SBUF0,A
      ; JNB TI,$
      ; CLR TI
      ; MOV A,R1
      ; MOV SBUF0,A
      ; JNB TI,$
      ; CLR TI
       
       LJMP BEGAIN

;===========================================================
;子程序
;===========================================================
;-----------------------------------------------------------
;按位写入
WRITE: MOV R7,#8    ;写8位
       CLR C        ;清标志位
   WR1:
	     RRC A
	     CLR CS1      ;写数据都以拉低总线开始
       MOV R6,#90
       DJNZ R6,$
       MOV CS1,C    ;延时大概15微秒写位
       MOV R6,#255   ;
       DJNZ R6,$
			 MOV R6,#120
			 DJNZ R6,$
       SETB CS1     ;延时50微秒左右置高总线
       MOV R6,#130
			 DJNZ R6,$    
       DJNZ R7,WR1
       RET
;------------------------------------------------------------
;------------------------------------------------------------
;按位读出
READ:  MOV R7,#8   ;读8位
RD1:   CLR CS1      ;拉低总线
       MOV R6,#10
			 DJNZ R6,$    ;延时至少1微秒
       SETB CS1     ;置高总线
       MOV R6,#80
       DJNZ R6,$
       MOV C,CS1    ;延时后读取位数据
       MOV R6,#250   ;延时40微秒左右1位读完
       DJNZ R6,$
			 MOV R6,#80
			 DJNZ R6,$
       RRC A
			 MOV R6,#10
			 DJNZ R6,$    ;延时1微秒以上为读下一位做准备
       DJNZ R7,RD1  ;8位不够接着读下一位
       RET
;-------------------------------------------------------------
EXCHANG: MOV   A,R0      ;DS18B20采集到的原始数据已存放在R0,R1中.
         MOV   B,#16             ;数据处理:将原始转换为十进制数据,存放在
		 DIV   AB                ;72H(百位),73H(十位),74H(个位),75H(小数位)中.
         MOV   74H,A
         MOV   A,R1      
         MOV   B,#16
         MUL   AB
         ADD    A,74H
         MOV   B,#10
         DIV   AB
         MOV   74H,B
         MOV   B,#10
         DIV   AB
         MOV   73H,B
         MOV   72H,A
         MOV   71H,#0
         MOV   A,21H
         ANL   A,#0FH
         MOV   B,#8
         DIV   AB
         MOV   75H,#0
         CJNE   A,#1,SSS
         MOV   75H,#5
 SSS:    RET
;-------------------------------------------------------------
;18B20初始化
B20_INIT:CLR CS1    ;拉低总线497微秒以上
				 LCALL DELAY
         SETB CS1     ;置高总线
         MOV R6,#255   ;延时35微秒,等待18b20响应
         DJNZ R6,$
   WAIT: MOV C,CS1
         JNC WAIT      ;c为1说明没有应答,继续等待,为0说明18b20应答,延时3微秒退出复位		 
         RET

DELAY: MOV R5,#255   ;延时497微秒
	 L1: MOV R3,#13
   
       DJNZ R3,$
       DJNZ R5,L1
			 RET


       END

⌨️ 快捷键说明

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