📄 ds1820.lis
字号:
.module DS1820.C
.area text(rom, con, rel)
0000 .dbfile D:\+++资料+++\学习\avr\程序\18b20new\DS1820.C
0000 .dbfunc e delay_10us _delay_10us fV
0000 ; i -> R16
.even
0000 _delay_10us::
0000 .dbline -1
0000 .dbline 39
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 <iom16v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define DQ_IN DDRA &= ~(1 << PA3) /*设置输入*/
0000 ; #define DQ_OUT DDRA |= (1 << PA3) /*设置输出*/
0000 ; #define DQ_CLR PORTA &= ~(1 << PA3) /*置低电平*/
0000 ; #define DQ_SET PORTA |= (1 << PA3) /*置高电平*/
0000 ; #define DQ_R PINA & (1 << PA3) /*读了电平*/
0000 ; #define delay4us {NOP();NOP();NOP();NOP();}
0000 ; #define delay10us {NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();}
0000 ; //--------函数声明----------------------
0000 ; void ds1820_start(void);
0000 ; unsigned char ds1820_reset(void);
0000 ; unsigned int ds1820_read_temp(void);
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 41
0000 ;
0000 ; if (i == 0) {
0000 0023 tst R16
0002 29F4 brne L5
0004 .dbline 41
0004 .dbline 42
0004 ; return ;
0004 09C0 xjmp L1
0006 L4:
0006 .dbline 44
0006 .dbline 45
0006 .dbline 45
0006 0000 nop
0008 .dbline 45
0008 0000 nop
000A .dbline 45
000A 0000 nop
000C .dbline 45
000C 0000 nop
000E .dbline 45
000E .dbline 45
000E .dbline 46
000E L5:
000E .dbline 44
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 50
001E ; delay4us;
001E ; }
001E ; }
001E ;
001E ; /*DS18B20复位函数*/
001E ; unsigned char ds1820_reset(void) {
001E .dbline 53
001E ;
001E ; unsigned char i;
001E ; flag = SREG; /*中断保护*/
001E 2FB6 in R2,0x3f
0020 20920000 sts _flag,R2
0024 .dbline 54
0024 ; CLI(); /*关中断*/
0024 F894 cli
0026 .dbline 55
0026 ; DQ_OUT;
0026 D39A sbi 0x1a,3
0028 .dbline 56
0028 ; DQ_CLR;
0028 DB98 cbi 0x1b,3
002A .dbline 57
002A ; delay_10us(49); /*延时500uS(480-960)*/
002A 01E3 ldi R16,49
002C E9DF xcall _delay_10us
002E .dbline 58
002E ; DQ_SET;
002E DB9A sbi 0x1b,3
0030 .dbline 59
0030 ; DQ_IN;
0030 D398 cbi 0x1a,3
0032 .dbline 60
0032 ; delay_10us(7); /*延时80uS*/
0032 07E0 ldi R16,7
0034 E5DF xcall _delay_10us
0036 .dbline 61
0036 ; i = DQ_R;
0036 49B3 in R20,0x19
0038 4870 andi R20,8
003A .dbline 62
003A ; delay_10us(49); /*延时500uS(保持>480uS)*/
003A 01E3 ldi R16,49
003C E1DF xcall _delay_10us
003E .dbline 63
003E ; if (flag & 0x80) { /*恢复中断状态*/
003E 20900000 lds R2,_flag
0042 27FE sbrs R2,7
0044 01C0 rjmp L8
0046 .dbline 63
0046 .dbline 64
0046 ; SEI();
0046 7894 sei
0048 .dbline 65
0048 ; }
0048 L8:
0048 .dbline 66
0048 ; if (i) {
0048 4423 tst R20
004A 11F0 breq L10
004C .dbline 66
004C .dbline 67
004C ; return 0x00;
004C 0027 clr R16
004E 01C0 xjmp L7
0050 L10:
0050 .dbline 69
0050 ; }
0050 ; else {
0050 .dbline 70
0050 ; return 0x01;
0050 01E0 ldi R16,1
0052 .dbline -2
0052 L7:
0052 0E940000 xcall pop_gset1
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r i 20 c
0058 .dbend
0058 .dbfunc e ds1820_read_byte _ds1820_read_byte fc
0058 ; value -> R20
0058 ; i -> R22
.even
0058 _ds1820_read_byte::
0058 0E940000 xcall push_gset2
005C .dbline -1
005C .dbline 75
005C ; }
005C ; }
005C ;
005C ; /*DS18B20字节读取函数*/
005C ; unsigned char ds1820_read_byte(void) {
005C .dbline 78
005C ;
005C ; unsigned char i;
005C ; unsigned char value = 0;
005C 4427 clr R20
005E .dbline 79
005E ; flag = SREG; /*中断保护*/
005E 2FB6 in R2,0x3f
0060 20920000 sts _flag,R2
0064 .dbline 80
0064 ; CLI(); /*关中断*/
0064 F894 cli
0066 .dbline 81
0066 68E0 ldi R22,8
0068 19C0 xjmp L16
006A L13:
006A .dbline 81
006A ; for (i = 8; i != 0; i--) {
006A .dbline 82
006A ; value >>= 1;
006A 4695 lsr R20
006C .dbline 83
006C ; DQ_OUT;
006C D39A sbi 0x1a,3
006E .dbline 84
006E ; DQ_CLR;
006E DB98 cbi 0x1b,3
0070 .dbline 85
0070 ; delay4us; /*延时4uS*/
0070 .dbline 85
0070 0000 nop
0072 .dbline 85
0072 0000 nop
0074 .dbline 85
0074 0000 nop
0076 .dbline 85
0076 0000 nop
0078 .dbline 85
0078 .dbline 85
0078 .dbline 86
0078 ; DQ_SET;
0078 DB9A sbi 0x1b,3
007A .dbline 87
007A ; DQ_IN;
007A D398 cbi 0x1a,3
007C .dbline 88
007C ; delay10us; /*延时10uS*/
007C .dbline 88
007C 0000 nop
007E .dbline 88
007E 0000 nop
0080 .dbline 88
0080 0000 nop
0082 .dbline 88
0082 0000 nop
0084 .dbline 88
0084 0000 nop
0086 .dbline 88
0086 0000 nop
0088 .dbline 88
0088 0000 nop
008A .dbline 88
008A 0000 nop
008C .dbline 88
008C 0000 nop
008E .dbline 88
008E 0000 nop
0090 .dbline 88
0090 .dbline 88
0090 .dbline 89
0090 ; if (DQ_R) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -