附录三 源程序
ORG 0000H
TEMPER_L EQU 29H TEMPER_H EQU 28H
FLAG1 EQU 38H;是否检测到DS18B20标志位 A_BIT EQU 20H ;数码管个位数存放内存位置 B_BIT EQU 21H ;数码管十位数存放内存位置 XS EQU 30H MOV A,#00H MOV P2,A
MAIN:LCALL GET_TEMPER;调用读温度子程序 MOV A,29H MOV B,A CLR C RLC A CLR C RLC A CLR C RLC A CLR C RLC A
- 9 -
SWAP A MOV 31H,A MOV A,B
MOV C,40H;将28H中的最低位移入C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A MOV 29H,A
LCALL DISPLAY;调用数码管显示子程序 AJMP MAIN; 这是DS18B20复位初始化子程序 INIT_1820:SETB P1.0 NOP
CLR P1.0;主机发出延时537微秒的复位低脉冲 MOV R1,#3
GET_TEMPER:SETB P1.0
LCALL INIT_1820;先复位DS18B20 JB FLAG1,TSS2
RET ; 判断DS1820是否存在?若DS18B20不存在则返回 TSS2:MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒骁顾燁鶚巯瀆蕪領鲡赙。 LCALL DISPLAY
LCALL INIT_1820;准备读温度前先复位 MOV A,#0CCH ; 跳过ROM匹配 LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令 LCALL WRITE_1820 LCA
RET; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
- 10 -
READ_18200:MOV R4,#2 ; 将温度高位和低位从DS18B20中读出 MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H) RE00:MOV R2,#8;数据一共有8位 RE01:CLR C SETB P1.0 NOP NOP CLR P1.0 NOP NOP NOP SETB P1.0 MOV R3,#9
RE10: DJNZ R3,RE10 MOV C,P1.0 MOV R3,#23 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET
DISPLAY:CLR C SUBB A, #30 JNB CY, T1 MOV A, B CLR C SUBB A,#25 JNB CY, XIANSHI CLR P1.1 LJMP XIANSHI T1:CLR P1.2 XIANSHI:MOV A,B
MOV B,#10 ;10进制/10=10进制
- 11 -
DIV AB
MOV B_BIT,A ;十位在A MOV A_BIT,B ;个位在B MOV R0,#4 CLR C;多加的
DPL1: MOV R1,#250 ;显示1000次 DPLOP:MOV DPTR,#NUMTAB1 MOV A,A_BIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码 MOV P0,A ;送出个位的7段代码 CLR P2.1 ;开个位显示 ACALL D1MS ;显示1MS SETB P2.1
MOV DPTR,#NUMTAB MOV A,B_BIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码 MOV P0,A ;送出十位的7段代码 CLR P2.2 ;开十位显示 ACALL D1MS ;显示1MS SETB P2.2 JC XSW;多加的 MOV A,31H MOV B,#160 DIV AB MOV XS,B XSW:MOV A,XS MOVC A,@A+DPTR MOV P0,A CLR P2.0 ACALL D1MS SETB P2.0 SETB C;多加的
DJNZ R1,DPLOP ;250次没完循环 DJNZ R0,DPL1 ;4个250次没完循环 RET;1MS延时(按12MHZ算)
- 12 -
相关推荐: