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

📄 success1.asm

📁 ds18b20传感器使用
💻 ASM
字号:
;--------------------------------------------
;变量定义
;--------------------------------------------
DQ BIT P2.4
MSB EQU 30H
LSB EQU 31H
INTEG EQU 32H
DECIM EQU 33H
SEG_S EQU 34H
SEG_I2 EQU 35H
SEG_I1 EQU 36H
SEG_D1 EQU 37H
XIAO EQU 38H
GEW EQU 39H
SHI EQU 40H
FLAG1 BIT 00H
SIGN BIT 01H
;--------------------------------------------
;主程序
;--------------------------------------------
     ORG 0000H
     LJMP START
START:
;设置堆栈初始地址
     MOV    SP,#80H
;关总中断
     CLR    EA
;T1设置(波特率)
     MOV    TMOD,#20H           ;T1工作于方式2,定时功能
     MOV    TH1,    #0FDH
     MOV    TL1,    #0FDH                   ;波特率为9600
     SETB   TR1                             ;开启T1
;串口设置
     MOV    PCON,   #00H                    ;SOMD=0
     MOV    SCON,   #50H;串口工作方式1(10位UART,波特率可变),REN=0 禁止接收
;关串口中断
     CLR    ES
;开总中断
     SETB EA 		; 总中断开放

     MOV 30H,#00H
     MOV 31H,#00H
     MOV 32H,#00H
     MOV 33H,#00H
     MOV 34H,#00H
     MOV 35H,#00H
     MOV 36H,#00H
     MOV 37H,#00H
     MOV 38H,#00H
     MOV 39H,#00H
     MOV 40H,#00H
BAI_LOOP:
     CLR FLAG1
     CLR SIGN
     LCALL INIT_1820  ;初始化1820
     LCALL GET_TEMPER ;读取转换数据
     LCALL DATA_PROC  ;数据处理
     LCALL SEG_GEN    ;生成显示码
     LCALL DISPLAY    ;数码显示
     LCALL SEND       ;发送
     LCALL DELAY      ;延时
     SJMP BAI_LOOP
;-------------------------------------------------------------
;子程序 N.
;这是DS18B20复位初始化子程序
;-------------------------------------------------------------
INIT_1820:
   CLR EA
   SETB DQ
   NOP
L0:CLR DQ
   MOV R1,#3 ;主机发出延时707.5US的复位低脉冲
TSR1:
   MOV R0,#107
   DJNZ R0,$
   DJNZ R1,TSR1
   SETB DQ
   MOV R2,#27
   DJNZ R2,$
   CLR C
   ORL C,DQ
   JC L0
   MOV R6,#120
L1:ORL C,DQ
   JC L3
   DJNZ R6,L1
   SJMP L0
L3:MOV R2,#221
L2:DJNZ R2,L2
   SETB FLAG1
   RET
;-------------------------------------------------------------
;子程序 N.
;读出转换后的温度
;-------------------------------------------------------------
GET_TEMPER:
   CLR EA            ;使用传感器时禁止中断产生
   SETB DQ         ;拉高数据线
   LCALL INIT_1820   ;先复位DS18B20
   JB FLAG1,TSS2     ;如果检测到DS18B20,则跳转到TSS2
   CLR DQ
   RET               ;判断DS1820是否存在?若不存在则返回
TSS2:
   MOV A,#0CCH       ;跳过ROM匹配
   LCALL WRITE_1820  ;调用写DS18B20指令,将累加器中的指令写进DS18B20中
   MOV A,#44H        ;发出温度转换指令
   LCALL WRITE_1820  ;调用写DS18B20指令,将累加器中的命令写进DS18B20中
;等待A/D转换结束,12位的话750微秒
   LCALL DELAY
   LCALL INIT_1820   ;准备读温度前先复位
   MOV A,#0CCH       ;跳过ROM匹配
   LCALL WRITE_1820
   MOV A,#0BEH       ;发出读温度命令
   LCALL WRITE_1820
   LCALL READ_18200  ;将读出的温度数据保存到LSB,MSB
   SETB EA
   RET
;--------------------------------------------------------------
;子程序 N.
;写DS18B20的子程序(有具体的时序要求)
;--------------------------------------------------------------
WRITE_1820:
   CLR EA
   MOV R2,#8         ;一共8位数据
   CLR C             ;清除进位标志位
WR1:
   CLR DQ
   NOP
   NOP
   NOP
   NOP
   NOP
   RRC A             ;将累加器中的数据带进位右移
   MOV DQ,C        ;将进位位写进DS18B20后,等待
   MOV R3,#26
   DJNZ R3,$         ;完成1bit的写操作
   SETB DQ         ;拉高数据线,初始化写
   NOP
   DJNZ R2,WR1       ;如果一个字节没写完,继续写
   SETB DQ         ;拉高数据线
   SETB EA
   RET
;-----------------------------------------------------------------
;子程序 N.
;读DS18B20的子程序(有具体的时序要求)
;-----------------------------------------------------------------
READ_18200:
;读DS18B20的程序,从DS18B20中读出两个字节的温度数据
   CLR EA
   MOV R4,#2          ;将温度高位和低位从DS18B20中读出
   MOV R1,#31H        ;低位存入LSB,高位存入MSB
RE00:
   MOV R2,#8          ;数据一共有8位
RE01:
   CLR C              ;清除进位标志位
   SETB DQ          ;拉高数据线后,等待1微秒初始化读
   NOP
   NOP
   NOP
   CLR DQ           ;拉低数据线后,保持1微秒以上使读初始化有效
   NOP
   NOP
   NOP
   SETB DQ          ;拉高数据线后,开始读操作
   NOP
   NOP
   MOV C,DQ         ;将数据读入累加器
   MOV R3,#28
RE20:
   DJNZ R3,RE20       ;等待60微秒以上后,进行下一次读操作
   RRC A              ;将累加器带进位右移
   DJNZ R2,RE01       ;如果没读满一个字节,继续读取数据
   MOV @R1,A          ;将累加器中的数据存储进地址29H
   DEC R1
   DJNZ R4,RE00       ;继续读取高位
   SETB EA
   RET
;---------------------------------------------
;子程序 N.
;数据处理子程序,判断正负,并且分离转换值的整数和小数部分
;符号位为SIGN,0为正,1为负
;整数部分存放在INTEG中,小数部分存放在DECIM中(与时序没有关系)
;----------------------------------------------
DATA_PROC:
    CLR C
    CLR SIGN
    MOV A,MSB
    RLC A
    JC NEG             ;判断符号
    LJMP PROCE
NEG:CLR C              ;负数取补码
    SETB SIGN
    MOV A,LSB
    CPL A
    ADD A,#1
    MOV LSB,A
    MOV A,MSB
    CPL A
    ADDC A,#0
    MOV MSB,A
PROCE:                  ;分离小数与整数并存储于INTEG和DECIM
    MOV A,LSB
    ANL A,#0FH
    MOV DECIM,A
    MOV A,MSB
    SWAP A
    ANL A,#0F0H
    MOV INTEG,A
    MOV A,LSB
    SWAP A
    ANL A,#0FH
    MOV R0,INTEG
    ORL A,R0
    SUBB A,#10
    MOV INTEG,A

    RET
;----------------------------------------------
;子程序 N.
;生成显示码子程序
;将四个段码分别存于SEG_S SEG_I2 SEG_I1 SEG_D1
;----------------------------------------------
SEG_GEN:
    MOV DPTR,#TABLE
    JB SIGN,S_NEG
    MOV SEG_S,#00H
    SJMP S_INT
S_NEG:
    MOV SEG_S,#40H     ;确定了符号段码
S_INT:
    MOV A,INTEG
    MOV B,#10
    DIV AB
    MOV SHI,A
    MOV GEW,B
    MOVC A,@A+DPTR
    MOV SEG_I2,A       ;确定了十位段码
    MOV A,B
    MOVC A,@A+DPTR
    ORL A,#80H
    MOV SEG_I1,A       ;确定了个位段码,并加小数点
    MOV DPTR,#FLOAT_TAB
    MOV A,DECIM
    MOVC A,@A+DPTR
    MOV XIAO,A
    MOV DPTR,#TABLE
    MOVC A,@A+DPTR
    MOV SEG_D1,A        ;确定了小数段码
    RET
;-------------------------------------------------
;子程序 N.
;发送子程序
;-------------------------------------------------
SEND:   MOV 20H,#30H
        MOV A,XIAO
        MOV DPTR,#ASCII
        MOVC A,@A+DPTR
        MOV 21H,A

        MOV A,GEW
        MOV DPTR,#ASCII
        MOVC A,@A+DPTR
        MOV 22H,A

        MOV A,SHI
        MOV DPTR,#ASCII
        MOVC A,@A+DPTR
        MOV 23H,A

        MOV A,20H
        MOV SBUF, A
        JNB TI,$
        CLR TI

        MOV A,21H
        MOV SBUF, A
        JNB TI,$
        CLR TI

        MOV A,22H
        MOV SBUF, A
        JNB TI,$
        CLR TI

        MOV A,23H
        MOV SBUF, A
        JNB TI,$
        CLR TI

        RET
;-------------------------------------------------
;子程序 N.
;显示子程序,用四位数码管显示
;-------------------------------------------------
DISPLAY:
    MOV P0,#0FFH
    CLR P0.0
    MOV P1,SEG_S
    LCALL DELAY
    SETB P0.0
    CLR P0.1
    MOV P1,SEG_I2
    LCALL DELAY
    SETB P0.1
    CLR P0.2
    MOV P1,SEG_I1
    LCALL DELAY
    SETB P0.2
    CLR P0.3
    MOV P1,SEG_D1
    LCALL DELAY
    SETB P0.3
    RET
;--------------------------------------------------------------
;子程序 N.
;1ms延时子程序
;--------------------------------------------------------------
D1MS:
   MOV R5,#2
D1:MOV R6,#229
   DJNZ R6,$
   DJNZ R5,D1
   RET
;--------------------------------------------------------------
;子程序 N.
;5.4ms延时子程序
;--------------------------------------------------------------
DELAY:
   MOV R5,#10
D2:MOV R6,#248
   DJNZ R6,$
   DJNZ R5,D2
   RET
TABLE: DB 03FH,06H,5BH,4FH,66H,06DH,07DH,07H,07FH,06FH
FLOAT_TAB: DB 00,01,01,02,03,03,04,04,05,06,06,07,08,08
          DB 09,09
ASCII: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
END



⌨️ 快捷键说明

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