找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4058|回复: 1
打印 上一主题 下一主题
收起左侧

DS18B20三线转两线 很简单的方法 附单片机程序

[复制链接]
跳转到指定楼层
楼主
利用寄生电容的方法不会用 就想到了这个方法  方法很简单  加入二极管和电容就可以(如图)   不开强推电压在2.4V左右 18B20也能工  开强推后电压在3.7V左右  我不知道我用的二芯电线多长  耗电小压降应该没多少
读取温度前把IO设置成普通模式   读取后设置成强推 快速给电容充电     
制作出来的实物图如下:


电路原理图如下:

我用的单片机是STC12C5A60S2 晶振12M   其它单片机未测试  估计也没什么问题                                       
                                                                                
                                                                    P3M1 EQU 0B1H
                                        P3M0 EQU 0B2H  
                                                
                                            DQ      BIT      P3.5;   18b20                                                                                 
                                                                            TEMPL       DATA  26H                    
                                                                                TEMPH       DATA  27H        
                                                                                                                                                                                       
                                                                                TEMPHC      DATA  2AH
                                        TEMPLC      DATA  2BH
                                                                                TEMP_ZH     DATA  2CH

                                                                                FLAG    EQU      6EH                          ;温度标志位
                  
                    MAIN:                  MOV P3M1,#00000000B;                 全普通
                           MOV P3M0,#00000000B;          全普通                                                                                                     
                                                                            LCALL   RE_TEMP   ; 读温度  
                    MOV P3M1,#00000000B;                 P3.5强推 其余普通
          MOV P3M0,#00100000B;                 P3.5强推 其余普通                                                                                             
                                                                                LCALL   CONVER    ; 处理温度  
                                                                                LCALL   DISPBCD    ; BCD 码温度值                                                                                          
                                                                                LCALL   DISPLAY_INT ; 显示温度                                                                                                                                                                LJMP MAIN
;***************************************************************     
;温度读取                                   
;************************************************************  ***                                 
                                        RE_TEMP:                                                            
                                                                                SETB      DQ                                                              
                                                                                ACALL                  INIT_18B20                                                   
                                                                                JB                          FLAG, ST                                                         
                                                                                RET                                                                  
                                        ST:                                                                  
                                                                                MOV                         A, #0CCH                                                        
                                                                                ACALL                  WRITE_18B20                                                   
                                                                                MOV                          A, #44H                                                         
                                                                                ACALL                  WRITE_18B20                                                   
                                                                                ACALL                  INIT_18B20                                                   
                                                                                MOV                          A, #0CCH                                                        
                                                                                ACALL                  WRITE_18B20                                                   
                                                                                MOV                          A, #0BEH                                                        
                                                                                ACALL                 WRITE_18B20                                                   
                                                                                ACALL                 READ_18B20                                                   
                                                                                RET   
;***************************************************************     
;写DS18B20                                   
;***************************************************************                                   
                                        WRITE_18B20:                                                         
                                                                                MOV                   R2, #8                                                         
                                                                                CLR                   C                                                               
                                                   WR1:          CLR                   DQ                                                              
                                                                                  MOV R6,#01H        ;        DELAY2US:   ;误差 0us
                               DL4:            MOV R5,#03H
                                        DJNZ R5,$
                                        DJNZ R6,DL4
                                        RRC                   A                                                               
                                                                                MOV                   DQ, C                                                           
                                                                                 MOV R6,#33H          ;DELAY60US:   ;误差 0us
                               DL5:            MOV R5,#02H
                                        DJNZ R5,$
                                        DJNZ R6,DL5
                                                                            SETB                  DQ                                                            
                                                                                 MOV R6,#01H;        DELAY2US:   ;误差 0us
                               DL6:            MOV R5,#03H
                                        DJNZ R5,$
                                        DJNZ R6,DL6
                                                                             DJNZ                  R2, WR1                                                        
                                                                                SETB                  DQ                                                            
                                                                                RET                                                                                                                                                         
;***************************************************************     
;初始化DS18B20                                
;***************************************************************                                
                                        INIT_18B20:                                                         
                                                                                SETB      DQ                                                            
                                                                                MOV R6,#01H;DELAY2US:   ;误差 0us
                               DL1:            MOV R5,#03H
                                        DJNZ R5,$
                                        DJNZ R6,DL1
                                                                                 CLR                   DQ                                                              
                                                                                 MOV R6,#6FH; DELAY500US:   ;误差 0us
                               DL2:            MOV R5,#0CH
                                        DJNZ R5,$
                                        DJNZ R6,DL2
                                        SETB                  DQ                                                            
                                                                                MOV R6,#33H;DELAY60US:   ;误差 0us
                               DL3:                MOV R5,#02H
                                        DJNZ R5,$
                                        DJNZ R6,DL3
                                                                                 NOP;                                                                                                  
                                                                                MOV                   R0, #25H                                                        
                                        T2:                 JNB       DQ, T3                                                         
                                                                                DJNZ      R0, T2                                                         
                                                                                JMP       T4                                                              
                                    T3:                        SETB      FLAG                                                           
                                                                                JMP       T5                                                              
                                        T4:                 CLR       FLAG                                                            
                                                                                JMP       T7                                                              
                                        T5:                 MOV       R0, #117                                                        
                                        T6:                 DJNZ      R0, T6                                                         
                                        T7:                 SETB      DQ   
                                                                            MOV R6,#6FH; DELAY500US:   ;误差 0us
                               DL11:        MOV R5,#0CH
                                        DJNZ R5,$
                                        DJNZ R6,DL11
                                                          RET                                                                  
                                                                                
