⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds1820.lis

📁 DS18B20的使用情况以及电路接法和原代码!可以参考做测温电路
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .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 + -