📄 12864.lis
字号:
017A L34:
017A .dbline 38
017A ; while(IN_DQ); //等待应答,即等待低电平信号
017A L35:
017A .dbline 38
017A 8099 sbic 0x10,0
017C FECF rjmp L34
017E X9:
017E .dbline 39
017E ; delay_us(80);
017E 00E5 ldi R16,80
0180 10E0 ldi R17,0
0182 3EDF rcall _delay_us
0184 .dbline 40
0184 ; SET_OUT; //设置输出
0184 889A sbi 0x11,0
0186 .dbline 41
0186 ; SET_DQ; //输出高电平
0186 909A sbi 0x12,0
0188 .dbline 42
0188 ; delay_us(80); //60~240us
0188 00E5 ldi R16,80
018A 10E0 ldi R17,0
018C 39DF rcall _delay_us
018E .dbline -2
018E L33:
018E .dbline 0 ; func end
018E 0895 ret
0190 .dbend
0190 .dbfunc e write_1820 _write_1820 fV
0190 ; m -> R20
0190 ; x -> R10
.even
0190 _write_1820::
0190 AA92 st -y,R10
0192 4A93 st -y,R20
0194 A02E mov R10,R16
0196 .dbline -1
0196 .dbline 51
0196 ; }
0196 ; /*---------------------------------------------------------------------
0196 ; 函数名称:void write_1820(unsigned char x)
0196 ; 函数功能: 写18B20温度
0196 ; 参 数: x
0196 ; 返 回 值:
0196 ; ---------------------------------------------------------------------*/
0196 ; void write_1820(unsigned char x) //下降沿写数据
0196 ; {
0196 .dbline 54
0196 ; unsigned char m;
0196 ; //SET_DQ;
0196 ; for(m=0;m<8;m++)
0196 4427 clr R20
0198 12C0 rjmp L41
019A L38:
019A .dbline 55
019A ; {
019A .dbline 56
019A ; CL_DQ; //写数据,从低位开始
019A 9098 cbi 0x12,0
019C .dbline 57
019C ; if(x&(1<<m)) //判断数据极性
019C 01E0 ldi R16,1
019E 142F mov R17,R20
01A0 00D0 rcall lsl8
01A2 2A2C mov R2,R10
01A4 2022 and R2,R16
01A6 11F0 breq L42
01A8 X10:
01A8 .dbline 58
01A8 ; SET_DQ;
01A8 909A sbi 0x12,0
01AA 01C0 rjmp L43
01AC L42:
01AC .dbline 60
01AC ; else
01AC ; CL_DQ;
01AC 9098 cbi 0x12,0
01AE L43:
01AE .dbline 61
01AE ; delay_us(40); //延时15~60us
01AE 08E2 ldi R16,40
01B0 10E0 ldi R17,0
01B2 26DF rcall _delay_us
01B4 .dbline 62
01B4 ; SET_DQ;
01B4 909A sbi 0x12,0
01B6 .dbline 63
01B6 ; delay_us(1); //连续写两位数据的间隔要大于1us
01B6 01E0 ldi R16,1
01B8 10E0 ldi R17,0
01BA 22DF rcall _delay_us
01BC .dbline 64
01BC ; }
01BC L39:
01BC .dbline 54
01BC 4395 inc R20
01BE L41:
01BE .dbline 54
01BE 4830 cpi R20,8
01C0 60F3 brlo L38
01C2 X11:
01C2 .dbline 65
01C2 ; SET_DQ; //结束写数据,置高总线
01C2 909A sbi 0x12,0
01C4 .dbline -2
01C4 L37:
01C4 .dbline 0 ; func end
01C4 4991 ld R20,y+
01C6 A990 ld R10,y+
01C8 0895 ret
01CA .dbsym r m 20 c
01CA .dbsym r x 10 c
01CA .dbend
01CA .dbfunc e read_1820 _read_1820 fc
01CA ; temp -> R10
01CA ; k -> R22
01CA ; n -> R20
.even
01CA _read_1820::
01CA 00D0 rcall push_xgsetF00C
01CC .dbline -1
01CC .dbline 74
01CC ; }
01CC ; /*---------------------------------------------------------------------
01CC ; 函数名称:unsigned char read_1820(void)
01CC ; 函数功能: 读取18B20温度
01CC ; 参 数:
01CC ; 返 回 值: count
01CC ; ---------------------------------------------------------------------*/
01CC ; unsigned char read_1820(void) //上升沿读数据
01CC ; {
01CC .dbline 75
01CC ; unsigned char temp=0,k,n;
01CC AA24 clr R10
01CE .dbline 76
01CE ; for(n=0;n<8;n++)
01CE 4427 clr R20
01D0 1DC0 rjmp L48
01D2 L45:
01D2 .dbline 77
01D2 ; {
01D2 .dbline 78
01D2 ; CL_DQ; //输出一个起始脉冲
01D2 9098 cbi 0x12,0
01D4 .dbline 79
01D4 ; delay_us(1); //保持1us
01D4 01E0 ldi R16,1
01D6 10E0 ldi R17,0
01D8 13DF rcall _delay_us
01DA .dbline 80
01DA ; SET_DQ;
01DA 909A sbi 0x12,0
01DC .dbline 81
01DC ; SET_IN; //设端口为输入
01DC 8898 cbi 0x11,0
01DE .dbline 82
01DE ; k=IN_DQ; //读数据,从低位开始
01DE 60B3 in R22,0x10
01E0 6170 andi R22,1
01E2 .dbline 83
01E2 ; delay_us(1);
01E2 01E0 ldi R16,1
01E4 10E0 ldi R17,0
01E6 0CDF rcall _delay_us
01E8 .dbline 84
01E8 ; if(k) //判断数据极性
01E8 6623 tst R22
01EA 29F0 breq L49
01EC X12:
01EC .dbline 85
01EC ; temp|=(1<<n);
01EC 01E0 ldi R16,1
01EE 142F mov R17,R20
01F0 00D0 rcall lsl8
01F2 A02A or R10,R16
01F4 06C0 rjmp L50
01F6 L49:
01F6 .dbline 87
01F6 ; else
01F6 ; temp&=~(1<<n);
01F6 01E0 ldi R16,1
01F8 142F mov R17,R20
01FA 00D0 rcall lsl8
01FC 202E mov R2,R16
01FE 2094 com R2
0200 A220 and R10,R2
0202 L50:
0202 .dbline 88
0202 ; delay_us(60); //延时60~120us
0202 0CE3 ldi R16,60
0204 10E0 ldi R17,0
0206 FCDE rcall _delay_us
0208 .dbline 89
0208 ; SET_OUT; //设端口为输出
0208 889A sbi 0x11,0
020A .dbline 90
020A ; }
020A L46:
020A .dbline 76
020A 4395 inc R20
020C L48:
020C .dbline 76
020C 4830 cpi R20,8
020E 08F3 brlo L45
0210 X13:
0210 .dbline 91
0210 ; return (temp); //返回读出的数据
0210 0A2D mov R16,R10
0212 .dbline -2
0212 L44:
0212 .dbline 0 ; func end
0212 00C0 rjmp pop_xgsetF00C
0214 .dbsym r temp 10 c
0214 .dbsym r k 22 c
0214 .dbsym r n 20 c
0214 .dbend
0214 .dbfunc e Read_1820_temperature _Read_1820_temperature fV
0214 ; teml -> R12
0214 ; temh -> R14
0214 ; count -> R10,R11
.even
0214 _Read_1820_temperature::
0214 00D0 rcall push_xgset00FC
0216 .dbline -1
0216 .dbline 100
0216 ; }
0216 ; /*---------------------------------------------------------------------
0216 ; 函数名称:unsigned int Read_1820_temperature(void)
0216 ; 函数功能: 读取18B20温度,计算
0216 ; 参 数:
0216 ; 返 回 值: count
0216 ; ---------------------------------------------------------------------*/
0216 ; void Read_1820_temperature(void)
0216 ; {
0216 .dbline 103
0216 ; unsigned int count;
0216 ; unsigned char temh,teml;
0216 ; init_1820(); //复位18b20
0216 A6DF rcall _init_1820
0218 .dbline 104
0218 ; write_1820(0xcc); //跳过ROM
0218 0CEC ldi R16,204
021A BADF rcall _write_1820
021C .dbline 105
021C ; write_1820(0x44); //发出温度转换命令
021C 04E4 ldi R16,68
021E B8DF rcall _write_1820
0220 .dbline 106
0220 ; delay_ms(750);
0220 0EEE ldi R16,750
0222 12E0 ldi R17,2
0224 F5DE rcall _delay_ms
0226 .dbline 107
0226 ; init_1820();
0226 9EDF rcall _init_1820
0228 .dbline 108
0228 ; write_1820(0xcc); //发出读命令
0228 0CEC ldi R16,204
022A B2DF rcall _write_1820
022C .dbline 109
022C ; write_1820(0xbe);
022C 0EEB ldi R16,190
022E B0DF rcall _write_1820
0230 .dbline 110
0230 ; teml=read_1820(); //读数据
0230 CCDF rcall _read_1820
0232 C02E mov R12,R16
0234 .dbline 111
0234 ; temh=read_1820();
0234 CADF rcall _read_1820
0236 E02E mov R14,R16
0238 .dbline 112
0238 ; temp_data[0]=read_1820();
0238 C8DF rcall _read_1820
023A A02E mov R10,R16
023C A0920200 sts _temp_data,R10
0240 .dbline 113
0240 ; temp_data[1]=read_1820();
0240 C4DF rcall _read_1820
0242 A02E mov R10,R16
0244 A0920300 sts _temp_data+1,R10
0248 .dbline 114
0248 ; count=temh<<8+teml;
0248 2C2D mov R18,R12
024A 3327 clr R19
024C 285F subi R18,248 ; offset = 8
024E 3F4F sbci R19,255
0250 0E2D mov R16,R14
0252 1127 clr R17
0254 00D0 rcall lsl16
0256 5801 movw R10,R16
0258 .dbline 115
0258 ; count=count*0.0625;
0258 00E0 ldi R16,<L53
025A 10E0 ldi R17,>L53
025C 00D0 rcall lpm32
025E 1801 movw R2,R16
0260 2901 movw R4,R18
0262 8501 movw R16,R10
0264 00D0 rcall uint2fp
0266 3A93 st -y,R19
0268 2A93 st -y,R18
026A 1A93 st -y,R17
026C 0A93 st -y,R16
026E 8101 movw R16,R2
0270 9201 movw R18,R4
0272 00D0 rcall fpmule2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -