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

📄 18b20_1602.lst

📁 非常经典的基于AVR m16的DS18B20 C 程序 !1
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6E0      LDI	R30,0x60
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 36E7      CPI	R30,0x67
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E5E4      LDI	R30,0x54
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E4      CPI	R30,0x54
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 940E023D  CALL	_main
_exit:
    004A CFFF      RJMP	_exit
FILE: E:\DS18B20\delay.c
(0001) /****************************************
(0002) ** 文 件 名: delay.c				   **
(0003) ** 日    期: 2007年04月08日			   **
(0004) ** 描    述: 延时函数				   **
(0005) ** 作    者:tonghe					   **
(0006) ** 版	 本: V1.0					   **
(0007) ** 主控芯片:M16 					   **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600	   **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) #include <E:\DS18B20\define.h>
(0013) /****************************************
(0014) *  函数名称: void delay_us(uchar i)		*
(0015) *  函数功能:延时函数			 		*
(0016) *  晶振频率:7.3728MHZ					*
(0017) *  实际延时:							*
(0018) *  delay_us(1);	 	//2.71us			*
(0019) *  delay_us(2);	 	//3.53us			*
(0020) *  delay_us(4);	 	//5.15us			*
(0021) *  delay_us(8);	 	//8.41us			*
(0022) *  delay_us(16);	//14.92us			*
(0023) *  delay_us(32);	//27.94us			*
(0024) *  delay_us(64);	//53.98us			*
(0025) *  delay_us(128);	//106.07us			*
(0026) *  delay_us(255);	//209.42us			*
(0027) *  delay_us(100);	//83.28us			*
(0028) *  _NOP();			//0.14us  			*
(0029) ****************************************/
(0030) void delay_us(uint i)
(0031) 	 {
(0032)  	 while(i--);
_delay_us:
  i                    --> R16
    004B 0118      MOVW	R2,R16
    004C 5001      SUBI	R16,1
    004D 4010      SBCI	R17,0
    004E 2022      TST	R2
    004F F7D9      BNE	0x004B
    0050 2033      TST	R3
    0051 F7C9      BNE	0x004B
    0052 9508      RET
_delay_ms:
  a                    --> R20
  i                    --> R16
    0053 940E02A9  CALL	push_gset1
(0033) 	 }
(0034) 	 
(0035) /****************************************
(0036) *  函数名称: void delay_ms(uint i)		*
(0037) *  函数功能:延时函数			 		*
(0038) *  晶振频率:7.3728MHZ					*
(0039) *  实际延时:i mS						*
(0040) ****************************************/
(0041) void delay_ms(uint i)
(0042) 	 {
(0043) 	 uint a;
(0044) 	 for(;i;i--)
    0055 C00A      RJMP	0x0060
(0045) 	    {
(0046) 		for(a=1220;a;a--)
    0056 EC44      LDI	R20,0xC4
    0057 E054      LDI	R21,4
    0058 C002      RJMP	0x005B
    0059 5041      SUBI	R20,1
    005A 4050      SBCI	R21,0
    005B 3040      CPI	R20,0
    005C 0745      CPC	R20,R21
    005D F7D9      BNE	0x0059
    005E 5001      SUBI	R16,1
    005F 4010      SBCI	R17,0
    0060 3000      CPI	R16,0
    0061 0701      CPC	R16,R17
    0062 F799      BNE	0x0056
    0063 940E02AC  CALL	pop_gset1
    0065 9508      RET
FILE: E:\DS18B20\initial.c
(0001) /****************************************
(0002) ** 文 件 名: initial.c			   	   **
(0003) ** 日    期: 2007年04月08日			   **
(0004) ** 描    述: 端口初始化函数			   **
(0005) ** 作    者:tonghe					   **
(0006) ** 版	 本: V1.0					   **
(0007) ** 主控芯片:M16 					   **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600	   **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) 
(0013) void port_init(void)
(0014)    {
(0015)    PORTA = 0b00000010;
_port_init:
    0066 E082      LDI	R24,2
    0067 BB8B      OUT	0x1B,R24
(0016)    DDRA  = 0b11111101;
    0068 EF8D      LDI	R24,0xFD
    0069 BB8A      OUT	0x1A,R24
(0017)    PORTB = 0b00000000;
    006A 2422      CLR	R2
    006B BA28      OUT	0x18,R2
(0018)    DDRB  = 0b11111111;  //输出
    006C EF8F      LDI	R24,0xFF
    006D BB87      OUT	0x17,R24
(0019)    PORTC = 0xFF;
    006E BB85      OUT	0x15,R24
(0020)    DDRC  = 0b00000000;  //输出 
    006F BA24      OUT	0x14,R2
(0021)    DDRD  = 0b11100000;
    0070 EE80      LDI	R24,0xE0
    0071 BB81      OUT	0x11,R24
(0022)    PORTD = 0b00001100;
    0072 E08C      LDI	R24,0xC
    0073 BB82      OUT	0x12,R24
    0074 9508      RET
_rst_DS18B20:
  errTime              --> R20
    0075 940E02A9  CALL	push_gset1
FILE: E:\DS18B20\ds18b20.h
(0001) /****************************************
(0002) ** 文 件 名: DS18B20.c				   **
(0003) ** 日    期: 2007年04月08日			   **
(0004) ** 描    述: DS18B20函数			   **
(0005) ** 作    者:tonghe					   **
(0006) ** 版	 本: V1.0					   **
(0007) ** 主控芯片:M16 					   **
(0008) ** 晶振频率:7.3728MHZ, 波特率9600	   **
(0009) ****************************************/
(0010) #include <iom16v.h>
(0011) #include <macros.h>
(0012) #include <E:\DS18B20\define.h>
(0013) #include <E:\DS18B20\function.h>
(0014) 
(0015) /****************************************
(0016) * 函数名称: uchar rst_DS18B20(void)		*
(0017) * 函数功能:DS18B20初始化				*
(0018) * 入    口:无							*
(0019) * 返    回:0x00为失败,0xFF为成功		*
(0020) ****************************************/
(0021) uchar rst_DS18B20(void)
(0022)    {
(0023) 	uchar errTime=0;
    0077 2744      CLR	R20
(0024) 	RLS_DS18B20;		//释放总线
    0078 988D      CBI	0x11,5
(0025) 	_NOP();
    0079 0000      NOP
(0026) 	HLD_DS18B20;		//Maga16控制总线
    007A 9A8D      SBI	0x11,5
(0027) 	CLR_DS18B20;		//强制拉低
    007B 9895      CBI	0x12,5
(0028) 	delay_us(255);		//209.42us
    007C EF0F      LDI	R16,0xFF
    007D E010      LDI	R17,0
    007E 940E004B  CALL	_delay_us
(0029) 	delay_us(255);		//209.42us
    0080 EF0F      LDI	R16,0xFF
    0081 E010      LDI	R17,0
    0082 940E004B  CALL	_delay_us
(0030) 	delay_us(255);		//83.28us
    0084 EF0F      LDI	R16,0xFF
    0085 E010      LDI	R17,0
    0086 940E004B  CALL	_delay_us
(0031) 	//以上的三个延时大于480us
(0032) 	RLS_DS18B20;		//释放总线,总线自动上拉
    0088 988D      CBI	0x11,5
(0033) 	_NOP();			
    0089 0000      NOP
    008A C00A      RJMP	0x0095
(0034) 	while(STU_DS18B20)	
(0035) 		{
(0036) 		delay_us(4);	 	//5.15us
    008B E004      LDI	R16,4
    008C E010      LDI	R17,0
    008D 940E004B  CALL	_delay_us
(0037) 		errTime++;
    008F 9543      INC	R20
(0038) 		if(errTime>20)
    0090 E184      LDI	R24,0x14
    0091 1784      CP	R24,R20
    0092 F410      BCC	0x0095
(0039) 		return(0x00);		//如果等大于5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
    0093 2700      CLR	R16
    0094 C011      RJMP	0x00A6
    0095 9985      SBIC	0x10,5
    0096 CFF4      RJMP	0x008B
(0040) 		}
(0041) 	errTime=0;
    0097 2744      CLR	R20
    0098 C00A      RJMP	0x00A3
(0042) 	while(!(STU_DS18B20))	
(0043) 	    {
(0044) 		delay_us(4);	 	//5.15us
    0099 E004      LDI	R16,4
    009A E010      LDI	R17,0
    009B 940E004B  CALL	_delay_us
(0045) 		errTime++;
    009D 9543      INC	R20
(0046) 		if(errTime>50)
    009E E382      LDI	R24,0x32
    009F 1784      CP	R24,R20
    00A0 F410      BCC	0x00A3
(0047) 		return(0x00);		//如果等大于5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
    00A1 2700      CLR	R16
    00A2 C003      RJMP	0x00A6
    00A3 9B85      SBIS	0x10,5
    00A4 CFF4      RJMP	0x0099
(0048) 		}
(0049) 	return(0xff);
    00A5 EF0F      LDI	R16,0xFF
    00A6 940E02AC  CALL	pop_gset1
    00A8 9508      RET
_read_DS18B20:
  retVal               --> R20
  i                    --> R22
    00A9 940E02A7  CALL	push_gset2
(0050) 	}
(0051) 
(0052) /****************************************
(0053) * 函数名称: uchar read_DS18B20(void)	*
(0054) * 函数功能:读DS18B20一个字节			*
(0055) * 入    口:无							*
(0056) * 返    回:读出的数据字节				*
(0057) ****************************************/
(0058) uchar read_DS18B20(void)
(0059)     {
(0060) 	uchar i;
(0061) 	uchar retVal=0;
    00AB 2744      CLR	R20
(0062) 	RLS_DS18B20;		//释放总线
    00AC 988D      CBI	0x11,5
(0063) 	for(i=8;i>0;i--)
    00AD E068      LDI	R22,0x8
    00AE C01D      RJMP	0x00CC
(0064) 	    {
(0065) 	 	retVal>>=1;
    00AF 9546      LSR	R20
(0066) 	    HLD_DS18B20;	//Maga16控制总线
    00B0 9A8D      SBI	0x11,5
(0067) 		CLR_DS18B20;	//强制拉低
    00B1 9895      CBI	0x12,5
(0068) 		delay_us(5);		//延时大于1us	
    00B2 E005      LDI	R16,5
    00B3 E010      LDI	R17,0
    00B4 940E004B  CALL	_delay_us
(0069) 		RLS_DS18B20;		//释放总线,DS18B20会将总线强制拉低
    00B6 988D      CBI	0x11,5
(0070) 		delay_us(2);	
    00B7 E002      LDI	R16,2
    00B8 E010      LDI	R17,0
    00B9 940E004B  CALL	_delay_us
(0071) 		if(STU_DS18B20)
    00BB 9B85      SBIS	0x10,5
    00BC C001      RJMP	0x00BE
(0072) 		retVal|=0x80;
    00BD 6840      ORI	R20,0x80
(0073) 		delay_us(16);	 	//14.92us
    00BE E100      LDI	R16,0x10
    00BF E010      LDI	R17,0
    00C0 940E004B  CALL	_delay_us
(0074) 		delay_us(16);	 	//14.92us
    00C2 E100      LDI	R16,0x10
    00C3 E010      LDI	R17,0
    00C4 940E004B  CALL	_delay_us
(0075) 		RLS_DS18B20;		//释放总线
    00C6 988D      CBI	0x11,5
(0076) 		delay_us(35);	 	//30.38us
    00C7 E203      LDI	R16,0x23
    00C8 E010      LDI	R17,0
    00C9 940E004B  CALL	_delay_us
    00CB 956A      DEC	R22
    00CC E080      LDI	R24,0
    00CD 1786      CP	R24,R22
    00CE F300      BCS	0x00AF
(0077) 		}
(0078) 	delay_us(2);	 		//2.71us(大于1us就行了)
    00CF E002      LDI	R16,2
    00D0 E010      LDI	R17,0
    00D1 940E004B  CALL	_delay_us
(0079) 	return(retVal);
    00D3 2F04      MOV	R16,R20
    00D4 940E029B  CALL	pop_gset2
    00D6 9508      RET
_write_DS18B20:
  temp                 --> R20
  i                    --> R22
  wb                   --> R10
    00D7 940E02A5  CALL	push_gset3
    00D9 2EA0      MOV	R10,R16
(0080) 	}
(0081) 
(0082) /****************************************
(0083) * 函数名称: uchar write_DS18B20(void)	*
(0084) * 函数功能:写DS18B20一个字节			*
(0085) * 入    口:需写入的字节数据wb			*
(0086) * 返    回:无							*
(0087) ****************************************/
(0088) void write_DS18B20(uchar wb)
(0089)     {
(0090) 	uchar i;
(0091) 	uchar temp;
(0092) 	RLS_DS18B20;		//释放总线
    00DA 988D      CBI	0x11,5
(0093) 	for(i=0;i<8;i++)
    00DB 2766      CLR	R22
    00DC C01E      RJMP	0x00FB
(0094) 	    {
(0095) 		HLD_DS18B20;		//Maga16控制总线
    00DD 9A8D      SBI	0x11,5
(0096) 		CLR_DS18B20;		//强制拉低
    00DE 9895      CBI	0x12,5
(0097) 		delay_us(16);	 	//14.92us
    00DF E100      LDI	R16,0x10
    00E0 E010      LDI	R17,0
    00E1 940E004B  CALL	_delay_us
(0098) 		temp=wb>>i;
    00E3 2D0A      MOV	R16,R10
    00E4 2F16      MOV	R17,R22
    00E5 940E02C0  CALL	lsr8
    00E7 2F40      MOV	R20,R16
(0099) 		temp&=0x01;
    00E8 7041      ANDI	R20,1

⌨️ 快捷键说明

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