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

📄 ds18b20.lst

📁 一款电力行业使用的温湿度控制器源代码 湿度传感器采用HF3223 温度采用DS18B20 单片机采用mega8 编程采用winavr2007
💻 LST
📖 第 1 页 / 共 3 页
字号:
   1               		.file	"ds18b20.c"
   2               		.arch atmega8
   3               	__SREG__ = 0x3f
   4               	__SP_H__ = 0x3e
   5               	__SP_L__ = 0x3d
   6               	__tmp_reg__ = 0
   7               	__zero_reg__ = 1
   8               		.global __do_copy_data
   9               		.global __do_clear_bss
  11               		.text
  12               	.Ltext0:
 124               	.global	convert_is_succ
 125               	.global	convert_is_succ
 126               		.section .bss
 129               	convert_is_succ:
 130 0000 00        		.skip 1,0
 131               		.text
 133               	.global	ds18b20_config
 135               	ds18b20_config:
   1:drive/ds18b20.c **** #include "inc/config.h"
   2:drive/ds18b20.c **** 
   3:drive/ds18b20.c **** 
   4:drive/ds18b20.c **** #define DQ_18B20 (1<<3) // PD3 
   5:drive/ds18b20.c **** #define DQ_TO_0() (DDRD |= DQ_18B20) // PD3='0' 
   6:drive/ds18b20.c **** #define DQ_TO_1() (DDRD &= ~DQ_18B20) // PD3='float' 
   7:drive/ds18b20.c **** #define DQ_status() (PIND & DQ_18B20) // read PD3 pin 
   8:drive/ds18b20.c **** 
   9:drive/ds18b20.c **** /* 请认真检查你的AVR微控制器的时钟频率! 特别注意:频率 
  10:drive/ds18b20.c **** * 定义的单位是MHz! 并且请使用浮点数! 假如你的晶振是12MHz, 
  11:drive/ds18b20.c **** * 你应该写成12.0000或12.0之类。 
  12:drive/ds18b20.c **** * 我的实验电路的晶振是8.0000MHz 
  13:drive/ds18b20.c **** */ 
  14:drive/ds18b20.c **** #ifndef CPU_CRYSTAL 
  15:drive/ds18b20.c **** #define CPU_CRYSTAL (8.0000) 
  16:drive/ds18b20.c **** #endif 
  17:drive/ds18b20.c **** 
  18:drive/ds18b20.c **** #define  wait_us(us)\
  19:drive/ds18b20.c **** 			_delay_loop_2((u16)((us)*CPU_CRYSTAL/4)) 
  20:drive/ds18b20.c **** 
  21:drive/ds18b20.c **** /*---------------- 函数原型声明 ------------------*/ 
  22:drive/ds18b20.c **** // 1个初始化模块 
  23:drive/ds18b20.c **** void   ds18b20_config(void);       // 配置端口 
  24:drive/ds18b20.c **** 
  25:drive/ds18b20.c **** // 3个基本模块 
  26:drive/ds18b20.c **** inline BOOL ds18b20_reset(void);   // 复位DS18B20 
  27:drive/ds18b20.c **** void   ds18b20_write(u08 dat);   // 写字节到DS18B20 
  28:drive/ds18b20.c **** u08  ds18b20_read(void);         // 读字节从DS18B20 
  29:drive/ds18b20.c **** 
  30:drive/ds18b20.c **** // 2个应用模块 
  31:drive/ds18b20.c **** BOOL   convert_T(void);            // 启动温度转换 
  32:drive/ds18b20.c **** u08 read_T(void);         // 读取转换值 
  33:drive/ds18b20.c **** 
  34:drive/ds18b20.c **** 
  35:drive/ds18b20.c **** /*------------------------------------------------------- 
  36:drive/ds18b20.c **** *  配置(使能)AVR与DS18B20的接口 
  37:drive/ds18b20.c **** */ 
  38:drive/ds18b20.c **** void ds18b20_config(void) 
  39:drive/ds18b20.c **** { 
 137               	.LM1:
 138               	/* prologue: frame size=0 */
 139               	/* prologue end (size=0) */
  40:drive/ds18b20.c ****     DDRD  &= ~DQ_18B20;   // 输入模式(上电时为高电平) 
 141               	.LM2:
 142 0000 8B98      		cbi 49-0x20,3
  41:drive/ds18b20.c ****     PORTD &= ~DQ_18B20;   // 输出锁存器写0,以后不再更改 
 144               	.LM3:
 145 0002 9398      		cbi 50-0x20,3
 146               	/* epilogue: frame size=0 */
 147 0004 0895      		ret
 148               	/* epilogue end (size=1) */
 149               	/* function ds18b20_config size 3 (2) */
 151               	.Lscope0:
 153               	.global	_ds18b20_reset
 155               	_ds18b20_reset:
  42:drive/ds18b20.c **** } 
  43:drive/ds18b20.c **** 
  44:drive/ds18b20.c **** /*------------------------------------------------------- 
  45:drive/ds18b20.c **** *    复位1-wire总线,并探测是否有温度芯片DS18B20(TO-92 
  46:drive/ds18b20.c **** *  封装)挂在总线上,有返回SUCC,没有返回FAIL 
  47:drive/ds18b20.c **** */ 
  48:drive/ds18b20.c **** BOOL _ds18b20_reset(void) 
  49:drive/ds18b20.c **** { 
 157               	.LM4:
 158               	/* prologue: frame size=0 */
 159               	/* prologue end (size=0) */
  50:drive/ds18b20.c ****     BOOL bus_flag; 
  51:drive/ds18b20.c **** 
  52:drive/ds18b20.c ****     DQ_TO_0();      // 设置1-wire总线为低电平(占领总线)... 
 161               	.LM5:
 162 0006 8B9A      		sbi 49-0x20,3
 163               	.LBB2:
 165               	.Ltext1:
   1:d:/WinAVR/avr/include/util/delay.h **** /* Copyright (c) 2002, Marek Michalkiewicz
   2:d:/WinAVR/avr/include/util/delay.h ****    Copyright (c) 2004,2005 Joerg Wunsch
   3:d:/WinAVR/avr/include/util/delay.h ****    All rights reserved.
   4:d:/WinAVR/avr/include/util/delay.h **** 
   5:d:/WinAVR/avr/include/util/delay.h ****    Redistribution and use in source and binary forms, with or without
   6:d:/WinAVR/avr/include/util/delay.h ****    modification, are permitted provided that the following conditions are met:
   7:d:/WinAVR/avr/include/util/delay.h **** 
   8:d:/WinAVR/avr/include/util/delay.h ****    * Redistributions of source code must retain the above copyright
   9:d:/WinAVR/avr/include/util/delay.h ****      notice, this list of conditions and the following disclaimer.
  10:d:/WinAVR/avr/include/util/delay.h **** 
  11:d:/WinAVR/avr/include/util/delay.h ****    * Redistributions in binary form must reproduce the above copyright
  12:d:/WinAVR/avr/include/util/delay.h ****      notice, this list of conditions and the following disclaimer in
  13:d:/WinAVR/avr/include/util/delay.h ****      the documentation and/or other materials provided with the
  14:d:/WinAVR/avr/include/util/delay.h ****      distribution.
  15:d:/WinAVR/avr/include/util/delay.h **** 
  16:d:/WinAVR/avr/include/util/delay.h ****    * Neither the name of the copyright holders nor the names of
  17:d:/WinAVR/avr/include/util/delay.h ****      contributors may be used to endorse or promote products derived
  18:d:/WinAVR/avr/include/util/delay.h ****      from this software without specific prior written permission.
  19:d:/WinAVR/avr/include/util/delay.h **** 
  20:d:/WinAVR/avr/include/util/delay.h ****   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21:d:/WinAVR/avr/include/util/delay.h ****   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22:d:/WinAVR/avr/include/util/delay.h ****   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  23:d:/WinAVR/avr/include/util/delay.h ****   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  24:d:/WinAVR/avr/include/util/delay.h ****   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  25:d:/WinAVR/avr/include/util/delay.h ****   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  26:d:/WinAVR/avr/include/util/delay.h ****   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  27:d:/WinAVR/avr/include/util/delay.h ****   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  28:d:/WinAVR/avr/include/util/delay.h ****   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  29:d:/WinAVR/avr/include/util/delay.h ****   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  30:d:/WinAVR/avr/include/util/delay.h ****   POSSIBILITY OF SUCH DAMAGE. */
  31:d:/WinAVR/avr/include/util/delay.h **** 
  32:d:/WinAVR/avr/include/util/delay.h **** /* $Id: delay.h,v 1.1.2.1 2005/12/12 23:19:49 joerg_wunsch Exp $ */
  33:d:/WinAVR/avr/include/util/delay.h **** 
  34:d:/WinAVR/avr/include/util/delay.h **** #ifndef _UTIL_DELAY_H_
  35:d:/WinAVR/avr/include/util/delay.h **** #define _UTIL_DELAY_H_ 1
  36:d:/WinAVR/avr/include/util/delay.h **** 
  37:d:/WinAVR/avr/include/util/delay.h **** #include <inttypes.h>
  38:d:/WinAVR/avr/include/util/delay.h **** 
  39:d:/WinAVR/avr/include/util/delay.h **** /** \defgroup util_delay <util/delay.h>: Busy-wait delay loops
  40:d:/WinAVR/avr/include/util/delay.h ****     \code
  41:d:/WinAVR/avr/include/util/delay.h ****     #define F_CPU 1000000UL  // 1 MHz
  42:d:/WinAVR/avr/include/util/delay.h ****     //#define F_CPU 14.7456E6
  43:d:/WinAVR/avr/include/util/delay.h ****     #include <util/delay.h>
  44:d:/WinAVR/avr/include/util/delay.h ****     \endcode
  45:d:/WinAVR/avr/include/util/delay.h **** 
  46:d:/WinAVR/avr/include/util/delay.h ****     \note As an alternative method, it is possible to pass the
  47:d:/WinAVR/avr/include/util/delay.h ****     F_CPU macro down to the compiler from the Makefile.
  48:d:/WinAVR/avr/include/util/delay.h ****     Obviously, in that case, no \c \#define statement should be
  49:d:/WinAVR/avr/include/util/delay.h ****     used.
  50:d:/WinAVR/avr/include/util/delay.h **** 
  51:d:/WinAVR/avr/include/util/delay.h ****     The functions in this header file implement simple delay loops
  52:d:/WinAVR/avr/include/util/delay.h ****     that perform a busy-waiting.  They are typically used to
  53:d:/WinAVR/avr/include/util/delay.h ****     facilitate short delays in the program execution.  They are
  54:d:/WinAVR/avr/include/util/delay.h ****     implemented as count-down loops with a well-known CPU cycle
  55:d:/WinAVR/avr/include/util/delay.h ****     count per loop iteration.  As such, no other processing can
  56:d:/WinAVR/avr/include/util/delay.h ****     occur simultaneously.  It should be kept in mind that the
  57:d:/WinAVR/avr/include/util/delay.h ****     functions described here do not disable interrupts.
  58:d:/WinAVR/avr/include/util/delay.h **** 
  59:d:/WinAVR/avr/include/util/delay.h ****     In general, for long delays, the use of hardware timers is
  60:d:/WinAVR/avr/include/util/delay.h ****     much preferrable, as they free the CPU, and allow for
  61:d:/WinAVR/avr/include/util/delay.h ****     concurrent processing of other events while the timer is
  62:d:/WinAVR/avr/include/util/delay.h ****     running.  However, in particular for very short delays, the
  63:d:/WinAVR/avr/include/util/delay.h ****     overhead of setting up a hardware timer is too much compared
  64:d:/WinAVR/avr/include/util/delay.h ****     to the overall delay time.
  65:d:/WinAVR/avr/include/util/delay.h **** 
  66:d:/WinAVR/avr/include/util/delay.h ****     Two inline functions are provided for the actual delay algorithms.
  67:d:/WinAVR/avr/include/util/delay.h **** 
  68:d:/WinAVR/avr/include/util/delay.h ****     Two wrapper functions allow the specification of microsecond, and
  69:d:/WinAVR/avr/include/util/delay.h ****     millisecond delays directly, using the application-supplied macro
  70:d:/WinAVR/avr/include/util/delay.h ****     F_CPU as the CPU clock frequency (in Hertz).  These functions
  71:d:/WinAVR/avr/include/util/delay.h ****     operate on double typed arguments, however when optimization is
  72:d:/WinAVR/avr/include/util/delay.h ****     turned on, the entire floating-point calculation will be done at
  73:d:/WinAVR/avr/include/util/delay.h ****     compile-time.
  74:d:/WinAVR/avr/include/util/delay.h **** 
  75:d:/WinAVR/avr/include/util/delay.h ****     \note When using _delay_us() and _delay_ms(), the expressions
  76:d:/WinAVR/avr/include/util/delay.h ****     passed as arguments to these functions shall be compile-time
  77:d:/WinAVR/avr/include/util/delay.h ****     constants, otherwise the floating-point calculations to setup the
  78:d:/WinAVR/avr/include/util/delay.h ****     loops will be done at run-time, thereby drastically increasing
  79:d:/WinAVR/avr/include/util/delay.h ****     both the resulting code size, as well as the time required to
  80:d:/WinAVR/avr/include/util/delay.h ****     setup the loops.
  81:d:/WinAVR/avr/include/util/delay.h **** */
  82:d:/WinAVR/avr/include/util/delay.h **** 
  83:d:/WinAVR/avr/include/util/delay.h **** #if !defined(__DOXYGEN__)
  84:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline));
  85:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline));
  86:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_us(double __us) __attribute__((always_inline));
  87:d:/WinAVR/avr/include/util/delay.h **** static inline void _delay_ms(double __ms) __attribute__((always_inline));
  88:d:/WinAVR/avr/include/util/delay.h **** #endif
  89:d:/WinAVR/avr/include/util/delay.h **** 
  90:d:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
  91:d:/WinAVR/avr/include/util/delay.h **** 
  92:d:/WinAVR/avr/include/util/delay.h ****     Delay loop using an 8-bit counter \c __count, so up to 256
  93:d:/WinAVR/avr/include/util/delay.h ****     iterations are possible.  (The value 256 would have to be passed
  94:d:/WinAVR/avr/include/util/delay.h ****     as 0.)  The loop executes three CPU cycles per iteration, not
  95:d:/WinAVR/avr/include/util/delay.h ****     including the overhead the compiler needs to setup the counter
  96:d:/WinAVR/avr/include/util/delay.h ****     register.
  97:d:/WinAVR/avr/include/util/delay.h **** 
  98:d:/WinAVR/avr/include/util/delay.h ****     Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
  99:d:/WinAVR/avr/include/util/delay.h ****     can be achieved.
 100:d:/WinAVR/avr/include/util/delay.h **** */
 101:d:/WinAVR/avr/include/util/delay.h **** void
 102:d:/WinAVR/avr/include/util/delay.h **** _delay_loop_1(uint8_t __count)
 103:d:/WinAVR/avr/include/util/delay.h **** {
 104:d:/WinAVR/avr/include/util/delay.h **** 	__asm__ volatile (
 105:d:/WinAVR/avr/include/util/delay.h **** 		"1: dec %0" "\n\t"
 106:d:/WinAVR/avr/include/util/delay.h **** 		"brne 1b"
 107:d:/WinAVR/avr/include/util/delay.h **** 		: "=r" (__count)
 108:d:/WinAVR/avr/include/util/delay.h **** 		: "0" (__count)
 109:d:/WinAVR/avr/include/util/delay.h **** 	);
 110:d:/WinAVR/avr/include/util/delay.h **** }
 111:d:/WinAVR/avr/include/util/delay.h **** 
 112:d:/WinAVR/avr/include/util/delay.h **** /** \ingroup util_delay
 113:d:/WinAVR/avr/include/util/delay.h **** 
 114:d:/WinAVR/avr/include/util/delay.h ****     Delay loop using a 16-bit counter \c __count, so up to 65536
 115:d:/WinAVR/avr/include/util/delay.h ****     iterations are possible.  (The value 65536 would have to be
 116:d:/WinAVR/avr/include/util/delay.h ****     passed as 0.)  The loop executes four CPU cycles per iteration,
 117:d:/WinAVR/avr/include/util/delay.h ****     not including the overhead the compiler requires to setup the
 118:d:/WinAVR/avr/include/util/delay.h ****     counter register pair.
 119:d:/WinAVR/avr/include/util/delay.h **** 
 120:d:/WinAVR/avr/include/util/delay.h ****     Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
 121:d:/WinAVR/avr/include/util/delay.h ****     milliseconds can be achieved.
 122:d:/WinAVR/avr/include/util/delay.h ****  */
 123:d:/WinAVR/avr/include/util/delay.h **** void
 124:d:/WinAVR/avr/include/util/delay.h **** _delay_loop_2(uint16_t __count)
 125:d:/WinAVR/avr/include/util/delay.h **** {
 167               	.LM6:
 168 0008 84ED      		ldi r24,lo8(980)
 169 000a 93E0      		ldi r25,hi8(980)
 170               	.LBB3:
 126:d:/WinAVR/avr/include/util/delay.h **** 	__asm__ volatile (
 172               	.LM7:
 173               	/* #APP */
 174 000c 0197      		1: sbiw r24,1
 175 000e F1F7      		brne 1b
 176               	/* #NOAPP */
 177               	.LBE3:
 178               	.LBE2:
 180               	.Ltext2:
  53:drive/ds18b20.c **** 
  54:drive/ds18b20.c ****     /* 现在延迟480us~960us, 与硬件密切相关,但应尽可能选小值(480us), 
  55:drive/ds18b20.c ****        把抖动留给系统(比如在延迟期间发生中断导致延迟变长)。 
  56:drive/ds18b20.c ****      */ 
  57:drive/ds18b20.c ****     wait_us(490);   // 490us 
  58:drive/ds18b20.c **** 
  59:drive/ds18b20.c ****     cli();          // 下面这段时间要求比较严格,为保险起见,关中断 
 182               	.LM8:
 183               	/* #APP */
 184 0010 F894      		cli
  60:drive/ds18b20.c ****     DQ_TO_1();      // 设置1-wire总线为高电平(释放总线) 
 186               	.LM9:
 187               	/* #NOAPP */
 188 0012 8B98      		cbi 49-0x20,3
 189               	.LBB4:
 191               	.Ltext3:
 193               	.LM10:
 194 0014 87E8      		ldi r24,lo8(135)
 195 0016 90E0      		ldi r25,hi8(135)
 196               	.LBB5:
 198               	.LM11:
 199               	/* #APP */
 200 0018 0197      		1: sbiw r24,1
 201 001a F1F7      		brne 1b
 202               	/* #NOAPP */
 203               	.LBE5:
 204               	.LBE4:
 206               	.Ltext4:
  61:drive/ds18b20.c ****      
  62:drive/ds18b20.c ****     /* 这个浮点数是由编译器计算好的,而不是由你的MCU在运行时临时计算的, 
  63:drive/ds18b20.c ****        所以不会占用用户MCU的时间,不必担心(看看前面的宏你就可以确定了) 
  64:drive/ds18b20.c ****      */ 
  65:drive/ds18b20.c ****     wait_us(67.5);  // 最佳时间: 60us+7.5us!(忙延时,只是一种策略) 
  66:drive/ds18b20.c ****      
  67:drive/ds18b20.c ****     // 探测总线上是否有器件     
  68:drive/ds18b20.c ****     if(DQ_status()) bus_flag=FAIL;   // 复位单总线但没有发现有器件在线 
 208               	.LM12:
 209 001c 839B      		sbis 48-0x20,3
 210 001e 02C0      		rjmp .L5
 212               	.LM13:
 213 0020 20E0      		ldi r18,lo8(0)
 214 0022 01C0      		rjmp .L6
 215               	.L5:
  69:drive/ds18b20.c ****     else bus_flag=SUCC;              // 复位单总线并发现有器件在线 
 217               	.LM14:
 218 0024 21E0      		ldi r18,lo8(1)
 219               	.L6:
  70:drive/ds18b20.c ****      
  71:drive/ds18b20.c ****     sei();          // 退出临界代码区(开中断) 
 221               	.LM15:
 222               	/* #APP */
 223 0026 7894      		sei
 224               	/* #NOAPP */
 225               	.LBB6:
 227               	.Ltext5:
 229               	.LM16:
 230 0028 8DE4      		ldi r24,lo8(845)
 231 002a 93E0      		ldi r25,hi8(845)
 232               	.LBB7:
 234               	.LM17:
 235               	/* #APP */
 236 002c 0197      		1: sbiw r24,1
 237 002e F1F7      		brne 1b
 238               	/* #NOAPP */
 239               	.LBE7:
 240               	.LBE6:
 242               	.Ltext6:
  72:drive/ds18b20.c **** 
  73:drive/ds18b20.c ****     /* 保证Master释放总线的时间(不是说总线处于高电平的时间)不小于 
  74:drive/ds18b20.c ****        480us即可,这一时间从读总线状态之前就开始了,所以这里把这个 
  75:drive/ds18b20.c ****        时间计算在内。在Master释放总线的前半段,也是被动器件声明它 
  76:drive/ds18b20.c ****        们在线之时。 
  77:drive/ds18b20.c ****      */ 
  78:drive/ds18b20.c ****     wait_us(490-67.5);   // 490-67.5us 
  79:drive/ds18b20.c **** 
  80:drive/ds18b20.c ****     return(bus_flag); 
  81:drive/ds18b20.c **** } 
 244               	.LM18:
 245 0030 822F      		mov r24,r18
 246 0032 9927      		clr r25
 247               	/* epilogue: frame size=0 */
 248 0034 0895      		ret
 249               	/* epilogue end (size=1) */
 250               	/* function _ds18b20_reset size 32 (31) */
 264               	.Lscope1:
 266               	.global	ds18b20_reset
 268               	ds18b20_reset:
  82:drive/ds18b20.c **** 
  83:drive/ds18b20.c **** /*-------------------------------------------------------- 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -