📄 1820.asm
字号:
HH EQU 50H /*18B20*/
MM EQU 51H
LL EQU 52H
RS EQU P1.3 /*LCD*/
R_W EQU P1.4
E EQU P1.5
ORG 0000H
MOV SP,#59H
CLR E /*LCD显示*/
LCALL INI
MAIN: MOV R1,#80H
LCALL BF
LCALL WI
MOV R2,#54H /*显示TEMPER:*/
LCALL BF
LCALL WD
MOV R2,#45H
LCALL BF
LCALL WD
MOV R2,#4DH
LCALL BF
LCALL WD
MOV R2,#50H
LCALL BF
LCALL WD
MOV R2,#45H
LCALL BF
LCALL WD
MOV R2,#52H
LCALL BF
LCALL WD
MOV R2,#3AH
LCALL BF
LCALL WD
MOV R1,#87H
LCALL BF
LCALL WI
LCALL GETTEMPER /*调用1820程序*/
MOV A,HH
ADD A,#32
MOV R2,A /*把温度显示出来*/
LCALL BF
LCALL WD
MOV A,MM
ADD A,#48
MOV R2,A
LCALL BF
LCALL WD
MOV A,LL
ADD A,#48
MOV R2,A
LCALL BF
LCALL WD
MOV R2,#2EH
LCALL BF
LCALL WD
MOV R2,26H
LCALL BF
LCALL WD
MOV R2,25H
LCALL BF
LCALL WD
MOV R2,#0DFH
LCALL BF
LCALL WD
MOV R2,#43H
LCALL BF
LCALL WD
MOV R5,#8FH /*延时0.1S后再用MAIN循环显示温度*/
MOV R6,#0BFH
MOV R7,#1H
DELA: DJNZ R5,DELA
DJNZ R6,DELA
DJNZ R7,DELA
LJMP MAIN
BF: MOV P3,#0FFH /*忙查询LCD*/
CLR RS
SETB R_W
SETB E
NOP
NOP
MOV A,P3
CLR E
JB ACC.7,BF
RET
WI: /*写到LCD寄存器里*/
CLR R_W
CLR RS
SETB E
NOP
NOP
MOV A,R1
MOV P3,A
CLR E
RET
WD:SETB RS /*写到LCD数据寄存器*/
CLR R_W
SETB E
NOP
NOP
MOV A,R2
MOV P3,A
CLR E
RET
INI: LCALL BF /*LCD初始化*/
MOV R1,#38H
LCALL WI
LCALL BF
MOV R1,#01H
LCALL WI
LCALL BF
MOV R1,#06H
LCALL WI
LCALL BF
MOV R1,#0CH
LCALL WI
RET
GETTEMPER: /*读出温度*/
SETB P2.2
LCALL INIT1820 /*复位*/
MOV A,#0CCH /*跳过ROM匹配只是适用单片*/
LCALL WRITE1820
MOV A,#44H /*发出温度转换命令*/
LCALL WRITE1820
MOV R5,#0FFH /*等待AD转换结束,12位750*/
MOV R6,#6FH
MOV R7,#06H
AA: DJNZ R5,AA
DJNZ R6,AA
DJNZ R7,AA
LCALL INIT1820 /*复位*/
MOV A,#0CCH /*跳过ROM匹配只是适用单片*/
LCALL WRITE1820
MOV A,#0BEH /*发出读温度命令*/
LCALL WRITE1820
LCALL READ1820 /*读温度*/
MOV C,4BH
MOV A,#00H
RLC A
MOV C,4AH
RLC A
MOV C,49H
RLC A
MOV C,48H
RLC A
MOV 27H,A
MOV A,29H /*将两个字节的数据舍弃低4位后整合到29H*/
MOV C,40H /*28H的0位地址*/
RRC A
MOV C,41H /*28H的1位地址*/
RRC A
MOV C,42H /*28H的2位地址*/
RRC A
MOV C,43H /*28H的3位地址*/
RRC A
MOV 29H,A
MOV A,29H /*将16进制转化为BCD码*/
JB 4FH,FUTEM
MOV B,#100
DIV AB
MOV HH,A /*高位*/
MOV A,B
MOV B,#10
DIV AB
MOV MM,A /*中位*/
MOV LL,B /*低位*/
SJMP HUI
FUTEM: CPL A
MOV HH,#13 /*高位*/
MOV A,B
MOV B,#10
DIV AB
MOV MM,A /*中位*/
MOV LL,B /*低位*/
HUI: NOP
MOV A,27H /*小数部分*/
MOV B,#6
MUL AB
MOV B,#10
DIV AB
ADD A,#48
MOV 26H,A
MOV A,B
ADD A,#48
MOV 25H,A
RET
INIT1820: /*复位初始化*/
SETB P2.2
NOP
CLR P2.2 /*拉低*/
MOV R1,#3
TSR1: MOV R0,#95 /*延时580微秒12MHZ*/
DJNZ R0,$
DJNZ R1,TSR1
SETB P2.2 /*释放*/
NOP
MOV R0,#0fH
TSR4: DJNZ R0,TSR4 /*延时30us*/
TSR2: JNB P2.2,TSR3 /*等待1820回应0*/
SJMP TSR2
TSR3: MOV R0,#110
TSR6: DJNZ R0,TSR6 /*延时236us*/
SETB P2.2
MOV R0,#130
TSR7: DJNZ R0,TSR7 /*延时261us*/
NOP
RET
WRITE1820: /*写子程序*/
MOV R2,#8
CLR C
WR1: CLR P2.2
MOV R3,#6 /*延时13us*/
DJNZ R3,$
RRC A
MOV P2.2,C
MOV R3,#26 /*延时53us*/
DJNZ R3,$
SETB P2.2
NOP
DJNZ R2,WR1
SETB P2.2
RET
READ1820:
MOV R4,#2 /*读两字节低位29H,高位28H*/
MOV R1,#29H /*低位存入29H*/
RE00: MOV R2,#8 /*数据共8位*/
RE01: CLR C
SETB P2.2
NOP
NOP
CLR P2.2
NOP
NOP
SETB P2.2
NOP
NOP
NOP
MOV C,P2.2
MOV R3,#30 /*延时61us*/
RE20: DJNZ R3,RE20
RRC A /*先出来的是LSB*/
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -