📄 ds18b20.src
字号:
; SOURCE LINE # 84
?C0009:
; while(i--);
; SOURCE LINE # 85
MOV A,R7
DEC R7
MOV R4,AR6
JNZ ?C0027
DEC R6
?C0027:
ORL A,R4
JNZ ?C0009
; }
; SOURCE LINE # 86
?C0011:
RET
; END OF _delay_18B20
;
;
; /*DS18B20的复位脉冲 主机通过拉低单总线至少480us以产生复位脉冲
; 然后主机释放单总线并进入接收模式 此时单总线电平被拉高
; DS18B20检测到上升沿后 延时15~60us,拉低总线60~240us产生应答脉冲 */
; void Init_DS18B20(void)
RSEG ?PR?Init_DS18B20?DS18B20
Init_DS18B20:
USING 0
; SOURCE LINE # 92
; {
; SOURCE LINE # 93
; unsigned char x=0;
; SOURCE LINE # 94
;---- Variable 'x?546' assigned to Register 'R5' ----
CLR A
MOV R5,A
; DQ = 1; //DQ复位
; SOURCE LINE # 95
SETB DQ
; delay_18B20(8); //稍做延时
; SOURCE LINE # 96
MOV R7,#08H
MOV R6,A
LCALL _delay_18B20
; DQ = 0; //单片机将DQ拉低
; SOURCE LINE # 97
CLR DQ
; delay_18B20(80); //精确延时 大于 480us
; SOURCE LINE # 98
MOV R7,#050H
MOV R6,#00H
LCALL _delay_18B20
; DQ = 1; //拉高总线
; SOURCE LINE # 99
SETB DQ
; delay_18B20(14);
; SOURCE LINE # 100
MOV R7,#0EH
MOV R6,#00H
LCALL _delay_18B20
; x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
; SOURCE LINE # 101
MOV C,DQ
CLR A
RLC A
MOV R5,A
; delay_18B20(20);
; SOURCE LINE # 102
MOV R7,#014H
MOV R6,#00H
LJMP _delay_18B20
; END OF Init_DS18B20
; }
;
; /*写时隙 主机在写1时隙向DS18B20写入1,在写0时隙向DS18B20写入0
; 所有写时隙至少需要60us,且在两次写时隙之间至少需要1us的恢复时间
; 两种写时隙均以主机拉低总线开始
; 产生写1时隙:主机拉低总线后,必须在15us内释放总线,由上拉电阻拉回至高电平
; 产生写0时隙:主机拉低总线后,必须整个时隙保持低电平 */
; void WriteOneChar(unsigned char dat)
RSEG ?PR?_WriteOneChar?DS18B20
_WriteOneChar:
USING 0
; SOURCE LINE # 110
;---- Variable 'dat?647' assigned to Register 'R5' ----
MOV R5,AR7
; {
; SOURCE LINE # 111
; unsigned char i=0;
; SOURCE LINE # 112
;---- Variable 'i?648' assigned to Register 'R3' ----
; for (i=8; i>0; i--)
; SOURCE LINE # 113
MOV R3,#08H
?C0013:
; {
; SOURCE LINE # 114
; DQ = 0;
; SOURCE LINE # 115
CLR DQ
; DQ = dat&0x01;
; SOURCE LINE # 116
MOV A,R5
RRC A
MOV DQ,C
; delay_18B20(5);
; SOURCE LINE # 117
MOV R7,#05H
MOV R6,#00H
LCALL _delay_18B20
; DQ = 1;
; SOURCE LINE # 118
SETB DQ
; dat>>=1;
; SOURCE LINE # 119
MOV A,R5
CLR C
RRC A
MOV R5,A
; }
; SOURCE LINE # 120
DJNZ R3,?C0013
; }
; SOURCE LINE # 121
?C0016:
RET
; END OF _WriteOneChar
;
; /*所有读时隙至少60us 且两次独立的读时隙之间至少需要1us的恢复时间
; 每次读时隙由主机发起,拉低总线至少1us。
; 若传1,则保持总线高电平;若发送0,则拉低总线
; 传0时DS18B20在该时隙结束时释放总线,再拉回高电平状态,主机必须在读时隙开始后的15us内释放总线,并保持采样总线状态 */
; unsigned char ReadOneChar(void)
RSEG ?PR?ReadOneChar?DS18B20
ReadOneChar:
USING 0
; SOURCE LINE # 127
; {
; SOURCE LINE # 128
; unsigned char i=0;
; SOURCE LINE # 129
;---- Variable 'i?749' assigned to Register 'R5' ----
CLR A
; unsigned char dat = 0;
; SOURCE LINE # 130
;---- Variable 'dat?750' assigned to Register 'R3' ----
MOV R3,A
; for (i=8;i>0;i--)
; SOURCE LINE # 131
MOV R5,#08H
?C0017:
; {
; SOURCE LINE # 132
; DQ = 0; // 给脉冲信号
; SOURCE LINE # 133
CLR DQ
; dat>>=1;
; SOURCE LINE # 134
MOV A,R3
CLR C
RRC A
MOV R3,A
; DQ = 1; // 给脉冲信号
; SOURCE LINE # 135
SETB DQ
; if(DQ)
; SOURCE LINE # 136
JNB DQ,?C0020
; dat|=0x80;
; SOURCE LINE # 137
ORL AR3,#080H
?C0020:
; delay_18B20(4);
; SOURCE LINE # 138
MOV R7,#04H
MOV R6,#00H
LCALL _delay_18B20
; }
; SOURCE LINE # 139
DJNZ R5,?C0017
?C0018:
; return(dat);
; SOURCE LINE # 140
MOV R7,AR3
; }
; SOURCE LINE # 141
?C0021:
RET
; END OF ReadOneChar
;
;
; void read_18B20(void)
RSEG ?PR?read_18B20?DS18B20
read_18B20:
USING 0
; SOURCE LINE # 144
; {
; SOURCE LINE # 145
;
; Init_DS18B20();
; SOURCE LINE # 147
LCALL Init_DS18B20
; WriteOneChar(0xCC); // 跳过读序号列号的操作
; SOURCE LINE # 148
MOV R7,#0CCH
LCALL _WriteOneChar
; WriteOneChar(0x44); // 启动温度转换
; SOURCE LINE # 149
MOV R7,#044H
;
; delay_18B20(100); // this message is wery important
; SOURCE LINE # 151
LCALL L?0029
;
; Init_DS18B20();
; SOURCE LINE # 153
LCALL Init_DS18B20
; WriteOneChar(0xCC); //跳过读序号列号的操作
; SOURCE LINE # 154
MOV R7,#0CCH
LCALL _WriteOneChar
; WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
; SOURCE LINE # 155
MOV R7,#0BEH
;
; delay_18B20(100);
; SOURCE LINE # 157
LCALL L?0029
;
; L_18B20=ReadOneChar(); //读取低八位数据
; SOURCE LINE # 159
LCALL ReadOneChar
MOV L_18B20,R7
; H_18B20=ReadOneChar(); //读取高八位数据
; SOURCE LINE # 160
LCALL ReadOneChar
MOV H_18B20,R7
;
; zhengshu=L_18B20/16+H_18B20*16; //整数部分
; SOURCE LINE # 162
MOV A,L_18B20
SWAP A
ANL A,#0FH
MOV R5,A
MOV R4,#00H
MOV A,R7
MOV B,#010H
MUL AB
MOV R6,B
ADD A,R5
MOV zhengshu+01H,A
MOV A,R4
ADDC A,R6
MOV zhengshu,A
; xiaoshu_a=(L_18B20&0x0f)*10/16; //小数第一位
; SOURCE LINE # 163
MOV A,L_18B20
ANL A,#0FH
MOV B,#0AH
MUL AB
MOV R7,A
MOV A,B
SWAP A
MOV R0,A
ANL A,#0F0H
XCH A,R0
XRL A,R0
MOV xiaoshu_a,A
MOV A,R7
SWAP A
ANL A,#0FH
ORL A,R0
MOV xiaoshu_a+01H,A
; }
; SOURCE LINE # 164
RET
; END OF read_18B20
;
;
; /*------MAIN------*/
; void main(void)
RSEG ?PR?main?DS18B20
main:
USING 0
; SOURCE LINE # 168
; {
; SOURCE LINE # 169
; write_command(56);
; SOURCE LINE # 170
MOV R7,#038H
MOV R6,#00H
LCALL _write_command
; write_command(12);
; SOURCE LINE # 171
MOV R7,#0CH
LCALL _write_command
; write_command(6);
; SOURCE LINE # 172
MOV R7,#06H
LCALL _write_command
; write_command(1);
; SOURCE LINE # 173
MOV R7,#01H
LCALL _write_command
; write_command(2);
; SOURCE LINE # 174
INC R7
LCALL _write_command
; display_string(1,0," Temprature:");
; SOURCE LINE # 175
MOV R3,#0FFH
MOV R2,#HIGH (?SC_0)
MOV R1,#LOW (?SC_0)
CLR A
MOV R5,A
MOV R4,A
DEC R7
LCALL _display_string
?C0025:
; do{read_18B20();
; SOURCE LINE # 176
LCALL read_18B20
; write_command(192);
; SOURCE LINE # 177
MOV R7,#0C0H
MOV R6,#00H
LCALL _write_command
; write_data((0x30|(zhengshu/10)));
; SOURCE LINE # 178
MOV R6,zhengshu
MOV R7,zhengshu+01H
MOV R4,#00H
MOV R5,#0AH
LCALL ?C?UIDIV
LCALL L?0030
; write_data((0x30|(zhengshu-(zhengshu/10)*10)));
; SOURCE LINE # 179
MOV R6,zhengshu
MOV R7,zhengshu+01H
MOV R4,#00H
MOV R5,#0AH
LCALL ?C?UIDIV
MOV R4,#00H
MOV R5,#0AH
LCALL ?C?IMUL
CLR C
MOV A,zhengshu+01H
SUBB A,R7
MOV R7,A
MOV A,zhengshu
SUBB A,R6
MOV R6,A
LCALL L?0030
; write_data(0x2e);
; SOURCE LINE # 180
MOV R7,#02EH
MOV R6,#00H
LCALL _write_data
; write_data(0x30|xiaoshu_a);
; SOURCE LINE # 181
MOV R6,xiaoshu_a
MOV A,xiaoshu_a+01H
ORL A,#030H
MOV R7,A
LCALL _write_data
; }
; SOURCE LINE # 182
; while(1);
; SOURCE LINE # 183
SJMP ?C0025
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -