📄 dsi8b20.lis
字号:
.module dsi8b20.c
.area text(rom, con, rel)
0000 .dbfile D:\开发板\source\ds18b20\dsi8b20.c
0000 .dbfunc e reset_ov _reset_ov fc
0000 ; c -> R20
.even
0000 _reset_ov::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 24
0002 ; /******************************************/
0002 ; /* 北京MCU学习之家 */
0002 ; /* ADC通信演示程序 */
0002 ; /* 作者:白如冰 */
0002 ; /* 2005年10月1日 */
0002 ; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
0002 ; /******************************************/
0002 ; // 1、使用WIN9X/WIN2000/XP的超级终端,进行通信调试。
0002 ; // 2、通信波特率为9600(8位数据,无校验,1位停止位,无数据流控制)。
0002 ; #include <iom8v.h>
0002 ; #include <macros.h>
0002 ; extern void delay_us(unsigned int n);
0002 ; extern void delay_ms(unsigned int n);
0002 ; extern void uart_init(void);
0002 ; extern void putchar(unsigned char c);
0002 ; extern void puts(char *s);
0002 ; extern void puts_hh(char *s);
0002 ;
0002 ; #define ds1820_data_s PORTD|=BIT(PORTD6)
0002 ; #define ds1820_data_c PORTD&=~BIT(PORTD6)
0002 ;
0002 ;
0002 ; unsigned char reset_ov(void) //18b20 复位函数
0002 ; {
0002 .dbline 25
0002 ; char c=0;
0002 4427 clr R20
0004 .dbline 26
0004 ; ds1820_data_s;
0004 969A sbi 0x12,6
0006 .dbline 27
0006 ; delay_us(1);//6
0006 01E0 ldi R16,1
0008 10E0 ldi R17,0
000A 00D0 rcall _delay_us
000C .dbline 28
000C ; ds1820_data_c;
000C 9698 cbi 0x12,6
000E .dbline 29
000E ; delay_us(660);//500
000E 04E9 ldi R16,660
0010 12E0 ldi R17,2
0012 00D0 rcall _delay_us
0014 .dbline 30
0014 ; ds1820_data_s;
0014 969A sbi 0x12,6
0016 .dbline 31
0016 ; delay_us(73);//60us
0016 09E4 ldi R16,73
0018 10E0 ldi R17,0
001A 00D0 rcall _delay_us
001C .dbline 32
001C ; c=(PIND&=0x40);//dq_in;
001C 80B3 in R24,0x10
001E 8074 andi R24,64
0020 80BB out 0x10,R24
0022 482F mov R20,R24
0024 .dbline 33
0024 ; if(c==0x40)
0024 8034 cpi R24,64
0026 11F4 brne L2
0028 .dbline 34
0028 ; return (0);
0028 0027 clr R16
002A 04C0 rjmp L1
002C L2:
002C .dbline 36
002C ; else
002C ; {
002C .dbline 37
002C ; delay_us(326);//250
002C 06E4 ldi R16,326
002E 11E0 ldi R17,1
0030 00D0 rcall _delay_us
0032 .dbline 38
0032 ; return (1);
0032 01E0 ldi R16,1
0034 .dbline -2
0034 L1:
0034 00D0 rcall pop_gset1
0036 .dbline 0 ; func end
0036 0895 ret
0038 .dbsym r c 20 c
0038 .dbend
0038 .dbfunc e write_data _write_data fV
0038 ; temp -> R20
0038 ; i -> R22
0038 ; data -> R10
.even
0038 _write_data::
0038 00D0 rcall push_gset3
003A A02E mov R10,R16
003C .dbline -1
003C .dbline 43
003C ; }
003C ; }
003C ;
003C ; void write_data(unsigned char data) //DS18B20写函数
003C ; {
003C .dbline 45
003C ; unsigned char i,temp;
003C ; temp=data;
003C 4A2D mov R20,R10
003E .dbline 47
003E ;
003E ; for (i=0; i<8; i++)
003E 6627 clr R22
0040 16C0 rjmp L8
0042 L5:
0042 .dbline 48
0042 ; {
0042 .dbline 49
0042 ; if((temp&0x01)&&0x01)
0042 40FF sbrs R20,0
0044 09C0 rjmp L9
0046 .dbline 50
0046 ; {
0046 .dbline 51
0046 ; ds1820_data_c;
0046 9698 cbi 0x12,6
0048 .dbline 52
0048 ; delay_us(6);//10
0048 06E0 ldi R16,6
004A 10E0 ldi R17,0
004C 00D0 rcall _delay_us
004E .dbline 53
004E ; ds1820_data_s;
004E 969A sbi 0x12,6
0050 .dbline 54
0050 ; delay_us(73);//60
0050 09E4 ldi R16,73
0052 10E0 ldi R17,0
0054 00D0 rcall _delay_us
0056 .dbline 55
0056 ; }
0056 08C0 rjmp L10
0058 L9:
0058 .dbline 57
0058 ; else
0058 ; {
0058 .dbline 58
0058 ; ds1820_data_c;
0058 9698 cbi 0x12,6
005A .dbline 59
005A ; delay_us(80);//70
005A 00E5 ldi R16,80
005C 10E0 ldi R17,0
005E 00D0 rcall _delay_us
0060 .dbline 60
0060 ; ds1820_data_s;
0060 969A sbi 0x12,6
0062 .dbline 61
0062 ; delay_us(1);//6
0062 01E0 ldi R16,1
0064 10E0 ldi R17,0
0066 00D0 rcall _delay_us
0068 .dbline 62
0068 ; }
0068 L10:
0068 .dbline 63
0068 A694 lsr R10
006A .dbline 64
006A 4A2D mov R20,R10
006C .dbline 65
006C L6:
006C .dbline 47
006C 6395 inc R22
006E L8:
006E .dbline 47
006E 6830 cpi R22,8
0070 40F3 brlo L5
0072 .dbline -2
0072 L4:
0072 00D0 rcall pop_gset3
0074 .dbline 0 ; func end
0074 0895 ret
0076 .dbsym r temp 20 c
0076 .dbsym r i 22 c
0076 .dbsym r data 10 c
0076 .dbend
0076 .dbfunc e read_data _read_data fc
0076 ; value -> R20
0076 ; i -> R22
.even
0076 _read_data::
0076 00D0 rcall push_gset2
0078 .dbline -1
0078 .dbline 70
0078 ; data>>=1;
0078 ; temp=data;
0078 ; }
0078 ;
0078 ; }
0078 ;
0078 ; unsigned char read_data(void) //DS18B20 读函数
0078 ; {
0078 .dbline 73
0078 ; unsigned char i;
0078 ;
0078 ; char value = 0;
0078 4427 clr R20
007A .dbline 74
007A ; for (i=0;i<8;i++)
007A 6627 clr R22
007C 13C0 rjmp L15
007E L12:
007E .dbline 75
007E ; {
007E .dbline 76
007E ; value>>=1;
007E 4695 lsr R20
0080 .dbline 77
0080 ; ds1820_data_c;
0080 9698 cbi 0x12,6
0082 .dbline 78
0082 ; delay_us(1);//6
0082 01E0 ldi R16,1
0084 10E0 ldi R17,0
0086 00D0 rcall _delay_us
0088 .dbline 79
0088 ; ds1820_data_s;
0088 969A sbi 0x12,6
008A .dbline 80
008A ; delay_us(1); //6
008A 01E0 ldi R16,1
008C 10E0 ldi R17,0
008E 00D0 rcall _delay_us
0090 .dbline 83
0090 ;
0090 ;
0090 ; if((PIND&=0x40)==0x40)
0090 80B3 in R24,0x10
0092 8074 andi R24,64
0094 80BB out 0x10,R24
0096 8034 cpi R24,64
0098 09F4 brne L16
009A .dbline 84
009A ; value|=0x80;
009A 4068 ori R20,128
009C L16:
009C .dbline 85
009C 09E4 ldi R16,73
009E 10E0 ldi R17,0
00A0 00D0 rcall _delay_us
00A2 .dbline 86
00A2 L13:
00A2 .dbline 74
00A2 6395 inc R22
00A4 L15:
00A4 .dbline 74
00A4 6830 cpi R22,8
00A6 58F3 brlo L12
00A8 .dbline 89
00A8 ; delay_us(73);//60
00A8 ; }
00A8 ;
00A8 ;
00A8 ; return(value);
00A8 042F mov R16,R20
00AA .dbline -2
00AA L11:
00AA 00D0 rcall pop_gset2
00AC .dbline 0 ; func end
00AC 0895 ret
00AE .dbsym r value 20 c
00AE .dbsym r i 22 c
00AE .dbend
00AE .dbfunc e init_ds1820 _init_ds1820 fV
00AE ; i -> R20
.even
00AE _init_ds1820::
00AE 00D0 rcall push_gset1
00B0 .dbline -1
00B0 .dbline 93
00B0 ; }
00B0 ;
00B0 ; void init_ds1820(void)
00B0 ; {
00B0 .dbline 95
00B0 ; unsigned char i;
00B0 ; for(i=0;i<40;i++)
00B0 4427 clr R20
00B2 05C0 rjmp L22
00B4 L19:
00B4 .dbline 96
00B4 ; {if(reset_ov())
00B4 .dbline 96
00B4 A5DF rcall _reset_ov
00B6 0023 tst R16
00B8 09F0 breq L23
00BA .dbline 97
00BA ; break;
00BA 03C0 rjmp L21
00BC L23:
00BC .dbline 98
00BC L20:
00BC .dbline 95
00BC 4395 inc R20
00BE L22:
00BE .dbline 95
00BE 4832 cpi R20,40
00C0 C8F3 brlo L19
00C2 L21:
00C2 .dbline 100
00C2 ; }
00C2 ;
00C2 ; write_data(0xcc); //跳过ROM
00C2 0CEC ldi R16,204
00C4 B9DF rcall _write_data
00C6 .dbline 101
00C6 ; write_data(0x4e); //写配置寄存器指令
00C6 0EE4 ldi R16,78
00C8 B7DF rcall _write_data
00CA .dbline 102
00CA ; write_data(0x00);
00CA 0027 clr R16
00CC B5DF rcall _write_data
00CE .dbline 103
00CE ; write_data(0x00);
00CE 0027 clr R16
00D0 B3DF rcall _write_data
00D2 .dbline 104
00D2 ; write_data(0x7f); //配置转换位数为12位,转换时间为750ms
00D2 0FE7 ldi R16,127
00D4 B1DF rcall _write_data
00D6 .dbline 105
00D6 ; for(i=0;i<40;i++)
00D6 4427 clr R20
00D8 05C0 rjmp L28
00DA L25:
00DA .dbline 106
00DA ; {if(reset_ov())
00DA .dbline 106
00DA 92DF rcall _reset_ov
00DC 0023 tst R16
00DE 09F0 breq L29
00E0 .dbline 107
00E0 ; break;
00E0 03C0 rjmp L27
00E2 L29:
00E2 .dbline 108
00E2 L26:
00E2 .dbline 105
00E2 4395 inc R20
00E4 L28:
00E4 .dbline 105
00E4 4832 cpi R20,40
00E6 C8F3 brlo L25
00E8 L27:
00E8 .dbline 109
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -