加入收藏 | 设为首页 | 会员中心 | 我要投稿 | RSSRSS-巴斯仪表网
您当前的位置:首页 > 电子发烧 > 单片机学习

DS18b20 51汇编源程序

时间:2013-09-08  来源:123485.com  作者:9stone

;**********************************
 FLAG1   BIT    F0        ;DS18B20存在标志位
 DQ      BIT    P1.7
 TEMPER_L    EQU   29H
 TEMPER_H    EQU   28H
 A_BIT      EQU    35H
 B_BIT      EQU     36H
 ;************程序起始********************
     ORG    0000H
     AJMP   MAIN
     ORG    0100H
;**************主程序开始************
MAIN:
      LCALL    INIT_18B20
      ;LCALL    RE_CONFIG
      LCALL    GET_TEMPER
     AJMP     CHANGE

;**********DS18B20复位程序*****************
INIT_18B20:    SETB   DQ
               NOP
               CLR   DQ
               MOV    R0,#0FBH
         TSR1: DJNZ   R0,TSR1       ;延时
               SETB   DQ
               MOV    R0,#25H
         TSR2: JNB   DQ ,TSR3
               DJNZ   R0,TSR2
         TSR3: SETB   FLAG1       ;置标志位,表明DS18B20存在
               CLR    P2.0        ;二极管指示
               AJMP   TSR5
         TSR4: CLR   FLAG1
               LJMP   TSR7
          TSR5: MOV   R0,#06BH
          TSR6: DJNZ   R0,TSR6
          TSR7:SETB   DQ          ;表明不存在
                RET
;********************设定DS18B20暂存器设定值**************
;RE_CONFIG:
           ;JB   FLAG1,RE_CONFIG1
            ;RET
;RE_CONFIG1: MOV  A,#0CCH       ;放跳过ROM命令
            ;LCALL  WRITE_18B20
            ;MOV   A,#4EH
            ;LCALL  WRITE_18B20  ;写暂存器命令
            ;MOV    A,#00H        ;报警上限中写入00H
            ;LCALL  WRITE_18B20
            ;MOV    A,#00H         ;报警下限中写入00H
           ; LCALL  WRITE_18B20
           ;MOV   A,#1FH           ;选择九位温度分辨率
           ; LCALL  WRITE_18B20
           ; RET
;*****************读转换后的温度值****************
GET_TEMPER:
            SETB   DQ
            LCALL  INIT_18B20
            JB     FLAG1,TSS2
            RET                  ;若不存在则返回
      TSS2: MOV  A,#0CCH        ;跳过ROM
            LCALL  WRITE_18B20
            MOV    A,#44H         ;发出温度转换命令
            LCALL   WRITE_18B20

            LCALL  DISPLAY                       ;延时
            LCALL    INIT_18B20
            MOV  A,#0CCH        ;跳过ROM
            LCALL  WRITE_18B20
            MOV    A,#0BEH         ;发出读温度换命令
            LCALL   WRITE_18B20
            LCALL   READ2_18B20    ;读两个字节的温度
            RET
 ;***************写DS18B20程序************
 WRITE_18B20:
            MOV    R2,#8
            CLR    C
        WR1:
              CLR   DQ

              MOV  R3,#6
              DJNZ  R3,$
              RRC   A
              MOV    DQ,C
              MOV   R3,#23
              DJNZ   R3,$
              SETB    DQ
              NOP
              DJNZ    R2,WR1
              SETB  DQ
              RET

 


 ;***********读18B20程序,读出两个字节的温度*********
 READ2_18B20:
            MOV   R4,#2              ;低位存在29 H,高位存在28H

            MOV   R1,#29H
      RE00: MOV  R2,#8
      RE01: CLR   C
            SETB   C
            NOP
            NOP

            CLR  DQ
            NOP
            NOP
            NOP
            SETB  DQ
            MOV   R3,#7
            DJNZ   R3,$
            MOV    C,DQ
            MOV    R3,#23
             DJNZ   R3,$
            RRC   A
            DJNZ   R2,RE01
            MOV    @R1,A
            DEC    R1
            DJNZ   R4,RE00
            RET
 ;************读出的温度进行数据转换**************

CHANGE:     MOV A,29H
            MOV C,28H.0           ;将28H中的最低位移入C
            RRC A
            MOV C,28H.1
            RRC A
            MOV C,28H.2
            RRC A
            MOV C,28H.3
            RRC A
            MOV 29H,A
            ;setb  p2.0
            LCALL  DISPLAY      ;调用数码管显示子程序

           ; setb P2.0
            LJMP MAIN
 ;*******************DISPLAY******
 DISPLAY:    mov a,29H;将29H中的十六进制数转换成10进制
             mov b,#10 ;10进制/10=10进制
             div ab
             mov b_bit,a ;十位在a
             mov a_bit,b ;个位在b
             mov dptr,#TAB ;指定查表启始地址
             mov r0,#4
             dpl1: mov r1,#250 ;显示1000次
             dplop: mov a,a_bit ;取个位数
             MOVC A,@A+DPTR ;查个位数的7段代码
             mov p0,a ;送出个位的7段代码
             clr p2.5;开个位显示
             acall d1ms ;显示1ms
             setb p2.5
             mov a,b_bit ;取十位数
             MOVC A,@A+DPTR ;查十位数的7段代码
             mov p0,a ;送出十位的7段代码
             clr p2.4;开十位显示
             acall d1ms ;显示1ms
             setb p2.4
             djnz r1,dplop ;100次没完循环
             djnz r0,dpl1 ;4个100次没完循环
             ret

 ;***********************************
             D1MS: MOV R7,#80   ;1MS延时(按12MHZ算)
             DJNZ R7,$
             RET
 ;*************************
 TAB:         DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H


分享到:
来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
栏目导航->单片机学习
  • 电子应用基础
  • 电源技术
  • 无线传输技术
  • 信号处理
  • PCB设计
  • EDA技术
  • 单片机学习
  • 电子工具设备
  • 技术文章
  • 精彩拆解欣赏
  • 推荐资讯
    使用普通运放的仪表放大器
    使用普通运放的仪表放
    3V与5V混合系统中逻辑器接口问题
    3V与5V混合系统中逻辑
    数字PID控制及其改进算法的应用
    数字PID控制及其改进
    恶劣环境下的高性价比AD信号处理数据采集系统
    恶劣环境下的高性价比
    栏目更新
    栏目热门