- 首页
-
- 问答
-
-
-
-
d12bbeb2a776
可以上网先找点DS18B20的资料,应用它时,控制延时很重要。;**延时均按12M晶振计算******************************** FLAG1 BIT F0 ;DS18B20存在标志位 DQ BIT p1.0 ;DS18B20占用的总线 TEMPER_L EQU 29H TEMPER_H EQU 28H ROM1 EQU 2AH ROM2 EQU 2BH ROM3 EQU 2CH ROM4 EQU 2DH ROM5 EQU 2EH ROM6 EQU 2FH ROM7 EQU 30H ROM8 EQU 31H ;************程序起始******************** ORG 0000H;**************************************************************************** AJMP MAIN ORG 0100H;**************主程序开始************MAIN: LCALL INIT_18B20 ;DS18B20复位程序 Lcall GET_TEMPER ;读转换后的温度 ljmp CHANGE;**********DS18B20复位程序*****************INIT_18B20: SETB DQ ;DS18B20占用的总线 NOP CLR P2.0 ;二极管指示用于观察调试 CLR DQ ;DS18B20占用的总线 MOV R0,#0FBH TSR1: DJNZ R0,TSR1 ;延时 SETB DQ MOV R0,#060H TSR2: JNB DQ,TSR4 ;延时等待18B20回应,将DQ拉低 DJNZ R0,TSR2 TSR3: CLR FLAG1 ;置标志位,表明DS18B20不存在 AJMP TSR7 TSR4: SETB FLAG1 ;表明存在 AJMP TSR5 TSR5: MOV R0,#03CH TSR6: JB DQ,tsr8 ;延时等待18B20释放总线 DJNZ R0,TSR6 AJMP tsr7 tsr8: SETB P2.0 ;二极管指示用于观察调试,表示18B20存在 TSR7: SETB DQ RET;*****************读转换后的温度值****************GET_TEMPER: SETB DQ CLR P2.1 LCALL INIT_18B20 ;复位 JB FLAG1,TSS2 ;若FLAG1位为1则跳转 RET ;若不存在则返回TSS2: lcall init_18b20 MOV A,#0CCH ;放跳过ROM命令 LCALL WRITE_18B20 MOV A,#44H ;发出温度转换命令 LCALL WRITE_18B20 mov r2,#100 l1: LCALL d1ms ;延时 djnz r2,l1 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,#5 ;延时 DJNZ R3,$ RRC A ;带进位右移 MOV DQ,C ;向总线写一位数 MOV R3,#20 ;延时演示42μ秒 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 ;判断8位是否发完 SETB DQ RET ;***********读18B20程序,读出两个字节的温度********* READ2_18B20: MOV R4,#2 ;给2字节数,低位存在29 H,高位存在28H MOV R1,#29H ;yf给地址初值 RE00: MOV R2,#8 ;yf给R2给一字节循环数 RE01: CLR C SETB C NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#7 ;延时16μ秒 DJNZ R3,$ MOV C,DQ ;将读得的数传给C MOV R3,#22 ;延时46μ秒 DJNZ R3,$ RRC A ;右移一位,移位8次后A中的值即为所采得的数值 DJNZ R2,RE01 ;一字节数采集够 MOV @R1,A ;将累加器值存入间接地址 DEC R1 ;地址减1 DJNZ R4,RE00 ;第一字节采集完后采集第二字节 SETB P2.1 ;二极管指示用于观察调试,表示18B20向单片机发送数据 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 LCALL heat LJMP MAIN ;*******************加热控制******heat: mov a,29H subb A,#56H ;86度 JNC panduan setb p1.1 RET panduan:MOV A,R0 ;初始化时将R0清零 JNZ NOT1 LCALL D20F ;延时20分钟 MOV R0,#0FFH ;用来区分是否是第一次 CLR P1.1 RET NOT1: CLR P1.1 RET ;*********************************** D20F: MOV R4,#60 TIME3: MOV R5,#200 TIME2: MOV R6,#100 TIME1: MOV R7,#100 ;20分钟延时(按12MHZ算,不太精确,但是偏差不大) DJNZ R7,$ DJNZ R6,TIME1 DJNZ R5,TIME2 DJNZ R4,TIME3 RET ;*********************************** D1MS: MOV R3,#100 ;1MS延时(按12MHZ算) DJNZ R3,$ RET
-
-
-
-
-
-
求购