• 專注電子技術學習與研究
    當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

    51單片機實驗板DS18B20測溫程序

    作者:佚名   來源:本站原創   點擊數:  更新時間:2008年10月16日   【字體:

    /******************************************************************
    ** 實驗名:51單片機實驗板溫度測量(DS18B20) 
    ** 創建人: 謝軍洋
    ** 日 期: 2008/01/22
    ** 修改人: 51hei
    ** 描 述:P3.7口輸入,輸出數據。
    **------------------------------------------------------------------
    ** CPU:MCS-51
    ** 語言:匯編
    ** Fosc=12M

    此次試驗的仿真圖
    ********************************************************************/

    GE_BIT   EQU 30H
    SHI_BIT  EQU 31H
    BAI_BIT  EQU 32H
    DI_8BIT  EQU 33H
    GAO_8BIT EQU 34H
    DQ       EQU P3.7
    ORG 0000H
    LJMP START
    ORG 0020H
    START:
          MOV SP,#60H
        LCALL ZHUANHUAN ;調用讀溫度子程序
       LCALL CHULI
          LCALL DISPLAY ;調用數碼管顯示子程序
       LJMP START

    ;-------------------------------------------------
    ;這是DS18B20復位初始化子程序
    INIT_1820:
           SETB DQ
              NOP
           CLR DQ ;主機發出延時537微秒的復位低脈沖
           MOV R1,#3
    DU_1:
         MOV R0,#107
      DJNZ R0,$
      DJNZ R1,DU_1
      SETB DQ ;然后拉高數據線
      NOP
      NOP
      NOP
      MOV R0,#25H
    DU_2:JNB DQ,DU_3 ;等待DS18B20回應
      DJNZ R0,DU_2
      LJMP DU_4 ;延時
    DU_3:SETB F0   ;置標志位,表示DS1820存在
      LJMP DU_5
    DU_4:CLR F0   ;清標志位,表示DS1820不存在
      LJMP DU_7
    DU_5:MOV R0,#117
    DU_6:DJNZ R0,DU_6 ;時序要求延時一段時間
    DU_7:SETB DQ
      RET
    ;-------------------------------------------------
    ;寫DS18B20的子程序(有具體的時序要求)
    WRITE_1820:MOV R2,#8 ;一共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

    ;-------------------------------------------------
    ;讀DS18B20的程序,從DS18B20中讀出兩個字節的溫度數據
    READ_1820:MOV R4,#2     ;將溫度高位和低位從DS18B20中讀出
           MOV R1,#DI_8BIT ;低位存入DI_8BIT,高位存入GAO_8BIT
    RE0:MOV R2,#8             ;數據一共有8位
    RE1:CLR C
    SETB DQ
    NOP
    NOP
    CLR DQ
    NOP
    NOP
    NOP
    SETB DQ
    MOV R3,#9
    RE2:DJNZ R3,RE2
    MOV C,DQ
    MOV R3,#23
    RE3:DJNZ R3,RE3
    RRC A
    DJNZ R2,RE1
    MOV @R1,A
    INC R1
    DJNZ R4,RE0
    /* DEC R1
    MOV A,GAO_8BIT
    XCHD A,@R1
    XCH A,@R1
    MOV GAO_8BIT,A
    MOV A,@R1
    SWAP A
    MOV @R1,A  */
    RET    
    ;-------------------------------------------------
    ;讀出后轉換的溫度值
    ZHUANHUAN:
           //SETB DQ
           LCALL INIT_1820 ;先復位DS18B20
           JB F0,ZH1
           RET ;判斷DS1820是否存在?若DS18B20不存在則返回
    ZH1:MOV A,#0CCH ;跳過ROM匹配
    LCALL WRITE_1820
    MOV A,#44H ;發出溫度轉換命令
    LCALL WRITE_1820
    LCALL DISPLAY ;等待AD轉換結束,12位的話750微秒
    LCALL INIT_1820 ;準備讀溫度前先復位
    MOV A,#0CCH ;跳過ROM匹配
    LCALL WRITE_1820
    MOV A,#0BEH ;發出讀溫度命令
    LCALL WRITE_1820
    LCALL READ_1820
    RET  
    ;-------------------------------------------------
    ;數據處理子程序
    CHULI:
          MOV P0,GAO_8BIT
       MOV P2,DI_8BIT
          MOV A,GAO_8BIT
       JB ACC.7,FU
          MOV A,DI_8BIT
       MOV  B,#16
       DIV  AB
          
       MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
          MOV A,B ;將TEMPER_L的低四位X10/16得小數后一位數.
       MOV B,#10
       MUL AB
       MOV B,#16
       DIV AB
       MOV 36H,A ;將小數后一位數.存入36H中
       MOV A,GAO_8BIT ;TEMPER_H中存放高8位數,權重16
       MOV B,#16
       MUL AB
       ADD A,35H ;35H中存入溫度值的整數部分
       MOV B,#10
       DIV AB
       MOV GE_BIT,B ;個位存入30H中
       MOV B,#10 ;
       DIV AB ;
       MOV SHI_BIT,B ;十位存入31H中
       MOV B,#10 ;
       DIV AB ;
       MOV BAI_BIT,B ;百位存入32H中
       MOV A,GAO_8BIT
       MOV 37H,#10H ;
       JB ACC.7,EXIT
       MOV 37H,#00H
       SJMP EXIT
       FU:
          MOV A,DI_8BIT
          CPL A
       ADD A,#1
       MOV B,#16
       DIV AB
          MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
          MOV A,B ;將TEMPER_L的低四位X10/16得小數后一位數.
       MOV B,#10
       MUL AB
       MOV B,#16
       DIV AB
      // MOV 36H,A ;將小數后一位數.存入36H中
      // MOV A,GAO_8BIT ;TEMPER_H中存放高8位數,權重16
       MOV B,#16
       MUL AB
       ADD A,35H ;35H中存入溫度值的整數部分
       MOV B,#10
       DIV AB
       MOV GE_BIT,B ;個位存入30H中
       MOV B,#10 ;
       DIV AB ;
       MOV SHI_BIT,B ;十位存入31H中
       MOV B,#10 ;
       DIV AB ;
       MOV BAI_BIT,B ;百位存入32H中
       MOV A,GAO_8BIT
       MOV 37H,#10H ;
       JB ACC.7,EXIT
       MOV 37H,#00H
       SJMP EXIT
    EXIT:RET  
    ;-------------------------------------------------
    ;注:此次ds18b20溫度測量實驗在51hei單片機實驗板http://www.userform1.com上進行,測試一切ok,下面是數據顯示子程序
    CL0:INC A
    AJMP  CL1
    CHULI:MOV A,DI_8BIT
      MOV  B,#16
      DIV  AB
      JB B.3,CL0
    CL1:MOV 35H,A ;將DI_8BIT的高四位右移四位,存入35H中(溫度值)
    MOV A,B ;將TEMPER_L的低四位X10/16得小數后一位數.
    MOV B,#10
    MUL AB
    MOV B,#16
    DIV AB
    MOV 36H,A ;將小數后一位數.存入36H中
    MOV A,GAO_8BIT ;TEMPER_H中存放高8位數,權重16
    MOV B,#16
    MUL AB
    ADD A,35H ;35H中存入溫度值的整數部分
    MOV B,#10
    DIV AB
    MOV GE_BIT,B ;個位存入30H中
    MOV B,#10 ;
    DIV AB ;
    MOV SHI_BIT,B ;十位存入31H中
    MOV B,#10 ;
    DIV AB ;
    MOV BAI_BIT,B ;百位存入32H中
    MOV A,GAO_8BIT
    MOV 37H,#10H ;
    JB ACC.7,EXIT
    MOV 37H,#00H
    EXIT: RET           */  

    DISPLAY:MOV DPTR,#TABLE
            MOV R0,#4
        XUN:MOV R1,#250 ;顯示1000次    
       HUAN:MOV A,#10   //顯示‘-’
         MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.0
      LCALL DELAY1MS
      SETB P3.0
        
      MOV A,#10   //顯示‘-’
      MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.1
      LCALL DELAY1MS
      SETB P3.1
        
      MOV A,BAI_BIT   //顯示溫度百位
         MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.2
      LCALL DELAY1MS
      SETB P3.2
      MOV A,SHI_BIT   //顯示溫度十位
         MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.3
      LCALL DELAY1MS
      SETB P3.3
      MOV A,GE_BIT   //顯示溫度個位
         MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.4
      LCALL DELAY1MS
      SETB P3.4
        
      MOV A,#11    //顯示'C'
         MOVC A,@A+DPTR
            MOV P1,A
      CLR P3.5
      LCALL DELAY1MS
      SETB P3.5
        
      MOV A,#10   //顯示‘-’
      MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.6
      LCALL DELAY1MS
      SETB P3.6
        
    /* MOV A,#10   //顯示‘-’
      MOVC A,@A+DPTR
      MOV P1,A
      CLR P3.7
      LCALL DELAY1MS
      SETB P3.7  */
      DJNZ R1,HUAN ;250次沒完循環
         DJNZ R0,XUN ;4個250次沒完循環
       RET  
      
    DELAY10MS:MOV R7,#1     //延時10MS子程序
           L1:NOP
        DJNZ R7,L1
    DELAY1MS:RET    
        
    TABLE:DB 3FH ;0
       DB 06H ;1
          DB 5BH ;2
       DB 4FH ;3
       DB 66H ;4
       DB 6DH ;5
       DB 7DH ;6
       DB 07H ;7
       DB 7FH ;8
       DB 6FH ;9
       DB 01000000B ;-
       DB 39H ;C    
    END
     

    關閉窗口
    国产农村精品一级毛片视频_亚洲Av无码专区国产乱码在线观看_亚洲综合国产Av_天天影视网天天综合色