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

📄 ds18b20asm.txt

📁 如何使用DS18B20
💻 TXT
📖 第 1 页 / 共 2 页
字号:
***************WAVE-E6000/T**********************
;*MCU:          AT89C51                          *
;*MCU-crystal:  12M                              *
;*Version:      01                               *
;*Last Updata:  2005-9-27                        *
;*Author:       liaoguidong                      *
;*Description:                                   *
;DS18B20的读写程序,数据脚P2.2                    *
;温度传感器18B20汇编程序,采用器件默认的12位转化  *
;最大转化时间750微秒,显示温度-55到+125度,显示精度*
;为0.1度,显示采用4位LED共阳显示测温值           *
;*************************************************
;单片机内存分配申明!
;*************************************************
TEMPER_L  EQU   40H     ;用于保存读出温度的低8位
TEMPER_H  EQU   41H     ;用于保存读出温度的高8位
FLAG1     EQU   38H     ;是否检测到DS18B20标志位
SEC       EQU   20H     ;数码管个位数存放内存位置
MIN       EQU   21H     ;数码管十位数存放内存位置
TEMPL     EQU   30H     ;用于保存读出温度的低8位
TEMPH     EQU   31H     ;用于保存读出温度的高8位
TEMPHC    EQU   32H     ;温度转换寄存器低8位
TEMPLC    EQU   33H     ;温度转换寄存器高8位
BUF1      EQU   34H     ;显示缓冲寄存器小数位
BUF2      EQU   35H     ;显示缓冲寄存器个数位
BUF3      EQU   36H     ;显示缓冲寄存器十数位
BUF4      EQU   37H     ;显示缓冲寄存器百数位
TEMPDIN   BIT   P2.2    ;数据脚定义
;**********************************************
         ORG     0000H             ;主程序入口地址
         AJMP    MAIN              ;转主程序
         ORG     0003H             ;外中断0中断入口
         DB      00H,00H,00H,00H,00H,00H,00H;
         RETI                      ;跳至INTEX0执行中断服务程序
         ORG     000BH             ;定时器T0中断入口地址
         DB      00H,00H,00H,00H,00H,00H,00H ;
         RETI                      ;跳至定时器T0执行中断服务程序
         ORG     0013H             ;外中断1中断入口
         DB      00H,00H,00H,00H,00H,00H,00H ;
         RETI                      ;跳至INTEX1执行中断服务程序
         ORG     001BH             ;定时器T1中断入口地址
         DB      00H,00H,00H,00H,00H,00H,00H ;
         RETI                      ;中断返回(不开中断)
         ORG     0023H             ;串行口中断入口地址
         DB      00H,00H,00H,00H,00H,00H,00H ;
         RETI                      ;中断返回(不开中断)
;**********************************************
;两位数码管来显示温度,显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;无需乘于0.0625系数
;**********************************************
MAIN:
          MOV    SP,  #50H         ;
          MOV    P2,  #0FFH        ;

LPTEMP:
          LCALL   GET_TEMPER       ;调用读温度子程序
          LCALL   CONVTEMP         ;温度BCD码计算处理子程序
          LCALL   DISPBCD          ;显示区BCD码温度值刷新子程序
;*************************************
          LCALL   DISPLAY          ;调用数码管显示子程序
;*************************************
          CPL     P3.0             ;
          AJMP    LPTEMP           ;
;*************************************
; 这是DS18B20复位初始化子程序
;*************************************
INIT_1820:
           SETB    TEMPDIN
           NOP
           CLR     TEMPDIN        ;主机发出延时537微秒的复位低脉冲
           MOV     R1,#3
TSR1:      MOV     R0,#107
           DJNZ    R0,$
           DJNZ    R1,TSR1
           SETB    TEMPDIN        ;然后拉高数据线
           NOP
           NOP
           NOP
           MOV     R0,#25H
TSR2:
           JNB     TEMPDIN,TSR3   ;等待DS18B20回应
           DJNZ    R0,TSR2
           LJMP    TSR4           ;延时
TSR3:
           SETB    FLAG1          ;置标志位,表示DS1820存在
           CLR     P3.7           ;检查到DS18B20就点亮P3.7LED
           LJMP    TSR5
TSR4:
           CLR     FLAG1          ;清标志位,表示DS1820不存在
           CLR     P3.1
           LJMP    TSR7
TSR5:      MOV     R0,#117
TSR6:      DJNZ    R0,TSR6        ;时序要求延时一段时间
TSR7:      SETB    TEMPDIN        ;
           RET
;****************************************
; 读出转换后的温度值
;****************************************
GET_TEMPER:
           SETB    TEMPDIN        ;
           LCALL   INIT_1820      ;先复位DS18B20
           JB      FLAG1,TSS2
           RET                    ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
           CLR     P3.3           ;DS18B20已经被检测到!!
           MOV     A,#0CCH        ;跳过ROM匹配
           LCALL   WRITE_1820
           MOV     A,#44H         ;发出温度转换命令
           LCALL   WRITE_1820
;*****************************************
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
;*****************************************
           LCALL   DISPLAY
;*****************************************
           LCALL   INIT_1820      ;准备读温度前先复位

           MOV     A,#0CCH        ;跳过ROM匹配
           LCALL   WRITE_1820

           MOV     A,#0BEH        ;发出读温度命令
           LCALL   WRITE_1820

           LCALL   READ_18200     ;将读出的温度数据保存到35H/36H
           RET
;*******************************************
;写DS18B20的子程序(有具体的时序要求)
;*******************************************
WRITE_1820:
           MOV     R2,#8          ;一共8位数据
           CLR     C              ;
WR1:
           CLR     TEMPDIN        ;
           MOV     R3,#6
           DJNZ    R3,$
           RRC     A
           MOV     TEMPDIN,C      ;
           MOV     R3,#23
           DJNZ    R3,$
           SETB    TEMPDIN        ;
           NOP
           DJNZ    R2,WR1         ;
           SETB    TEMPDIN        ;
           RET
;*************************************
;处理温度BCD码子程序
;*************************************
CONVTEMP: MOV     A,TEMPH          ;
          ANL     A,#80H           ;
          JZ      TEMPC1           ; 判断温度是否在零下?
          
          CLR     C                ; 温度值补码 变成原码
          MOV     A,TEMPL          ;
          CPL     A
          ADD     A,#01H           ;
          MOV     TEMPL,A          ;
          MOV     A, TEMPH         ; -
          CPL     A                ;
          ADDC    A,#00H           ;
          MOV     TEMPH,A          ; TEMPHC  HI=符号位
          MOV     TEMPHC,#0BH      ; 置"-"标志
          SJMP    TEMPC11          ;
TEMPC1:   MOV     TEMPHC,#0AH      ; 置"+"标志
;**************************************
TEMPC11:  MOV     A,TEMPHC         ; 计算小数位温度BCD值
          SWAP    A
          MOV     TEMPHC,A         ;
          MOV     A,TEMPL          ;
          ANL     A,#0FH           ; 乘0.0625
          MOV     DPTR,#TEMPDOTTAB ;
          MOVC    A,@A+DPTR        ;
          MOV     TEMPLC,A         ; TEMPLC LOW= 小数部分 BCD
;**************************************
          MOV     A,TEMPL          ; 计算整数位温度BCD值
          ANL     A,#0F0H          ;
          SWAP    A                ;
          MOV     TEMPL,A          ;
          MOV     A,TEMPH          ;
          ANL     A,#0FH           ;
          SWAP    A                ;
          ORL     A,TEMPL          ;
          MOV     TEMPER_L ,A      ;
          LCALL   HEX2BCD1         ; 调用单字节十六进制转BCD子程序
;************************************          

⌨️ 快捷键说明

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