;***************************************************************     
;读DS18B20                                 
;***************************************************************                                                                                          
;从DS18B20中读出温度低位、高位和报警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ_18B20:  
         MOV R4,#4            ; 将温度高位和低位从DS18B20中读出
         MOV R1,#26H          ; 存入26H、27H、28H、29H
RE00:    MOV R2,#8
RE01:    CLR C
       ;  SETB DQ
        ;         MOV R6,#01H;        DELAY2US:   ;误差 0us
;DL10:         MOV R5,#03H
;         DJNZ R5,$
;         DJNZ R6,DL10
                  CLR DQ         ;读前总线保持为低
                  MOV R6,#01H;        DELAY2US:   ;误差 0us
DL7:         MOV R5,#03H
         DJNZ R5,$
         DJNZ R6,DL7
                  SETB DQ        ;开始读总线释放
                  MOV R6,#03H;DELAY10US:   ;误差 0us
DL8:         MOV R5,#08H
         DJNZ R5,$
         DJNZ R6,DL8
                  MOV C,DQ      ;从DS18B20总线读得一个BIT
                 MOV R6,#33H;DELAY60US:   ;误差 0us
DL9:         MOV R5,#02H
         DJNZ R5,$
         DJNZ R6,DL9
                  RRC A                ;把读得的位值环移给A
         DJNZ R2,RE01         ;读下一个BIT
         MOV @R1,A
         INC R1
         DJNZ R4,RE00
         RET                                                                                          
;***************************************************************     
;温度转换                                    
;***************************************************************                                
CONVER:                                                              
;  处理温度 BCD 码子程序
;****************************************************
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#80H
               JZ  TEMPC1         ;温度零上转
               CLR  C
               MOV  A,TEMPL       ;二进制数求补(双字节)
               CPL  A             ;取反加1
               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
               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             ;整数部分
               ANL  A,#0F0H
               SWAP  A
               MOV  TEMPL,A
               MOV  A,TEMPH
               ANL  A,#0FH
               SWAP  A
               ORL  A,TEMPL
               MOV  TEMP_ZH,A           ;组合后的值存入TEMP_ZH
               LCALL  HEX2BCD1
               MOV  TEMPL,A
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R7
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R7,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R7
               MOV  TEMPHC,A
TEMPC12:       RET
;===========================================================
;显示区 BCD 码温度值刷新子程序
;===========================================================
DISPBCD:      MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
              MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位
              MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,A                 ;百位
              MOV  A,TEMPHC
              ANL  A,#0F0H
              CJNE  A,#010H,DISPBCD0
              SJMP  DISPBCD2
;========================================
DISPBCD0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  DISPBCD2               ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,#0AH            ;符号位不显示
              MOV  72H,A               ;十位数显示符号
DISPBCD2:     RET
;***************************************************************     
;显示温度整数部分                                    
;***************************************************************                                                                     
DISPLAY_INT:   
;百位                                                                                 
                                                          MOV A,73H;
                                                          MOV                          DPTR, #TAB                                                      
                                                          MOVC      A,@A+DPTR
                                                          MOV P0,A;
                                                          CLR P1.4
                                                          CALL  XSYS
                                                          SETB P1.4;
;十位
DIST:                                                     MOV A,72H;   
                                              MOV                          DPTR, #TAB                                                      
                                                          MOVC      A,@A+DPTR
                                                          MOV P0,A;
                                                          CLR P1.5
                                                          CALL  XSYS
                                                          SETB P1.5;
;个位
DISY:                                               MOV A,71H;                                          
                                                          MOV                          DPTR, #TAB                                                      
                                                          MOVC      A,@A+DPTR
                                                          MOV P0,A;
                                                          CLR P1.6
                                                          CLR P0.7
                                                          CALL  XSYS
                                                          SETB P0.7;
                                                          SETB P1.6;
;小数
                                                          MOV A,70H;
                                                          MOV                          DPTR, #TAB                                                      
                                                          MOVC      A,@A+DPTR
                                                          MOV P0,A;
                                                          CLR P1.7
                                                          CALL  XSYS
                                                          SETB P1.7;
                                                                                                                                                                                                                                                         
                        RET                                                                  

;===================================================================
DELAY10MS:                        ;@11.0592MHz
        NOP
        NOP
        NOP
        MOV R0,#87
        MOV R1,#10
NEXT:
        DJNZ R1,NEXT
        DJNZ R0,NEXT
        RET  

;显示延时
XSYS:
DELAY200US:   ;误差 0us
    MOV R6,#0ABH
DLA:
    MOV R5,#02H
    DJNZ R5,$
    DJNZ R6,DLA
    RET

;***************************************************************
;单字节十六进制转 BCD
;******************************************************
HEX2BCD1:   MOV  B,#064H         
            DIV  AB               
            MOV  R7,A            
            MOV  A,#0AH
            XCH  A,B
            DIV  AB               
            SWAP  A
            ORL  A,B
            RET
;***************************************************************
; 数据查表
;***************************************************************                                       
          TAB:           DB  0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH; ;共阳
                         ;                0         1          2           3        4   5        6        7         8         9         空           -
        
;  小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
             DB   06H,07H,08H,08H,09H,09H

;====================================================

             END

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:161115 发表于 2020-7-2 14:06 | 只看该作者
感谢楼主无私的分享,学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表