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