内容发布更新时间 : 2024/12/23 11:04:20星期一 下面是文章的全部内容请认真阅读。
;写DS18B20的子程序,写一个字节 WRITE_1820:
MOV R2,#8 ;一共8位数据 CLR C WR1:
CLR P2.4 ;写开始至少1us低电平,此处约12us MOV R3,#5 ;在写开始15us之前要读入数据,也即在写\时要在启动后15us内 DJNZ R3,$ ;拉高数据线,而写\还是\,此处12us后数据线拉高(写\时) RRC A
MOV P2.4,C MOV R3,#25 ;延时15us-60us让DS18B20采样数据线,此处延时约51us DJNZ R3, ;注意写\过程总持续时间要为60us-120us,开始延时
12us,这里延时51us,总共约63us
SETB P2.4 NOP
DJNZ R2,WR1 ;8位数据是否写完 SETB P2.4 RET
;读DS18B20的子程序,从DS18B20中读出两个字节的温度数据 READ_1820:
MOV R4,#2 ;将温度高位和低位从DS18B20中读出 MOV R1,#29H ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) RE1:
MOV R2,#8 ;数据一共有8位 RE2: CLR C SETB P2.4 NOP
NOP ;读开始低电平延时至少1us,这里延时2us CLR P2.4 NOP NOP NOP
SETB P2.4 ;设为数据输入 MOV R3,#5 ;延时10us DJNZ R3,$ MOV C,P2.4 ;读与写一样,启动后15us之前读入数据,这里延时13us
后读入数据
MOV R3,#25 ;延时50us,保证读总过程持续60us,这里总过程约63us DJNZ R3,$ RRC A
DJNZ R2,RE2 ;8位数据是否读完? MOV @R1,A DEC R1 ;读完存缓冲区,缓冲区地址减1
13
DJNZ R4,RE1 ;两字节温度值是否读完,读完则返回,否则继续 RET ;显示子程序 DISPLAY: MOV P3,#0FFH
MOV A,29H ;将29H中的十六进制数转换成10进制 MOV B,#10 ;16进制/10=10进制 DIV AB
MOV B_BIT,A ;十位在a MOV A_BIT,B ;MOV A,R0 ;JNB ACC.3,DL1
MOV C_BIT,#5 AJMP DL2 DL1:
MOV C_BIT,#0 DL2:
MOV DPTR,#NUMTAB ;MOV R0,#2 S1:MOV R1,#50
S2:MOV A,C_BIT ;MOVC A,@A+DPTR ;MOV P3,A ;CLR P1.2 ;CLR P1.3
ACALL D1MS SETB P1.2 SETB P1.3 MOV P3,#0FFH
MOV A,A_BIT ;MOVC A,@A+DPTR ;MOV P3,A ;CLR P3.7
CLR P1.1 ;ACALL D1MS SETB P1.1 MOV P3,#0FFH
MOV A,B_BIT ;MOVC A,@A+DPTR ;MOV P3,A ;CLR P1.0 ;ACALL D1MS SETB P1.0 MOV P3,#0FFH
个位在b 精度0.5度 指定查表启始地址 取十分位数
查十分位数的7段代码 送出十分位的7段代码 开十分位显示 取个位数
查个位的7段代码 送出个位的7段代码 开个位显示 取十位数
查十位数的7段代码 送出十位的7段代码 开十位显示 14
DJNZ R1,S2 DJNZ R0,S1 RET
;1MS延时(按12MHZ算) D1MS:
MOV R6,#10 L:
MOV R7,#49 DJNZ R7,$ DJNZ R6,L RET
;7段数码管0~9数字的共阳显示代码NUMTAB: DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H END
15