📄 ds1820.lis
字号:
.module DS1820.C
.area text(rom, con, rel)
0000 .dbfile E:\ICCAVR\project\AVRMEG~3\icc\016-DS18B20-LED4\DS1820.C
0000 .dbfunc e delay_10us _delay_10us fV
0000 ; i -> R16
.even
0000 _delay_10us::
0000 .dbline -1
0000 .dbline 33
0000 ; /*
0000 ; DS18B20操作模块
0000 ;
0000 ; 1、DS18B20的电源脚接到VCC及GND上面,数据线接到PA7口。
0000 ; 2、晶振频率为内部1MHz。
0000 ; 3、DS18B20由PA7口实现单总线访问,实现读取温度。
0000 ; 4、函数中有对中断的保护处理,更具有实用价值。
0000 ; 5、此文件可以直接嵌入到项目中使用。
0000 ;
0000 ; AVR mega16学习板
0000 ; AVR_AFA
0000 ; www.iccavr.com
0000 ; 11:48 2007-6-30
0000 ; */
0000 ;
0000 ; #include <iom128v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define DQ_IN DDRF &= ~(1 << PF2) /*设置输入*/
0000 ; #define DQ_OUT DDRF |= (1 << PF2) /*设置输出*/
0000 ; #define DQ_CLR PORTF &= ~(1 << PF2) /*置低电平*/
0000 ; #define DQ_SET PORTF |= (1 << PF2) /*置高电平*/
0000 ; #define DQ_R PINF & (1 << PF2) /*读了电平*/
0000 ;
0000 ; unsigned char flag; /*中断标志缓存*/
0000 ;
0000 ; /*
0000 ; 延时函数
0000 ;
0000 ; 延时时间:i X 10 + 16uS。
0000 ; CPU频率为:1MHz。
0000 ; */
0000 ; void delay_10us(unsigned char i) {
0000 .dbline 35
0000 ;
0000 ; if (i == 0) {
0000 0023 tst R16
0002 29F4 brne L5
0004 .dbline 35
0004 .dbline 36
0004 ; return ;
0004 09C0 xjmp L1
0006 L4:
0006 .dbline 38
0006 .dbline 39
0006 0000 nop
0008 .dbline 40
0008 0000 nop
000A .dbline 41
000A 0000 nop
000C .dbline 42
000C 0000 nop
000E .dbline 43
000E L5:
000E .dbline 38
000E ; }
000E ; while (i--) {
000E 202E mov R2,R16
0010 3324 clr R3
0012 0150 subi R16,1
0014 2220 tst R2
0016 B9F7 brne L4
0018 .dbline -2
0018 L1:
0018 .dbline 0 ; func end
0018 0895 ret
001A .dbsym r i 16 c
001A .dbend
001A .dbfunc e ds1820_reset _ds1820_reset fc
001A ; i -> R20
.even
001A _ds1820_reset::
001A 0E940000 xcall push_gset1
001E .dbline -1
001E .dbline 47
001E ; NOP();
001E ; NOP();
001E ; NOP();
001E ; NOP();
001E ; }
001E ; }
001E ;
001E ; /*DS18B20复位函数*/
001E ; unsigned char ds1820_reset(void) {
001E .dbline 50
001E ;
001E ; unsigned char i;
001E ; flag = SREG; /*中断保护*/
001E 2FB6 in R2,0x3f
0020 20920000 sts _flag,R2
0024 .dbline 51
0024 ; CLI(); /*关中断*/
0024 F894 cli
0026 .dbline 52
0026 ; DQ_OUT;
0026 80916100 lds R24,97
002A 8460 ori R24,4
002C 80936100 sts 97,R24
0030 .dbline 53
0030 ; DQ_CLR;
0030 80916200 lds R24,98
0034 8B7F andi R24,251
0036 80936200 sts 98,R24
003A .dbline 54
003A ; delay_10us(49); /*延时500uS(480-960)*/
003A 01E3 ldi R16,49
003C E1DF xcall _delay_10us
003E .dbline 55
003E ; DQ_SET;
003E 80916200 lds R24,98
0042 8460 ori R24,4
0044 80936200 sts 98,R24
0048 .dbline 56
0048 ; DQ_IN;
0048 80916100 lds R24,97
004C 8B7F andi R24,251
004E 80936100 sts 97,R24
0052 .dbline 57
0052 ; delay_10us(7); /*延时80uS*/
0052 07E0 ldi R16,7
0054 D5DF xcall _delay_10us
0056 .dbline 58
0056 ; i = DQ_R;
0056 40B1 in R20,0x0
0058 4470 andi R20,4
005A .dbline 59
005A ; delay_10us(49); /*延时500uS(保持>480uS)*/
005A 01E3 ldi R16,49
005C D1DF xcall _delay_10us
005E .dbline 60
005E ; if (flag & 0x80) { /*恢复中断状态*/
005E 20900000 lds R2,_flag
0062 27FE sbrs R2,7
0064 01C0 rjmp L8
0066 .dbline 60
0066 .dbline 61
0066 ; SEI();
0066 7894 sei
0068 .dbline 62
0068 ; }
0068 L8:
0068 .dbline 63
0068 ; if (i) {
0068 4423 tst R20
006A 11F0 breq L10
006C .dbline 63
006C .dbline 64
006C ; return 0x00;
006C 0027 clr R16
006E 01C0 xjmp L7
0070 L10:
0070 .dbline 66
0070 ; }
0070 ; else {
0070 .dbline 67
0070 ; return 0x01;
0070 01E0 ldi R16,1
0072 .dbline -2
0072 L7:
0072 0E940000 xcall pop_gset1
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r i 20 c
0078 .dbend
0078 .dbfunc e ds1820_read_byte _ds1820_read_byte fc
0078 ; value -> R20
0078 ; i -> R22
.even
0078 _ds1820_read_byte::
0078 0E940000 xcall push_gset2
007C .dbline -1
007C .dbline 72
007C ; }
007C ; }
007C ;
007C ; /*DS18B20字节读取函数*/
007C ; unsigned char ds1820_read_byte(void) {
007C .dbline 75
007C ;
007C ; unsigned char i;
007C ; unsigned char value = 0;
007C 4427 clr R20
007E .dbline 76
007E ; flag = SREG; /*中断保护*/
007E 2FB6 in R2,0x3f
0080 20920000 sts _flag,R2
0084 .dbline 77
0084 ; CLI(); /*关中断*/
0084 F894 cli
0086 .dbline 78
0086 68E0 ldi R22,8
0088 29C0 xjmp L16
008A L13:
008A .dbline 78
008A ; for (i = 8; i != 0; i--) {
008A .dbline 79
008A ; value >>= 1;
008A 4695 lsr R20
008C .dbline 80
008C ; DQ_OUT;
008C 80916100 lds R24,97
0090 8460 ori R24,4
0092 80936100 sts 97,R24
0096 .dbline 81
0096 ; DQ_CLR;
0096 80916200 lds R24,98
009A 8B7F andi R24,251
009C 80936200 sts 98,R24
00A0 .dbline 82
00A0 ; NOP(); /*延时4uS*/
00A0 0000 nop
00A2 .dbline 83
00A2 ; NOP();
00A2 0000 nop
00A4 .dbline 84
00A4 ; NOP();
00A4 0000 nop
00A6 .dbline 85
00A6 ; NOP();
00A6 0000 nop
00A8 .dbline 86
00A8 ; DQ_SET;
00A8 80916200 lds R24,98
00AC 8460 ori R24,4
00AE 80936200 sts 98,R24
00B2 .dbline 87
00B2 ; DQ_IN;
00B2 80916100 lds R24,97
00B6 8B7F andi R24,251
00B8 80936100 sts 97,R24
00BC .dbline 88
00BC ; NOP(); /*延时10uS*/
00BC 0000 nop
00BE .dbline 89
00BE ; NOP();
00BE 0000 nop
00C0 .dbline 90
00C0 ; NOP();
00C0 0000 nop
00C2 .dbline 91
00C2 ; NOP();
00C2 0000 nop
00C4 .dbline 92
00C4 ; NOP();
00C4 0000 nop
00C6 .dbline 93
00C6 ; NOP();
00C6 0000 nop
00C8 .dbline 94
00C8 ; NOP();
00C8 0000 nop
00CA .dbline 95
00CA ; NOP();
00CA 0000 nop
00CC .dbline 96
00CC ; NOP();
00CC 0000 nop
00CE .dbline 97
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -