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

📄 wengdu2.asm

📁 自己用的 DS18B20代码
💻 ASM
字号:
;这是关于单个DS18B20的测温程序,数据脚为P1.5,晶振是11.059MHZ
;温度传感器18B20采用器件默认的12位转化,最大转化时间要750毫秒
;内存分配声明
TEMPER_L  EQU   31H             ;用于保存读出温度的低字节
TEMPER_H  EQU   30H             ;用于保存读出温度的高字节
TEMPER_NUM EQU   32H             ;FORMAT后的整数部分(integer),将两字节的温度整合成1字节
DAT     BIT     P1.5            ;DS18B20数据线

;------------------------------主函数开始-----------------------------
        ORG     0000H
        AJMP    MAIN
        ORG     0030H
MAIN:
        CLR     EA              ;使用DS18B20一定要禁止中断
        MOV     SP,#60H
        MOV     TEMPER_NUM,#30
START:  LCALL   GET_TEMPER      ;调用读温度子程序
        LCALL   T_FORMAT        ;将读出的2字节温度格式化
        LCALL   DISPLAY         ;显示温度
        AJMP    START

;-----------------------DS18B20的温度转换子程序-----------------------
GET_TEMPER:
        LCALL   Set_18B20
        MOV     A,#0CCH         ;跳过ROM匹配
        LCALL   WRITE_1820
        MOV     A,#44H          ;发出温度转换命令
        LCALL   WRITE_1820
        LCALL   DISPLAY         ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms
        LCALL   Set_18B20       ;准备读温度前先初始化
        MOV     A,#0CCH         ;跳过ROM匹配
        LCALL   WRITE_1820
        MOV     A,#0BEH         ;发出读温度命令
        LCALL   WRITE_1820
        LCALL   READ_1820
        RET

;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
        SETB    DAT
        NOP
        CLR     DAT
        MOV     R2,#250         ;主机发出延时500微秒的复位低脉冲
        DJNZ    R2,$
        SETB    DAT             ;然后拉高数据线
        MOV     R2,#30
        DJNZ    R2,$            ;延时60us等待DS18B20回应
        JNB     DAT,INIT1
        JMP     Set_18B20       ;超时而没有响应,重新初始化
INIT1:  MOV     R2,#120
        DJNZ    R2,$            ;延时240us
        JB      DAT,INIT2       ;数据变高,初始化成功
        JMP     Set_18B20
INIT2:  MOV     R2,#240
        DJNZ    R2,$
        RET

;-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_1820:
        MOV     R2,#8           ;一共8位数据
WR0:    CLR     DAT
        MOV     R3,#6
        DJNZ    R3,$
        RRC     A
        MOV     DAT,C
        MOV     R3,#20
        DJNZ    R3,$
        SETB    DAT
        NOP
        NOP
        DJNZ    R2,WR0
        SETB    DAT
        RET

;------读DS18B20的程序,从DS18B20中读出两个字节的温度数据--------------------------
READ_1820:
        MOV     R4,#2           ;将温度高位和低位从DS18B20中读出
        MOV     R1,#TEMPER_L    ;低位存入31H(TEMPER_L)
RE0:    MOV     R2,#8
RE1:    SETB    DAT
        NOP
        NOP
        CLR     DAT
        NOP
        NOP
        SETB    DAT
        MOV     R3,#4
        DJNZ    R3,$
        MOV     C,DAT
        RRC     A
        MOV     R3,#30
        DJNZ    R3,$
        DJNZ    R2,RE1
        MOV     @R1,A
        DEC     R1              ;高位存入30H(TEMPER_H)
        DJNZ    R4,RE0
        RET

;----------整合读出的1字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:
        MOV A,#0F0H
        ANL A,TEMPER_L ; 舍去温度低位中小数点后的四位温度数值
        SWAP A
        MOV TEMPER_NUM,A
        MOV A,TEMPER_L
        JNB ACC.3,TEMPER_COV1 ; 四舍五入去温度值
        INC TEMPER_NUM

TEMPER_COV1:
        MOV A,TEMPER_H
        ANL A,#07H
        SWAP A
        ORL A,TEMPER_NUM
        MOV TEMPER_NUM,A ;
        RET
;---------------------------显示温度子程序----------------------------
DISPLAY:MOV R1,#250
        MOV  DPTR,#TAB
DISP1:MOV A,TEMPER_NUM
      MOV B,#100
      DIV AB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.3
      CALL  D1MS
      SETB P2.3
      MOV A,B
      MOV B,#10
      DIV AB
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.2
      CALL  D1MS
      SETB P2.2
      MOV A,B
      MOVC A,@A+DPTR
      MOV P0,A
      CLR P2.1
      CALL  D1MS
      SETB P2.1
      DJNZ  R1,DISP1
        RET
      

;-------------------------1mS延时(按12MHZ算)--------------------------
D1MS:   MOV     R7,#250
LOOP0:  NOP
        NOP
        DJNZ    R7,LOOP0
        RET

;-------------------------共阴数码管对应字型表-------------------------
TAB:    DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H  ;段码表
        ;   0    1    2     3   4   5   6    7   对应内容
        DB 7FH,6FH,77H,7CH,39H,5EH
        ;   8   9   A    B   C   D

⌨️ 快捷键说明

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