📄 18b20.lis
字号:
.module _18b20.c
.area text(rom, con, rel)
0000 .dbfile C:\DOCUME~1\administrator\桌面\教程\18B20\18b20.c
0000 .dbfunc e init_1820 _init_1820 fV
.even
0000 _init_1820::
0000 .dbline -1
0000 .dbline 12
0000 ; /**************************************
0000 ; ** Filename: 18b20.c
0000 ; ** Describe: 18b20 温度传感器
0000 ; ** Author : 古欣 www.avrvi.com
0000 ; ** Time : 2007-2-15
0000 ; **************************************/
0000 ;
0000 ; #include "config.h"
0000 ;
0000 ; unsigned char wmh,wml,flag,count; //flag温度为负标志,count为实际温度
0000 ; void init_1820(void)
0000 ; {
0000 .dbline 13
0000 ; SET_DIR_1WIRE; //设置PC2 为输出
0000 BC9A sbi 0x17,4
0002 .dbline 14
0002 ; SET_OP_1WIRE;
0002 C49A sbi 0x18,4
0004 .dbline 15
0004 ; CLR_OP_1WIRE;
0004 C498 cbi 0x18,4
0006 .dbline 16
0006 ; delay_us(480); //480us以上
0006 00EE ldi R16,480
0008 11E0 ldi R17,1
000A 0E940000 xcall _delay_us
000E .dbline 17
000E ; SET_OP_1WIRE;
000E C49A sbi 0x18,4
0010 .dbline 18
0010 ; CLR_DIR_1WIRE;
0010 BC98 cbi 0x17,4
0012 .dbline 19
0012 ; delay_us(20); //15~60us
0012 04E1 ldi R16,20
0014 10E0 ldi R17,0
0016 0E940000 xcall _delay_us
001A L2:
001A .dbline 20
001A L3:
001A .dbline 20
001A ; while(CHECK_IP_1WIRE);
001A B499 sbic 0x16,4
001C FECF rjmp L2
001E .dbline 21
001E ; SET_DIR_1WIRE;
001E BC9A sbi 0x17,4
0020 .dbline 22
0020 ; SET_OP_1WIRE;
0020 C49A sbi 0x18,4
0022 .dbline 23
0022 ; delay_us(140); //60~240us
0022 0CE8 ldi R16,140
0024 10E0 ldi R17,0
0026 0E940000 xcall _delay_us
002A .dbline -2
002A L1:
002A .dbline 0 ; func end
002A 0895 ret
002C .dbend
002C .dbfunc e write_1820 _write_1820 fV
002C ; m -> R20
002C ; x -> R22
.even
002C _write_1820::
002C 0E940000 xcall push_gset2
0030 602F mov R22,R16
0032 .dbline -1
0032 .dbline 26
0032 ; }
0032 ; void write_1820(unsigned char x)
0032 ; {
0032 .dbline 28
0032 ; unsigned char m;
0032 ; for(m=0;m<8;m++)
0032 4427 clr R20
0034 11C0 xjmp L9
0036 L6:
0036 .dbline 29
0036 ; {
0036 .dbline 30
0036 ; CLR_OP_1WIRE;
0036 C498 cbi 0x18,4
0038 .dbline 31
0038 ; if(x&(1<<m)) //写数据了,先写低位的!
0038 01E0 ldi R16,1
003A 142F mov R17,R20
003C 0E940000 xcall lsl8
0040 262E mov R2,R22
0042 2022 and R2,R16
0044 11F0 breq L10
0046 .dbline 32
0046 ; SET_OP_1WIRE;
0046 C49A sbi 0x18,4
0048 01C0 xjmp L11
004A L10:
004A .dbline 34
004A ; else
004A ; {CLR_OP_1WIRE;}
004A .dbline 34
004A C498 cbi 0x18,4
004C .dbline 34
004C L11:
004C .dbline 35
004C 08E2 ldi R16,40
004E 10E0 ldi R17,0
0050 0E940000 xcall _delay_us
0054 .dbline 36
0054 C49A sbi 0x18,4
0056 .dbline 37
0056 L7:
0056 .dbline 28
0056 4395 inc R20
0058 L9:
0058 .dbline 28
0058 4830 cpi R20,8
005A 68F3 brlo L6
005C .dbline 38
005C ; delay_us(40); //15~60us
005C ; SET_OP_1WIRE;
005C ; }
005C ; SET_OP_1WIRE;
005C C49A sbi 0x18,4
005E .dbline -2
005E L5:
005E 0E940000 xcall pop_gset2
0062 .dbline 0 ; func end
0062 0895 ret
0064 .dbsym r m 20 c
0064 .dbsym r x 22 c
0064 .dbend
0064 .dbfunc e read_1820 _read_1820 fc
0064 ; temp -> R20
0064 ; k -> R22
0064 ; n -> R10
.even
0064 _read_1820::
0064 0E940000 xcall push_gset3
0068 .dbline -1
0068 .dbline 41
0068 ; }
0068 ; unsigned char read_1820(void)
0068 ; {
0068 .dbline 43
0068 ; unsigned char temp,k,n;
0068 ; temp=0;
0068 4427 clr R20
006A .dbline 44
006A ; for(n=0;n<8;n++)
006A AA24 clr R10
006C 19C0 xjmp L16
006E L13:
006E .dbline 45
006E ; {
006E .dbline 46
006E ; CLR_OP_1WIRE;
006E C498 cbi 0x18,4
0070 .dbline 47
0070 ; SET_OP_1WIRE;
0070 C49A sbi 0x18,4
0072 .dbline 48
0072 ; CLR_DIR_1WIRE;
0072 BC98 cbi 0x17,4
0074 .dbline 49
0074 ; k=(CHECK_IP_1WIRE); //读数据,从低位开始
0074 66B3 in R22,0x16
0076 6071 andi R22,16
0078 .dbline 50
0078 ; if(k)
0078 31F0 breq L17
007A .dbline 51
007A ; temp|=(1<<n);
007A 01E0 ldi R16,1
007C 1A2D mov R17,R10
007E 0E940000 xcall lsl8
0082 402B or R20,R16
0084 07C0 xjmp L18
0086 L17:
0086 .dbline 53
0086 ; else
0086 ; temp&=~(1<<n);
0086 01E0 ldi R16,1
0088 1A2D mov R17,R10
008A 0E940000 xcall lsl8
008E 202E mov R2,R16
0090 2094 com R2
0092 4221 and R20,R2
0094 L18:
0094 .dbline 54
0094 02E3 ldi R16,50
0096 10E0 ldi R17,0
0098 0E940000 xcall _delay_us
009C .dbline 55
009C BC9A sbi 0x17,4
009E .dbline 56
009E L14:
009E .dbline 44
009E A394 inc R10
00A0 L16:
00A0 .dbline 44
00A0 8A2D mov R24,R10
00A2 8830 cpi R24,8
00A4 20F3 brlo L13
00A6 .dbline 57
00A6 ; delay_us(50); //60~120us
00A6 ; SET_DIR_1WIRE;
00A6 ; }
00A6 ; return (temp);
00A6 042F mov R16,R20
00A8 .dbline -2
00A8 L12:
00A8 0E940000 xcall pop_gset3
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r temp 20 c
00AE .dbsym r k 22 c
00AE .dbsym r n 10 c
00AE .dbend
00AE .dbfunc e gettemp _gettemp fV
00AE ; wm3 -> R22
00AE ; wm1 -> R22
00AE ; wm0 -> R20
00AE ; teml -> R10
00AE ; wm2 -> R20
00AE ; temh -> R12
.even
00AE _gettemp::
00AE 0E940000 xcall push_gset5
00B2 2497 sbiw R28,4
00B4 .dbline -1
00B4 .dbline 61
00B4 ; }
00B4 ;
00B4 ; void gettemp(void) //读取温度值
00B4 ; {
00B4 .dbline 63
00B4 ; unsigned char temh,teml,wm0,wm1,wm2,wm3;
00B4 ; init_1820(); //复位18b20
00B4 A5DF xcall _init_1820
00B6 .dbline 64
00B6 ; write_1820(0xcc); // 发出转换命令
00B6 0CEC ldi R16,204
00B8 B9DF xcall _write_1820
00BA .dbline 65
00BA ; write_1820(0x44);
00BA 04E4 ldi R16,68
00BC B7DF xcall _write_1820
00BE .dbline 67
00BE ; // delay_nms(800); //不延时也好使,不知道怎么回事!
00BE ; init_1820();
00BE A0DF xcall _init_1820
00C0 .dbline 68
00C0 ; write_1820(0xcc); //发出读命令
00C0 0CEC ldi R16,204
00C2 B4DF xcall _write_1820
00C4 .dbline 69
00C4 ; write_1820(0xbe);
00C4 0EEB ldi R16,190
00C6 B2DF xcall _write_1820
00C8 .dbline 70
00C8 ; teml=read_1820(); //读数据
00C8 CDDF xcall _read_1820
00CA A02E mov R10,R16
00CC .dbline 71
00CC ; temh=read_1820();
00CC CBDF xcall _read_1820
00CE C02E mov R12,R16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -