编辑: gracecats | 2018-11-15 |
DS18B20存在标志位 DQ BIT P3.
2 ;
读DS18B20的数据端 TEMPER_L EQU 29H ;
存温度的低字节 TEMPER_H EQU 28H ;
存温度的高字节 A_BIT EQU 35H ;
存正数部份的个位 B_BIT EQU 36H ;
存正数部份的十位 ZJJ EQU 37H ;
过度位 XSB EQU 38H ;
过度位 ORG 0000H ;
DS18B20汇编程序起始 AJMP MAIN ;
跳到主程序 ORG 0100H MAIN: LCALL INIT_18B20 ;
调用复位时序 LCALL RE_CONFIG ;
调用设置精度子程序 LCALL GET_TEMPER ;
调用获取温度数值程序 AJMP CHANGE ;
调用温度转换成BCD码的程序 INIT_18B20: SETB DQ ;
DQ位置1 NOP CLR DQ ;
拉低DQ电平 MOV R0,#0FBH ;
设置延长的时间具体是多少 TSR1: DJNZ R0,TSR1 ;
延时 SETB DQ ;
DQ位置1 MOV R0,#25H ;
设置延长的时间具体是多少 TSR2: JNB DQ ,TSR3 ;
看看DQ位是否为0,如果为0则说明 ;
DS18B20不存在则顺序执行 DJNZ R0,TSR2 ;
延时 TSR3: SETB FLAG1 ;
置标志位,表明DS18B20存在 CLR P3.7 ;
二极管指示 AJMP TSR5 ;
存在的情况下跳到TSR5,否则顺序执行 TSR4: CLR FLAG1 LJMP TSR7 TSR5: MOV R0,#06BH ;
要等待的具体时间 TSR6: DJNZ R0,TSR6 ;
延时 TSR7: SETB DQ ;
表明不存在 RET RE_CONFIG: JB FLAG1,RE_CONFIG1 RET RE_CONFIG1: MOV A,#0CCH ;
放跳过ROM命令 LCALL WRITE_18B20 MOV A,#4EH ;
写暂存器命令 LCALL WRITE_18B20 ;
写暂存器命令 MOV A,#00H ;
报警上限中写入00H LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 MOV A,#00H ;
报警下限中写入00H LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 MOV A,#7FH ;
选择十二位温度分辨率 LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 RET GET_TEMPER: SETB DQ LCALL INIT_18B20 JB FLAG1,TSS2 RET ;
若不存在则返回 TSS2: MOV A,#0CCH ;
跳过ROM LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 MOV A,#44H ;
发出温度转换命令 LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 LCALL DISPLAY ;
延时 LCALL INIT_18B20 ;
调用复位时序 MOV A,#0CCH ;
跳过ROM LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 MOV A,#0BEH ;
发出读温度换命令 LCALL WRITE_18B20 ;
调用写DS18B20一个字节命令 LCALL READ2_18B20 ;
读两个字节的温度 RET WRITE_18B20: MOV R2,#8 ;
一个字节8位CLR C ;
进位位清0 WR1: CLR DQ ;
拉低DQ的电平 MOV R3,#6 ;
等待的具体时间 DJNZ R3,$ ;
延时 RRC A ;
累加器A带进位位右移 MOV DQ,C ;
C的值给DQ MOV R3,#23 ;
等待的具体时间 DJNZ R3,$ ;
延时 SETB DQ ;
拉高DQ的电平 NOP DJNZ R2,WR1 ;
延时 SETB DQ ;
拉高DQ的电平 RET READ2_18B20: MOV R4,#2 ;
低位存在29H,高位存在28H MOV R1,#29H RE00: MOV R2,#8 ;
一个字节8位RE01: CLR C SETB C NOP NOP CLR DQ ;
拉低DQ的电平 NOP NOP NOP SETB DQ MOV R3,#7 ;
等待的具体时间 DJNZ R3,$ ;
延时 MOV C,DQ ;
DQ的值给C MOV R3,#23 ;
等待的具体时间 DJNZ R3,$ ;
延时 RRC A ;
累加器A 带进位位右移 DJNZ R2,RE01 ;
两个字节读完,否则继续读 MOV @R1,A ;
把读的字节给29H ,28H DEC R1 DJNZ R4,RE00 RET CHANGE: MOV A,29H MOV R5,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 ;
这一小段程序是把28H的低四位与29H ;
的高四位组合一个新字节 MOV A,R5 ANL A,#00001111B ;
把29H的低四位拿出来考虑 MOV B,#8 DIV AB ;
得到的数据除以8 MOV B,#5 MUL AB ;
之后得到的数据乘以5 MOV 38H,A ;
这一小段程序则是按论文的要求小数 ;