<acronym id="rolok"><li id="rolok"><em id="rolok"></em></li></acronym><delect id="rolok"><ruby id="rolok"></ruby></delect>
            專注電子技術學習與研究
            當前位置:單片機教程網 >> 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://m.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_天天影视网天天综合色