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

📄 c51ds18b20.txt

📁 两路温度的实时采集; &#1048715 温度通过数码管显示
💻 TXT
字号:
DS18B20的多点测温程序-http://www.my07d.com  
       


            DS18B20的多点测温程序

                        ORG 0000H
                        LJMP MAIN
                        ORG 2000H
                        MAIN:MOV SP,#60H
                        LCALL GET_TEMP
                        SJMP $
                        GET_TEMP:CLR PSW.4
                        SETB PSW.3 ;设置工作寄存器当前所在的区域
                        CLR EA ;使用ds1820一定要禁止任何中断产生
                        LCALL INT ;调用初使化子程序
                        MOV A,#0CCH
                        LCALL WRITE ;送入跳过ROM命令
                        MOV A, #44H
                        LCALL WRITE ;送入温度转换命令
                        LCALL DELAY ;延时750ms
                        LCALL INT ;温度转换完全,再次初使化ds1820
                        MOV A,#55H
                        LCALL WRITE ;送入匹配ROM命令
                        MOV A,#28H
                        LCALL WRITE
                        MOV A,#24H
                        LCALL WRITE 
                        MOV A,#0C5H
                        LCALL WRITE 
                        MOV A,#39H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#5FH
                        LCALL WRITE
                        MOV A,#0BEH
                        LCALL WRITE ;送入读温度暂存器命令
                        LCALL READ
                        MOV R7,A ;读出温度值低字节存入R7
                        LCALL READ
                        MOV R6,A ;读出谩度值高字节存入R6
                        LCALL INT
                        NOP
                        NOP
                        LCALL DU
                        RET

                        INT: CLR EA ;初始化ds1820子程序
                        L0:CLR P1.1 ;ds1820总线为低复位电平
                        MOV R2,#200
                        L1:CLR P1.1
                        DJNZ R2,L1 ;总线复位电平保持400us
                        SETB P1.1 ;释放ds1820总线
                        MOV R2,#30
                        L4:DJNZ R2,L4 ;释放ds1820总线保持60us
                        CLR C ;清存在信号(存在C=0,不存在C=1)
                        ORL C,P1.1
                        JC L0 ;存在吗?不存在则重新来
                        MOV R6,#80
                        L5:ORL C,P1.1
                        JC L3
                        DJNZ R6,L5
                        SJMP L0
                        L3:MOV R2,#240
                        L2:DJNZ R2,L2 
                        RET
                        WRITE: CLR EA ;向ds1820写操作命令子程序
                        MOV R3,#8 ;写入ds1820的bit数,一个字节8个bit
                        WR1:SETB P1.1
                        MOV R4,#8
                        RRC A ;把一个字节data(A)分成8个bit环移给 C
                        CLR P1.1 ;开始写入ds1820总线要处于复位(低)状态
                        WR2:DJNZ R4,WR2 ;ds1820总线复位保持16us
                        MOV P1.1,C ;写入一个bit
                        MOV R4,#21
                        WR3:DJNZ R4,WR3 ;等待40us
                        MOV R4,#8
                        WR4:DJNZ R4,WR4
                        DJNZ R3,WR1 ;写入下一个bit
                        SETB P1.1 ;重新释放ds1820总线
                        RET
                        READ:CLR EA
                        MOV R3,#8 ;连续读8个bit
                        RE1:CLR P1.1 ;读前总线保持为低
                        MOV R0,#4
                        NOP
                        SETB P1.1 ;开始读,总线释放
                        RE2:DJNZ R0,RE2 ;持续8us
                        MOV C,P1.1 ;从ds1820总线读得一个bit
                        RRC A ;把读得的位值环移给 A
                        MOV R1,#30
                        RE3:DJNZ R1,RE3 ;持续60us
                        DJNZ R3,RE1 ;读下一个bit
                        SETB P1.1 ;重新释放ds1820总线
                        RET
                        DELAY:MOV R0,#100
                        DEL2:MOV R1,#10
                        DEL1:MOV R2,#250
                        DEL3:NOP
                        NOP
                        DJNZ R2,DEL3
                        DJNZ R1,DEL1
                        DJNZ R0,DEL2
                        RET
                        DU:LCALL INT ;温度转换完全,再次初使化ds1820 
                        CLR EA
                        MOV A,#55H
                        LCALL WRITE ;送入匹配ROM命令
                        MOV A,#28H
                        LCALL WRITE
                        MOV A,#91H
                        LCALL WRITE 
                        MOV A,#0C5H
                        LCALL WRITE 
                        MOV A,#39H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#00H
                        LCALL WRITE 
                        MOV A,#0B3H
                        LCALL WRITE
                        MOV A,#0BEH
                        LCALL WRITE ;送入读温度暂存器命令
                        LCALL READ1
                        MOV R3,A ;读出温度值低字节存入R5
                        LCALL READ1
                        MOV R2,A ;读出谩度值高字节存入R4
                        SETB EA
                        RET
                        READ1:CLR EA
                        MOV R4,#8 ;连续读8个bit
                        RE11:CLR P1.1 ;读前总线保持为低
                        MOV R0,#4
                        NOP
                        SETB P1.1 ;开始读,总线释放
                        RE22:DJNZ R0,RE22 ;持续8us
                        MOV C,P1.1 ;从ds1820总线读得一个bit
                        RRC A ;把读得的位值环移给 A
                        MOV R1,#30
                        RE33:DJNZ R1,RE33 ;持续60us
                        DJNZ R4,RE11 ;读下一个bit
                        SETB P1.1 ;重新释放ds1820总线
                        RET
                        END






                        

⌨️ 快捷键说明

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