📄 ds18b20.src
字号:
; .\ds18b20.SRC generated from: ds18b20.c
; COMPILER INVOKED BY:
; E:\Program Files\C51\BIN\C51.EXE ds18b20.c BROWSE DEBUG OBJECTEXTEND SRC(.\ds18b20.SRC)
$NOMOD51
NAME DS18B20
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 090H.4
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
addr0 BIT 090H.4
EX0 BIT 0A8H.0
IT0 BIT 088H.0
TH1 DATA 08DH
addr1 BIT 090H.5
TB8 BIT 098H.3
EX1 BIT 0A8H.2
IT1 BIT 088H.2
TH2 DATA 0CDH
addr2 BIT 090H.6
P BIT 0D0H.0
addr3 BIT 090H.7
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?DS18B20 SEGMENT CODE
?PR?reset?DS18B20 SEGMENT CODE
?PR?readbyte?DS18B20 SEGMENT CODE
?PR?_writebyte?DS18B20 SEGMENT CODE
?PR?readtemp?DS18B20 SEGMENT CODE
?PR?vLedKey_Scan?DS18B20 SEGMENT CODE
?PR?main?DS18B20 SEGMENT CODE
?DT?main?DS18B20 SEGMENT DATA OVERLAYABLE
?CO?DS18B20 SEGMENT CODE
?DT?DS18B20 SEGMENT DATA
EXTRN CODE (?C_STARTUP)
EXTRN CODE (?C?FCASTC)
EXTRN CODE (?C?FPMUL)
EXTRN CODE (?C?CASTF)
PUBLIC dispbuf
PUBLIC temper
PUBLIC table
PUBLIC scan
PUBLIC main
PUBLIC vLedKey_Scan
PUBLIC readtemp
PUBLIC _writebyte
PUBLIC readbyte
PUBLIC reset
PUBLIC _delay
RSEG ?DT?main?DS18B20
?main?BYTE:
backbit?652: DS 4
RSEG ?DT?DS18B20
temper: DS 2
dispbuf: DS 8
RSEG ?CO?DS18B20
scan:
DB 0FEH
DB 0FDH
DB 0FBH
DB 0F7H
DB 0EFH
DB 0DFH
DB 0BFH
DB 07FH
table:
DB 0C0H
DB 0F9H
DB 0A4H
DB 0B0H
DB 099H
DB 092H
DB 082H
DB 0F8H
DB 080H
DB 090H
DB 088H
DB 083H
DB 0C6H
DB 0A1H
DB 086H
DB 08EH
DB 0BFH
DB 0FFH
; /*****************************************************************/
; /* */
; /*名称: 测温+显示程序 */
; /*功能: 读取当前18B20温度,由数码管显示出来。 */
; /*难度等级: 中 */
; /* 作者: zengrenliang */
; /* 版权: http://www.51kaifa.com */
; /*编写日期: 2006.05.19 */
; /*****************************************************************/
;
;
; #include<reg52.h>
; #define uchar unsigned char
;
; sbit DQ =P1^4;//18B20数据线引脚
;
; sbit addr0 = P1^4;//系统片选地址线0
; sbit addr1 = P1^5;//系统片选地址线1
; sbit addr2 = P1^6;//系统片选地址线2
; sbit addr3 = P1^7;//系统片选地址线3
; //行扫描数组
; uchar code scan[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//row0--row7
; //数码管显示的段码表
; uchar code table[18] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,//0,1,2,3,4,5
; 0x82,0xf8,0x80,0x90,0x88,0x83,//6,7,8,9,a,b
; 0xc6,0xa1,0x86,0x8e,0xbf,0xff};//c,d,e,f,-,空格
;
; uchar dispbuf[8]; //显示缓冲区
; uchar temper[2];//存放温度的数组
;
; /*****************************延时函数**************************/
;
; void delay (unsigned int us)
RSEG ?PR?_delay?DS18B20
_delay:
USING 0
; SOURCE LINE # 33
;---- Variable 'us?040' assigned to Register 'R6/R7' ----
; {
; SOURCE LINE # 34
?C0001:
; while(us--);
; SOURCE LINE # 35
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0026
DEC R6
?C0026:
ORL A,R4
JNZ ?C0001
; }
; SOURCE LINE # 36
?C0003:
RET
; END OF _delay
;
; void reset(void) //复位
RSEG ?PR?reset?DS18B20
reset:
USING 0
; SOURCE LINE # 38
; {
; SOURCE LINE # 39
; uchar x=0;
; SOURCE LINE # 40
;---- Variable 'x?141' assigned to Register 'R7' ----
CLR A
; DQ = 1;
; SOURCE LINE # 41
SETB DQ
; delay(8); //稍做延时
; SOURCE LINE # 42
MOV R7,#08H
MOV R6,A
LCALL _delay
; DQ = 0;
; SOURCE LINE # 43
CLR DQ
; delay(80); //精确延时 大于 480us
; SOURCE LINE # 44
MOV R7,#050H
MOV R6,#00H
LCALL _delay
; DQ = 1; //拉高总线
; SOURCE LINE # 45
SETB DQ
; delay(14);
; SOURCE LINE # 46
MOV R7,#0EH
MOV R6,#00H
LCALL _delay
; x=DQ;
; SOURCE LINE # 47
MOV C,DQ
; delay(20);
; SOURCE LINE # 48
MOV R7,#014H
MOV R6,#00H
LJMP _delay
; END OF reset
; }
; /**********************从DS18B20读一字节***************/
; uchar readbyte(void) //读1字节
RSEG ?PR?readbyte?DS18B20
readbyte:
USING 0
; SOURCE LINE # 51
; {
; SOURCE LINE # 52
; uchar i=0;
; SOURCE LINE # 53
;---- Variable 'i?242' assigned to Register 'R5' ----
CLR A
; uchar dat=0;
; SOURCE LINE # 54
;---- Variable 'dat?243' assigned to Register 'R3' ----
MOV R3,A
; for (i=8;i>0;i--)
; SOURCE LINE # 55
MOV R5,#08H
?C0005:
; {
; SOURCE LINE # 56
; DQ = 0;
; SOURCE LINE # 57
CLR DQ
; dat>>=1;
; SOURCE LINE # 58
MOV A,R3
CLR C
RRC A
MOV R3,A
; DQ = 1;
; SOURCE LINE # 59
SETB DQ
; if(DQ)
; SOURCE LINE # 60
JNB DQ,?C0008
; dat|=0x80;
; SOURCE LINE # 61
ORL AR3,#080H
?C0008:
; delay(4);
; SOURCE LINE # 62
MOV R7,#04H
MOV R6,#00H
LCALL _delay
; }
; SOURCE LINE # 63
DJNZ R5,?C0005
?C0006:
; return(dat);
; SOURCE LINE # 64
MOV R7,AR3
; }
; SOURCE LINE # 65
?C0009:
RET
; END OF readbyte
; /***********************向DS18B20写一字节***********************/
; void writebyte(unsigned char dat) //写1字节
RSEG ?PR?_writebyte?DS18B20
_writebyte:
USING 0
; SOURCE LINE # 67
;---- Variable 'dat?344' assigned to Register 'R5' ----
MOV R5,AR7
; {
; SOURCE LINE # 68
; uchar i=0;
; SOURCE LINE # 69
;---- Variable 'i?345' assigned to Register 'R3' ----
; for (i=8; i>0; i--)
; SOURCE LINE # 70
MOV R3,#08H
?C0010:
; {
; SOURCE LINE # 71
; DQ = 0;
; SOURCE LINE # 72
CLR DQ
; DQ = dat&0x01;
; SOURCE LINE # 73
MOV A,R5
RRC A
MOV DQ,C
; delay(5);
; SOURCE LINE # 74
MOV R7,#05H
MOV R6,#00H
LCALL _delay
; DQ = 1;
; SOURCE LINE # 75
SETB DQ
; dat>>=1;
; SOURCE LINE # 76
MOV A,R5
CLR C
RRC A
MOV R5,A
; }
; SOURCE LINE # 77
DJNZ R3,?C0010
?C0011:
; delay(4);
; SOURCE LINE # 78
MOV R7,#04H
MOV R6,#00H
LJMP _delay
; END OF _writebyte
; }
; /***********************CPU读取温度值***************************/
; void readtemp(void) //读取温度
RSEG ?PR?readtemp?DS18B20
readtemp:
USING 0
; SOURCE LINE # 81
; {
; SOURCE LINE # 82
; uchar a=0,b=0;
; SOURCE LINE # 83
;---- Variable 'a?446' assigned to Register 'R2' ----
CLR A
MOV R2,A
;---- Variable 'b?447' assigned to Register 'R7' ----
MOV R7,A
; reset();
; SOURCE LINE # 84
LCALL reset
; writebyte(0xCC); // 跳过序列号
; SOURCE LINE # 85
MOV R7,#0CCH
LCALL _writebyte
; writebyte(0x44); // 启动温度转换
; SOURCE LINE # 86
MOV R7,#044H
LCALL _writebyte
; reset();
; SOURCE LINE # 87
LCALL reset
; writebyte(0xCC);
; SOURCE LINE # 88
MOV R7,#0CCH
LCALL _writebyte
; writebyte(0xBE); //读9个寄存器,前两个为温度
; SOURCE LINE # 89
MOV R7,#0BEH
LCALL _writebyte
; a=readbyte(); //低位
; SOURCE LINE # 90
LCALL readbyte
MOV R2,AR7
; b=readbyte(); //高位
; SOURCE LINE # 91
LCALL readbyte
; temper[0]=a&0x0f;
; SOURCE LINE # 92
MOV A,R2
ANL A,#0FH
MOV temper,A
; a=a>>4; //低位右移4位,舍弃小数部分
; SOURCE LINE # 93
MOV A,R2
SWAP A
ANL A,#0FH
MOV R2,A
; temper[1]=b<<4; //高位左移4位,舍弃符号位
; SOURCE LINE # 94
MOV A,R7
SWAP A
ANL A,#0F0H
MOV temper+01H,A
; temper[1]=temper[1]|a;
; SOURCE LINE # 95
MOV A,R2
ORL temper+01H,A
; }
; SOURCE LINE # 96
RET
; END OF readtemp
;
; /******************************显示+读键*************************/
;
; void vLedKey_Scan()
RSEG ?PR?vLedKey_Scan?DS18B20
vLedKey_Scan:
USING 0
; SOURCE LINE # 100
;---- Variable 'value?549' assigned to Register 'R5' ----
; { unsigned char i,value;
; SOURCE LINE # 101
;
; for(i=0;i<8;i++){
; SOURCE LINE # 103
;---- Variable 'i?548' assigned to Register 'R3' ----
CLR A
MOV R3,A
?C0015:
; addr3 = 0;
; SOURCE LINE # 104
CLR addr3
; addr0 = 0;
; SOURCE LINE # 105
CLR addr0
; addr1 = 1;
; SOURCE LINE # 106
SETB addr1
; addr2 = 0;//开发板上U4(74HC574)的片选地址
; SOURCE LINE # 107
CLR addr2
; value =table[dispbuf[i]]; //取一行显示数据
; SOURCE LINE # 108
MOV A,#LOW (dispbuf)
ADD A,R3
MOV R0,A
MOV A,@R0
MOV DPTR,#table
MOVC A,@A+DPTR
MOV R5,A
; if(i==3)
; SOURCE LINE # 109
CJNE R3,#03H,?C0018
; value &= 0x7f;
; SOURCE LINE # 110
ANL AR5,#07FH
?C0018:
; P0 = value;
; SOURCE LINE # 111
MOV P0,R5
; addr3 = 1;
; SOURCE LINE # 112
SETB addr3
; addr3 = 0;//在U4的11脚(锁存信号)产生上升沿
; SOURCE LINE # 113
CLR addr3
; P2 = scan[i];//取row0--row7行扫描数据
; SOURCE LINE # 114
MOV A,R3
MOV DPTR,#scan
MOVC A,@A+DPTR
MOV P2,A
; delay(50); //延时50us
; SOURCE LINE # 115
MOV R7,#032H
MOV R6,#00H
LCALL _delay
; P2 = 0xff;//关显示
; SOURCE LINE # 116
MOV P2,#0FFH
; }
; SOURCE LINE # 117
INC R3
CJNE R3,#08H,?C0015
; }
; SOURCE LINE # 118
?C0019:
RET
; END OF vLedKey_Scan
;
; /*******************************主函数***********************/
;
; main()
RSEG ?PR?main?DS18B20
main:
USING 0
; SOURCE LINE # 122
; { uchar i;
; SOURCE LINE # 123
; uchar temp;
; float backbit;
; for(i=0;i<8;i++)
; SOURCE LINE # 126
;---- Variable 'i?650' assigned to Register 'R7' ----
?C0020:
; dispbuf[i] = 17;
; SOURCE LINE # 127
MOV R7,#08H
MOV R0,#LOW (dispbuf)
MOV A,#011H
?C0027:
MOV @R0,A
INC R0
DJNZ R7,?C0027
MOV R7,#08H
?C0023:
; while(1){
; SOURCE LINE # 128
; vLedKey_Scan(); //显示,读键扫描
; SOURCE LINE # 129
LCALL vLedKey_Scan
;
; readtemp();//读18B20
; SOURCE LINE # 131
LCALL readtemp
; backbit = temper[0];//换成浮点数
; SOURCE LINE # 132
MOV R4,temper
CLR A
LCALL ?C?FCASTC
MOV backbit?652+03H,R7
MOV backbit?652+02H,R6
MOV backbit?652+01H,R5
MOV backbit?652,R4
; backbit = backbit * 6.25;//乘以0.0625*100
; SOURCE LINE # 133
CLR A
MOV R3,A
MOV R2,A
MOV R1,#0C8H
MOV R0,#040H
LCALL ?C?FPMUL
MOV backbit?652+03H,R7
MOV backbit?652+02H,R6
MOV backbit?652+01H,R5
MOV backbit?652,R4
; temp = backbit;//取低2位整数部分
; SOURCE LINE # 134
LCALL ?C?CASTF
;---- Variable 'temp?651' assigned to Register 'R7' ----
; dispbuf[5] = temp%10 ;
; SOURCE LINE # 135
MOV A,R7
MOV B,#0AH
DIV AB
MOV dispbuf+05H,B
;
; temp = temp/10;
; SOURCE LINE # 137
MOV A,R7
MOV B,#0AH
DIV AB
; dispbuf[4] = temp%10 ;
; SOURCE LINE # 138
MOV B,#0AH
DIV AB
MOV dispbuf+04H,B
;
; temp = temper[1];//取整数部分
; SOURCE LINE # 140
MOV R7,temper+01H
; dispbuf[3] = temp%10;
; SOURCE LINE # 141
MOV A,R7
MOV B,#0AH
DIV AB
MOV dispbuf+03H,B
;
; temp = temp/10;
; SOURCE LINE # 143
MOV A,R7
MOV B,#0AH
DIV AB
MOV R7,A
; dispbuf[2]= temp%10;
; SOURCE LINE # 144
MOV B,#0AH
DIV AB
MOV dispbuf+02H,B
; }
; SOURCE LINE # 145
SJMP ?C0023
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -