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

📄 18b20.asm

📁 51但单片机实现对18B20的控制功能,此程序仅共参考,不一定准确
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:    DS18b20的显示实验
;使用环境:板上18b20接口,上拉电阻存在,只需把18B20的三根线接到相应位置即可,晶振为11.0592MHz
;使用资源:使用P2.7采集温度,4位数码管使用P0口,p2.0,p2.1,p2.2,p2.3控制显示,采用描绘显示方法
;          测试18B20存在P1.7口L8灯亮,不存在P1.0口L1灯亮
;声  明:  此程序仅共参考,不一定准确,就算给大家一个"例程"吧,如果大家有不同意见,希望多多指正!
;提供者:  单片机试验网
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;////////////数据定义///////////////////////////
TH    EQU    38  ;高温报警点
TL    EQU    10  ;低温报警点
TEMPH EQU    40H ;读出寄存器5个单元的内容
TEMPL EQU    41H
REG2  EQU    42H
REG3  EQU    43H
REG4  EQU    44H
CONFIG9  EQU 1FH  ;9位精度的CONFIG数据
COMFIG10 EQU 3FH  ;10位精度的CONFIG数据
CONFIG11 EQU 5FH  ;11位精度的CONFIG数据
CONFIG12 EQU 7FH  ;12位精度的CONFIG数据
CNT    EQU    20H ;中断转换时间
DAT    EQU    P2.7;数据线
FLAG1  BIT 00H     ;测试DS18B20的存在

RS BIT p2.0;液晶控制接口
RW BIT p2.1
E BIT p2.2
;/////////////程序开始///////////////////////////
	ORG   0000H
	LJMP  MAIN
	ORG   000BH
	LJMP  TIM0  ;定时器0中断
	ORG   0030H
MAIN: 
      MOV SP,#07H    ;设定堆栈指针 
    
      LCALL RESET    ;18b20复位
      LCALL INIT     ;初始化数码管
          
      MOV TMOD,#21H  ;定时器0设置
      MOV TH0,#00H
      MOV TL0,#00H
      
      SETB ET0
      SETB TR0
		
		CALL INITDISP
		SETB EA
      ;CALL LCDDISP
STAR: ;LCALL DISP     ;显示温度值
      ;lcall lcddisp
      LJMP STAR

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:;18B20复位程序,11.0592Mz单周期1US
	SETB DAT
	NOP
	CLR DAT
	;主机发出延时537微秒的复位低脉冲
	MOV R1,#3
TSR1:   MOV R0,#107
	DJNZ R0,$
	DJNZ R1,TSR1	
	MOV R0,#0FFH
	SETB DAT   ;然后拉高数据线
TSR2:   JNB DAT,TSR3;等待DS18B20回应
	DJNZ R0,TSR2
	LJMP TSR4  ; 延时
TSR3:	SETB FLAG1 ; 置标志位,表示DS1820存在
	CLR P1.7   ;检查到DS18B20就点亮P1.7LED
	LJMP TSR5
TSR4:	CLR FLAG1  ; 清标志位,表示DS1820不存在
	CLR P1.0
	LJMP TSR7
TSR5:	MOV R0,#117
TSR6:	DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:	SETB DAT
	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
      ;-------------------写DS18B20的程序
WRITE: ;18B20写入1个字节子程序
	MOV R2,#8
	CLR C
  WR1:	CLR DAT
	MOV R3,#6
	DJNZ R3,$
	RRC A
	MOV DAT,C
	MOV R3,#23
	DJNZ R3,$
	SETB DAT
	NOP
	DJNZ R2,WR1
	SETB DAT
	RET
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	;-------------------读DS18B20的程序,从DS18B20中读出两个字节的温度数据
;读出温度值的子程序RDTEMP
RDTEMP:
	MOV R4,#2     ; 将温度高位和低位从DS18B20中读出
	MOV R1,#TEMPL ; 低位存入41H(TEMPL),高位存入40H(TEMPH)
	
  RE00:	MOV R2,#8
  RE01:	CLR C
	SETB DAT
	NOP
	NOP
	CLR DAT
	NOP
	NOP
	NOP
	SETB DAT
	MOV R3,#7
	DJNZ R3,$
	MOV C,DAT
	MOV R3,#23
	DJNZ R3,$
	RRC A
	DJNZ R2,RE01
	MOV @R1,A
	DEC R1
	DJNZ R4,RE00
	RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVV:;数据处理子程序DIVV
        MOV  A,41H
	MOV B,#16
	DIV AB
	MOV 74H,A       ;将41H的高4位右移4位,存入74H中
	MOV A,B
	MOV B,#10
	MUL AB
	MOV B,#16
	DIV AB
	MOV 73H,A;70    ;将41H的低4位X10/16得小数后1位数
	MOV A,40H
	MOV B,#16
	MUL AB
	ADD A,74H
	MOV B,#10
	DIV AB
	MOV 72H,B;71    ;将个位数存入72H中
	MOV B,#10
	DIV AB
	MOV 71H,B;72    ;将十位数存入71H中
	MOV A,40H
	MOV 70H,#10H;73  ;如果为负则符号位为#10H
	JB ACC.7,SA
	MOV 70H,#00H     ;如果为正则符号位为#00H
 SA:	
        RET
 ;------------------读出转换后的温度值
GET_TEMPER:
	SETB DAT ; 定时入口
  BCD:  LCALL RESET
	JB FLAG1,S22
        LJMP BCD ; 若DS18B20不存在则返回

  S22:  LCALL DELAY1
	MOV A,#0CCH ; 跳过ROM匹配------0CC
	LCALL WRITE
	MOV A,#44H ; 发出温度转换命令
	LCALL WRITE
	NOP
	LCALL DELAY
	LCALL DELAY
  CBA:  CALL RESET
	JB FLAG1,ABC
	LJMP CBA
  ABC:  LCALL DELAY1
	MOV A,#0CCH ; 跳过ROM匹配
	LCALL WRITE
	MOV A,#0BEH ; 发出读温度命令
	LCALL WRITE
	LCALL RDTEMP ;READ_1820
	RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------延时子程序
DELAY:  MOV R7,#00H
  MIN:  DJNZ R7,YS500
    RET
 YS500: LCALL YS500US
	LJMP MIN
YS500US:MOV R6,#00H
	DJNZ R6,$
	RET
DELAY1: MOV R7,#20H
	DJNZ R7,$
	RET


;*************************************************
;液晶显示程序
;*************************************************
INITDISP:
  MOV   R2,#38H    ;0011 1000功能设置:采用8位数据总线,采用双行显示,采用5X7点陈
         LCALL  WRC       ;写入指令
         ACALL DELAY11      ;延时程序
	 MOV   R2,#0CH    ;0000 1100光标/显示移位:1为显示移位,0为光标移位
	 ACALL  WRC
         ACALL DELAY11
	 MOV   R2,#06H    ;0000 0110输入模式:1为AC增量模式,0为AC自减模式,显示整体不移动
	 ACALL  WRC
         ACALL DELAY11
	 MOV   R2,#01H    ;清屏
	 LCALL  WRC
         ACALL DELAY11

			mov P0,#01h;清屏
call enrw
mov P0,#38h;设为8位,5*7字 型两行
call enrw
mov P0,#0Ch
call enrw
mov P0,#06h
call enrw
mov P0,#80h
call enrw
mov dptr,#yjtab
call rwram
mov P0,#0C0h
call enrw
mov dptr,#yjtab1
call rwram
RET
	 RET

	  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;写入控制指令,数据放在R2中
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRC:     
         ACALL BUSY
	 CLR    P2.0
	 CLR    P2.1
	 CLR    P2.2
	 MOV   A,R2
	 MOV   P0,A
         NOP
         SETB P2.2;E使用信号
         NOP
	 CLR  P2.2;E使用能下降沿触发
	 RET
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;忙闲测试
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
BUSY:    
         CLR    P2.0;RS=0读寄存器 读BF
	 SETB   P2.1; R/W 1为读,0为写
	 NOP
         SETB   P2.2;E
         NOP
       	 MOV    A,P0;读取P0口
	 JB     ACC.7,BUSY
	 CLR    P2.2
	 RET
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;写入数据
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRD:     
         ACALL  BUSY
         SETB   P2.0
	 CLR    P2.1
         CLR    P2.2
         MOV    A,R2
	 MOV    P0,A
         NOP
         SETB   P2.2
         NOP
         CLR    P2.2
	 RET
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;写入N个数据,R2为要显示的数据,R4为显示个数
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRN:     
         CLR   A
	 MOVC  A,@A+DPTR
	 INC   DPTR
	 MOV   R2,A
	 LCALL WRD
	 DJNZ  R4,WRN
	 RET
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	 ;程序延时
	 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY11:   MOV R6,#01H
  DL0:   MOV R7,#250
  DL1:   NOP
         NOP
	 DJNZ R7,DL1
         DJNZ R6,DL0
         RET
/*

*/
LCDDISP:

         MOV   DPTR,#ASCII ;显示第二行数据
         MOV   R2,#0CCH    ;1100 0000 DDRAM地址设置为40h
         LCALL WRC

         ;MOV   R4,#16
         ;LCALL WRN

	 CLR   A
	 MOV A,71H
	 MOVC  A,@A+DPTR
	 ;INC   DPTR
	 MOV   R2,A
	 LCALL WRD

	  MOV A,72H
	 MOVC  A,@A+DPTR
	 ;INC   DPTR
	 MOV   R2,A
	 LCALL WRD

			RET
/******************/
MOV R1,#71

mov P0,#0CCh
call enrw
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e

INC R1
MOV DPTR,#ASCII
MOV A,@R1
MOVC A,@A+DPTR
MOV P0,A
setb rs
clr rw
clr e
call delay
setb e 
RET
enrw:clr rs
clr rw
clr e
call delay
setb e
ret
rwram:mov r1,#00h
a1: mov a,r1
movc a,@a+dptr
call rwram2
inc r1
cjne a,#00h,a1
ret
rwram2:mov P0,a
setb rs
clr rw
clr e
call delay
setb e
ret

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
/*DISP: ;数码管显示程序,此程序要注意的是P2.7口的DS18B20数据采集,不能影响此口
      MOV R1,#70H
DISP1: 
      CLR  P2.0;第一个数码管亮
      SETB P2.1
      SETB P2.2
      SETB P2.3
      MOV A,@R1
      MOV DPTR,#TAB
      MOVC A,@A+DPTR
      MOV P0,A
      LCALL DLYS
      INC R1;
      SETB  P2.0;第二个数码管亮
      CLR P2.1
      SETB P2.2
      SETB P2.3
      MOV A,@R1
      MOV DPTR,#TAB
      MOVC A,@A+DPTR
      MOV P0,A
      LCALL DLYS
      INC R1;
      SETB  P2.0;第三个数码管亮
      SETB P2.1
      CLR P2.2
      SETB P2.3
      MOV A,@R1
      MOV DPTR,#TAB
      MOVC A,@A+DPTR
      ADD A,#80H;点亮小数点
      MOV P0,A
      LCALL DLYS
      INC R1;
      SETB  P2.0;第四个数码管亮
      SETB P2.1
      SETB P2.2
      CLR P2.3
      MOV A,@R1
      MOV DPTR,#TAB
      MOVC A,@A+DPTR
      MOV P0,A
      LCALL DLYS
      RET*/
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
	JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
	RET
RE_CONFIG1:
	MOV A,#0CCH         ; 发SKIP ROM命令
	LCALL WRITE
	MOV A,#4EH          ; 发写暂存存储器命令
	LCALL WRITE
	MOV A,#00H          ; TH(报警上限)中写入00H
	LCALL WRITE
	MOV A,#00H          ; TL(报警下限)中写入00H
	LCALL WRITE
	MOV A,#7FH          ; 选择12位温度分辨率
	LCALL WRITE
	RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TIM0:                ;中断处理程序
      CLR TR0
      CLR EA
      MOV A,CNT
      INC A
      MOV CNT,A
      CJNE A,#10,TZ  ;刷新时间到一定的时间,就采集温度,注意采集时间不能太快,太快就能时实显示
      MOV CNT,#00H
      LCALL GET_TEMPER
      LCALL DIVV

		LCALL LCDDISP
      
  TZ: MOV TH0,#00H   ;设定定时器0的参数
      MOV TL0,#00H
      SETB EA
      SETB TR0
      RETI

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的数据,使用R0,R1,R3
    
      MOV 70H,#00H      ;初始化数码管的显示内容
      MOV 71H,#00H
      MOV 72H,#00H
      MOV 73H,#00H
      MOV CNT,#00H      ;刷新时间初始化

      LCALL RE_CONFIG   ;配置DS18B20程序
      LCALL GET_TEMPER  ;获得温度值
      LCALL DIVV        ;温度值进行转换
      RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DLYS: MOV R6,#1  ;延时处理程序
DLYS0:MOV R5,#60
      DJNZ R5,$
      DJNZ R6,DLYS0
      RET
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     
TAB:  
      DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3
      DB 99H,92H,82H,0F8H;

⌨️ 快捷键说明

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