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

📄 jerry.asm

📁 18B20的单片机程序,AT89C2051单片机4M晶振
💻 ASM
字号:
;====================================================
;晶振为4M,一个指令周期为3μs
;====================================================
ORG 0000H
JMP START

;============================================
;定义管脚
;============================================
COMM DATA 30H
TEMPER_L EQU 27H;用于保存读出温度的低8位 
TEMPER_H EQU 26H;用于保存读出温度的高8位 
TEMPER_NUM EQU 28H
FIRST EQU 29H   ;百位数的BCD码
SECOND EQU 2AH  ;十位数的BCD码
THIRD EQU 2BH	;个位数的BCD码
FLAG1 EQU 38H;是否检测到DS18B20标志位 
IN EQU P1.3
POWER EQU P1.2
;===========================================
;主程序开始
;===========================================
START:
  CLR P1.0
  CLR P1.1  ;P1.0和P1.1在不使用上拉电阻的情况下要设置为0,或者使用上拉电阻的情况下置1
WAIT:
  LCALL INIT_1820
  CALL RE_CONFIG  ;调用18B20配置子程序
  LCALL GET_TEMPER;调用读温度子程序 
  MOV A,#0F0H
  ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
  SWAP A
  MOV TEMPER_NUM,A
  MOV A,#0FH
  ANL A,TEMPER_H
  SWAP A
  ORL A,TEMPER_NUM
  MOV TEMPER_NUM,A
  MOV A,TEMPER_NUM
  MOV R0,#30H
  LCALL TEMP_COV
;==================================================================================
 DISP:     
 	MOV R0,#2BH
	MOV R3,#3
	MOV DPTR,#DUANMA
  LLP:     
  	   MOV    A ,  @R0
	   MOVC A,@A+DPTR
           MOV    R2 , #8
           CLR    C
  LP0:     RLC    A
  	   NOP
           MOV    P1.4 , C
           NOP
           NOP
           CPL    P1.6
           NOP
           NOP
           CPL    P1.6
           NOP
           NOP
           DJNZ   R2 , LP0
           DEC    R0
	   DJNZ R3,LLP
           RET

;==================================================================================
  SJMP WAIT
;=============================================
;主程序结束
;=============================================
;=============================================
;输入格式为TEMPER_NUM ,输入为FIRST,SECOND 
;如TEMPER_NUM=55H,输入FIRST=00H,SECOND=85H
;===========================================
TEMP_COV:
       MOV A, TEMPER_NUM
       MOV B,#64H
       DIV AB
       MOV FIRST,A
       MOV A,B
       MOV B,#0AH
       DIV AB
       MOV SECOND,A
       MOV A,B
       MOV THIRD,A
       ;SWAP A
       ;ORL A,B
       ;MOV SECOND, A
       RET

;==========================================================================================
;主机控制DS18B20完成温度转换必须经过三个步骤:初始化、ROM操作指令、存储器操作指令。
;必须先启动DS18B20开始转换,再读出温度转换值。
;外接供电电源,可写出完成一次转换并读取温度值子程序GETWD。
;===========================================================================================
GET_TEMPER: 
    SETB IN 
    LCALL INIT_1820;先复位DS18B20 
    JB FLAG1,TSS2 
    CLR P1.6 ;复位成功18B20存在
    RET ; 判断DS1820是否存在?若DS18B20不存在则返回 
TSS2: 
   CLR P1.5;DS18B20已经被检测到!
   MOV A,#0CCH ; 跳过ROM匹配 
   LCALL WRITE_1820 
   MOV A,#44H ; 发出温度转换命令 
   LCALL WRITE_1820 
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750MS
   MOV R2,#70
CON:   
   MOV R7,#250
   call delay
   DJNZ R2,CON
   LCALL INIT_1820;准备读温度前先复位 
   MOV A,#0CCH ; 跳过ROM匹配 
   LCALL WRITE_1820 
   MOV A,#0BEH ; 发出读温度命令 
   LCALL WRITE_1820 
   LCALL READ_18200; 将读出的温度数据保存到29H/28H  
   CLR P1.3;温度成功读出
   RET 
;=====================================================
;配置18B20温度传感器设置
;=====================================================
RE_CONFIG:
   JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
   RET
RE_CONFIG1:
   MOV A,#0CCH ; 发SKIP ROM命令
   LCALL WRITE_1820
   MOV A,#4EH ; 发写暂存存储器命令
   LCALL WRITE_1820
   MOV A,#00H ; TH(报警上限)中写入00H
   LCALL WRITE_1820
   MOV A,#00H ; TL(报警下限)中写入00H
   LCALL WRITE_1820
   MOV A,#1FH ; 选择9位温度分辨率 
   LCALL WRITE_1820
   RET
;===================================================
;延时子程序,R7传递延时参数,延时为R7*45us
;===================================================
delay: mov r6,#06h               
d1:    djnz r6,d1    ;延时=r7*45us(15个机器周期) ;;;;
       djnz r7,delay            
       ret 
;==================================================
; 这是DS18B20复位初始化子程序 
;==================================================
INIT_1820: 
  SETB IN 
  NOP 
  CLR IN 
   ;主机发出延时537微秒的复位低脉冲 
  MOV R7,#12
  CALL delay
  SETB IN;然后拉高数据线 
  NOP  
  MOV R0,#24
TSR2: 
  JNB IN,TSR3;等待DS18B20回应 
  DJNZ R0,TSR2 
  LJMP TSR4 ; 延时 
TSR3: 
  SETB FLAG1 ; 置标志位,表示DS1820存在 
  LJMP TSR5 
TSR4: 
  CLR FLAG1 ; 清标志位,表示DS1820不存在 
  CLR P1.1 
  LJMP TSR7 
TSR5: 
  MOV R0,#73 
TSR6: 
  DJNZ R0,TSR6 ; 时序要求延时一段时间 
TSR7: 
  SETB IN 
  RET 
;====================================================
;写命令或数据程序
;写DS18B20的子程序(有具体的时序要求) 
;====================================================
WRITE_1820: 
   MOV R2,#8;一共8位数据 
   CLR C 
WR1: 
   CLR IN 
   RRC A 
   MOV IN,C 
   MOV R3,#8
   NOP
   DJNZ R3,$ 
   SETB IN 
   NOP 
   DJNZ R2,WR1 
   SETB IN 
   RET
;======================================================
;读数据子程序——————————————————————————
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据  
;=======================================================
READ_18200: 
  MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 
  MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) 
RE00: 
  MOV R2,#8;数据一共有8位 
RE01: 
  CLR C 
  SETB IN 
  NOP  
  CLR IN 
  NOP 
  SETB IN  
  NOP
  MOV C,IN  
  NOP
  MOV R3,#10
RE20:  
  DJNZ R3,RE20  
  RRC A 
  DJNZ R2,RE01 
  MOV @R1,A 
  DEC R1 
  DJNZ R4,RE00 
  RET

DUANMA:     DB     3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH     ;LED段码

END



  


⌨️ 快捷键说明

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