📄 18bb20.src
字号:
; .\18bb20.SRC generated from: .\18bb20.c
$NOMOD51
NAME _18BB20
P0 DATA 080H
P1 DATA 090H
P2 DATA 0A0H
P3 DATA 0B0H
T0 BIT 0B0H.4
AC BIT 0D0H.6
T1 BIT 0B0H.5
T2 BIT 090H.0
EA BIT 0A8H.7
IE DATA 0A8H
DQ BIT 080H.3
EXF2 BIT 0C8H.6
RD BIT 0B0H.7
ES BIT 0A8H.4
IP DATA 0B8H
RI BIT 098H.0
INT0 BIT 0B0H.2
CY BIT 0D0H.7
TI BIT 098H.1
INT1 BIT 0B0H.3
RCAP2H DATA 0CBH
PS BIT 0B8H.4
SP DATA 081H
T2EX BIT 090H.1
OV BIT 0D0H.2
RCAP2L DATA 0CAH
C_T2 BIT 0C8H.1
WR BIT 0B0H.6
RCLK BIT 0C8H.5
TCLK BIT 0C8H.4
SBUF DATA 099H
PCON DATA 087H
SCON DATA 098H
TMOD DATA 089H
TCON DATA 088H
IE0 BIT 088H.1
IE1 BIT 088H.3
B DATA 0F0H
CP_RL2 BIT 0C8H.0
ACC DATA 0E0H
ET0 BIT 0A8H.1
ET1 BIT 0A8H.3
TF0 BIT 088H.5
ET2 BIT 0A8H.5
TF1 BIT 088H.7
TF2 BIT 0C8H.7
RB8 BIT 098H.2
TH0 DATA 08CH
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
P BIT 0D0H.0
SM0 BIT 098H.7
TL0 DATA 08AH
SM1 BIT 098H.6
TL1 DATA 08BH
SM2 BIT 098H.5
TL2 DATA 0CCH
PT0 BIT 0B8H.1
PT1 BIT 0B8H.3
RS0 BIT 0D0H.3
PT2 BIT 0B8H.5
TR0 BIT 088H.4
RS1 BIT 0D0H.4
TR1 BIT 088H.6
TR2 BIT 0C8H.2
PX0 BIT 0B8H.0
PX1 BIT 0B8H.2
DPH DATA 083H
DPL DATA 082H
EXEN2 BIT 0C8H.3
REN BIT 098H.4
T2CON DATA 0C8H
RXD BIT 0B0H.0
TXD BIT 0B0H.1
F0 BIT 0D0H.5
PSW DATA 0D0H
?PR?_delay?18BB20 SEGMENT CODE
?PR?reset?18BB20 SEGMENT CODE
?BI?reset?18BB20 SEGMENT BIT OVERLAYABLE
?PR?read_byte?18BB20 SEGMENT CODE
?PR?_write_byte?18BB20 SEGMENT CODE
?PR?get_temperature?18BB20 SEGMENT CODE
?PR?main?18BB20 SEGMENT CODE
?BI?18BB20 SEGMENT BIT
EXTRN DATA (table)
EXTRN CODE (?C_STARTUP)
PUBLIC flag
PUBLIC main
PUBLIC get_temperature
PUBLIC _write_byte
PUBLIC read_byte
PUBLIC reset
PUBLIC _delay
RSEG ?BI?18BB20
?_write_byte?BYTE:
flag: DBIT 1
;
;
; #include "intrins.h"
; #include "reg52.h"
; //#include "stdio.h"
; sbit DQ = P0^3;
; #define uchar unsigned char
; #define uint unsigned int
;
; bit flag;
;
;
;
;
;
; uchar table[];
; void delay(uint x);
; bit reset(void);
; uchar read_byte(void);
; void write_byte(uchar val);
;
;
;
;
;
; void delay(uint x) ////when crystal is 12M ,a*2+5 us ,子程序调用要5us,while 就等于DJNZ指令
RSEG ?PR?_delay?18BB20
_delay:
USING 0
;---- Variable 'x?040' assigned to Register 'R6/R7' ----
; SOURCE LINE # 26
; {
; SOURCE LINE # 27
?C0001:
; while (x--);
; SOURCE LINE # 28
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0022
DEC R6
?C0022:
ORL A,R4
JNZ ?C0001
; }
; SOURCE LINE # 29
?C0003:
RET
; END OF _delay
;
;
; bit reset(void) //初始化18B20
RSEG ?PR?reset?18BB20
reset:
USING 0
; SOURCE LINE # 32
; {
; SOURCE LINE # 33
; bit presence=0; //定义一个应答信号
; SOURCE LINE # 34
CLR presence?141
; DQ=1;
; SOURCE LINE # 35
SETB DQ
; DQ=0;
; SOURCE LINE # 36
CLR DQ
; delay(80); //置总线为低电平并保持至少480us
; SOURCE LINE # 37
MOV R7,#050H
MOV R6,#00H
LCALL _delay
; DQ=1; //等电阻拉高总线并保持15-60us
; SOURCE LINE # 38
SETB DQ
; delay(5);
; SOURCE LINE # 39
MOV R7,#05H
MOV R6,#00H
LCALL _delay
; presence=DQ; //接受应答信号
; SOURCE LINE # 40
MOV C,DQ
MOV presence?141,C
; delay(13); //延时60-240us
; SOURCE LINE # 41
MOV R7,#0DH
MOV R6,#00H
LCALL _delay
; return(presence); //返回应答信号
; SOURCE LINE # 42
MOV C,presence?141
; }
; SOURCE LINE # 43
?C0004:
RET
; END OF reset
;
; /* 从DS18B20读出1个字节 */
; uchar read_byte(void) //从18b20读一个字节.返回读到的内容
RSEG ?PR?read_byte?18BB20
read_byte:
USING 0
; SOURCE LINE # 46
; {
; SOURCE LINE # 47
; uchar i,j;
; j=0;
; SOURCE LINE # 49
;---- Variable 'j?243' assigned to Register 'R5' ----
CLR A
MOV R5,A
; for(i=0;i<8;i++)
; SOURCE LINE # 50
;---- Variable 'i?242' assigned to Register 'R3' ----
MOV R3,A
?C0005:
; {
; SOURCE LINE # 51
; j=j>>1;
; SOURCE LINE # 52
MOV A,R5
CLR C
RRC A
MOV R5,A
; DQ=0;
; SOURCE LINE # 53
CLR DQ
; _nop_(); //要求>1us,但又不能超过15us
; SOURCE LINE # 54
NOP
; _nop_();
; SOURCE LINE # 55
NOP
; DQ=1; //释放总线
; SOURCE LINE # 56
SETB DQ
; _nop_();
; SOURCE LINE # 57
NOP
; _nop_();
; SOURCE LINE # 58
NOP
; if(DQ)
; SOURCE LINE # 59
JNB DQ,?C0008
; j|=0x80;
; SOURCE LINE # 60
ORL AR5,#080H
?C0008:
; delay(30);
; SOURCE LINE # 61
MOV R7,#01EH
MOV R6,#00H
LCALL _delay
; }
; SOURCE LINE # 62
INC R3
CJNE R3,#08H,?C0005
?C0006:
; return (j);
; SOURCE LINE # 63
MOV R7,AR5
; }
; SOURCE LINE # 64
?C0009:
RET
; END OF read_byte
;
;
;
;
; void write_byte(uchar val) //向DS18B20写入1个字节
RSEG ?PR?_write_byte?18BB20
L?0023:
USING 0
MOV R6,#00H
LCALL _delay
MOV R7,#0CCH
_write_byte:
USING 0
;---- Variable 'val?344' assigned to Register 'R5' ----
MOV R5,AR7
; SOURCE LINE # 69
; {
; SOURCE LINE # 70
; uchar i;
; for(i=0;i<8;i++)
; SOURCE LINE # 72
;---- Variable 'i?345' assigned to Register 'R3' ----
CLR A
MOV R3,A
?C0010:
; {
; SOURCE LINE # 73
; DQ=0;
; SOURCE LINE # 74
CLR DQ
; _nop_(); //要求>1us,但又不能超过15us
; SOURCE LINE # 75
NOP
; _nop_();
; SOURCE LINE # 76
NOP
; if(0x01&val)
; SOURCE LINE # 77
MOV A,R5
JNB ACC.0,?C0013
; DQ=1;
; SOURCE LINE # 78
SETB DQ
?C0013:
; delay(30); //要求总时间在60-120us
; SOURCE LINE # 79
MOV R7,#01EH
MOV R6,#00H
LCALL _delay
; DQ=1; //释放总线
; SOURCE LINE # 80
SETB DQ
; _nop_(); //要求>1us
; SOURCE LINE # 81
NOP
; val=val>>1;
; SOURCE LINE # 82
MOV A,R5
CLR C
RRC A
MOV R5,A
; }
; SOURCE LINE # 83
INC R3
CJNE R3,#08H,?C0010
; }
; SOURCE LINE # 84
?C0014:
RET
; END OF _write_byte
;
; /* 读取温度子程序 */
; void get_temperature(void)
RSEG ?PR?get_temperature?18BB20
get_temperature:
USING 0
; SOURCE LINE # 87
; {
; SOURCE LINE # 88
; uchar msb;//高8位
; uchar lsb;//低8位
; reset(); /* 发送复位信号 */
; SOURCE LINE # 91
LCALL reset
; delay(20);
; SOURCE LINE # 92
MOV R7,#014H
; write_byte(0xcc); /* 跳过ROM */
; SOURCE LINE # 93
LCALL L?0023
; write_byte(0x44); /* 发送转换温度命令 */
; SOURCE LINE # 94
MOV R7,#044H
LCALL _write_byte
; reset();
; SOURCE LINE # 95
LCALL reset
; delay(14);
; SOURCE LINE # 96
MOV R7,#0EH
; write_byte(0xcc);
; SOURCE LINE # 97
LCALL L?0023
; write_byte(0xBE); /* 发送读memory命令 */
; SOURCE LINE # 98
MOV R7,#0BEH
LCALL _write_byte
; lsb =read_byte();
; SOURCE LINE # 99
LCALL read_byte
;---- Variable 'lsb?447' assigned to Register 'R2' ----
MOV R2,AR7
; msb =read_byte();
; SOURCE LINE # 100
LCALL read_byte
;---- Variable 'msb?446' assigned to Register 'R5' ----
MOV R5,AR7
; reset();
; SOURCE LINE # 101
LCALL reset
; if((msb&0xF0)>0) { flag=1;msb=~msb; lsb=~lsb+1;}//如果为负温度取反加1
; SOURCE LINE # 102
MOV A,R5
ANL A,#0F0H
SETB C
SUBB A,#00H
JC ?C0015
SETB flag
XRL AR5,#0FFH
MOV A,R2
CPL A
INC A
MOV R2,A
SJMP ?C0016
?C0015:
; else flag=0;
; SOURCE LINE # 103
CLR flag
?C0016:
; table[0]=(msb<<4)|(lsb&0>>4);
; SOURCE LINE # 104
MOV A,R5
SWAP A
ANL A,#0F0H
MOV table,A
; table[1]=((lsb<<4)*5)/128;// 小数点后两位.可做到后4位即0.0625为单位
; SOURCE LINE # 105
MOV A,R2
SWAP A
ANL A,#0F0H
MOV B,#05H
MUL AB
MOV R7,A
SWAP A
RRC A
RRC A
RRC A
ANL A,#01H
MOV table+01H,A
; }
; SOURCE LINE # 106
RET
; END OF get_temperature
;
; main ()
RSEG ?PR?main?18BB20
main:
USING 0
; SOURCE LINE # 108
; {
; SOURCE LINE # 109
; get_temperature();
; SOURCE LINE # 110
LCALL get_temperature
?C0018:
; while(1)
; SOURCE LINE # 111
; {
; SOURCE LINE # 112
; get_temperature();
; SOURCE LINE # 113
LCALL get_temperature
; if (flag)
; SOURCE LINE # 114
; {
; SOURCE LINE # 115
; ;
; }
; SOURCE LINE # 117
?C0020:
;
; delay(10000);
; SOURCE LINE # 119
MOV R7,#010H
MOV R6,#027H
LCALL _delay
; }
; SOURCE LINE # 120
SJMP ?C0018
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -