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

📄 ds1820.lst

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0048) 
(0049) /*延时函数*/
(0050) /*频率为1MHz,延时:i X 10 + 16uS*/
(0051) void delay_10us(unsigned char i) {
(0052) 
(0053) 	if (i == 0) {
_delay_10us:
  i                    --> R16
    0131 2300      TST	R16
    0132 F429      BNE	0x0138
(0054) 		return ;
    0133 C009      RJMP	0x013D
(0055) 		}
(0056) 	while (i--) {
(0057) 		NOP();
    0134 0000      NOP
(0058) 		NOP();
    0135 0000      NOP
(0059) 		NOP();
    0136 0000      NOP
(0060) 		NOP();
    0137 0000      NOP
    0138 2E20      MOV	R2,R16
    0139 2433      CLR	R3
    013A 5001      SUBI	R16,1
    013B 2022      TST	R2
    013C F7B9      BNE	0x0134
    013D 9508      RET
_ds1820_reset:
  i                    --> R20
    013E 940E0223  CALL	push_gset1
(0061) 		}
(0062) }
(0063) 
(0064) /*DS18B20复位函数*/
(0065) unsigned char ds1820_reset(void) {
(0066) 
(0067) 	unsigned char i;
(0068) 	flag = SREG;				/*中断保护*/
    0140 B62F      IN	R2,0x3F
    0141 92200076  STS	flag,R2
(0069) 	CLI();						/*关中断*/
    0143 94F8      BCLR	7
(0070) 	DQ_OUT;
    0144 9AD7      SBI	0x1A,7
(0071) 	DQ_CLR;
    0145 98DF      CBI	0x1B,7
(0072) 	delay_10us(49);				/*延时500uS(480-960)*/
    0146 E301      LDI	R16,0x31
    0147 DFE9      RCALL	_delay_10us
(0073) 	DQ_SET;
    0148 9ADF      SBI	0x1B,7
(0074) 	DQ_IN;
    0149 98D7      CBI	0x1A,7
(0075) 	delay_10us(7);				/*延时80uS*/
    014A E007      LDI	R16,7
    014B DFE5      RCALL	_delay_10us
(0076) 	i = DQ_R;
    014C B349      IN	R20,0x19
    014D 7840      ANDI	R20,0x80
(0077) 	delay_10us(49);				/*延时500uS(保持>480uS)*/
    014E E301      LDI	R16,0x31
    014F DFE1      RCALL	_delay_10us
(0078) 	if (flag & 0x80) {			/*恢复中断状态*/
    0150 90200076  LDS	R2,flag
    0152 FE27      SBRS	R2,7
    0153 C001      RJMP	0x0155
(0079) 		SEI();
    0154 9478      BSET	7
(0080) 		}
(0081) 	if (i) {
    0155 2344      TST	R20
    0156 F011      BEQ	0x0159
(0082) 		return 0x00;
    0157 2700      CLR	R16
    0158 C001      RJMP	0x015A
(0083) 		}
(0084) 	else {
(0085) 		return 0x01;
    0159 E001      LDI	R16,1
    015A 940E0226  CALL	pop_gset1
    015C 9508      RET
_ds1820_read_byte:
  value                --> R20
  i                    --> R22
    015D 940E0221  CALL	push_gset2
(0086) 		}
(0087) }
(0088) 
(0089) /*===================================================================
(0090) //	函数功能:	从 1-wire 总线上读取一个字节
(0091) //	形参:		void
(0092) //	返回:		unsigned char	读到的值
(0093) //	编写:		2004/8/25
(0094) ===================================================================*/
(0095) unsigned char ds1820_read_byte(void) {
(0096) 
(0097) 	unsigned char i;
(0098) 	unsigned char value = 0;
    015F 2744      CLR	R20
(0099) 	flag = SREG;				/*中断保护*/
    0160 B62F      IN	R2,0x3F
    0161 92200076  STS	flag,R2
(0100) 	CLI();						/*关中断*/
    0163 94F8      BCLR	7
(0101) 	for (i = 8; i != 0; i--) {
    0164 E068      LDI	R22,0x8
    0165 C019      RJMP	0x017F
(0102) 		value >>= 1;
    0166 9546      LSR	R20
(0103) 		DQ_OUT;
    0167 9AD7      SBI	0x1A,7
(0104) 		DQ_CLR;
    0168 98DF      CBI	0x1B,7
(0105) 		NOP();					/*延时4uS*/
    0169 0000      NOP
(0106) 		NOP();
    016A 0000      NOP
(0107) 		NOP();
    016B 0000      NOP
(0108) 		NOP();
    016C 0000      NOP
(0109) 		DQ_SET;
    016D 9ADF      SBI	0x1B,7
(0110) 		DQ_IN;
    016E 98D7      CBI	0x1A,7
(0111) 		NOP();					/*延时10uS*/
    016F 0000      NOP
(0112) 		NOP();
    0170 0000      NOP
(0113) 		NOP();
    0171 0000      NOP
(0114) 		NOP();
    0172 0000      NOP
(0115) 		NOP();
    0173 0000      NOP
(0116) 		NOP();
    0174 0000      NOP
(0117) 		NOP();
    0175 0000      NOP
(0118) 		NOP();
    0176 0000      NOP
(0119) 		NOP();
    0177 0000      NOP
(0120) 		NOP();
    0178 0000      NOP
(0121) 		if (DQ_R) {
    0179 9BCF      SBIS	0x19,7
    017A C001      RJMP	0x017C
(0122) 			value|=0x80;
    017B 6840      ORI	R20,0x80
(0123) 			}
(0124) 		delay_10us(5);			/*延时60uS*/
    017C E005      LDI	R16,5
    017D DFB3      RCALL	_delay_10us
    017E 956A      DEC	R22
    017F 2366      TST	R22
    0180 F729      BNE	0x0166
(0125) 		}
(0126) 	if (flag & 0x80) {			/*恢复中断状态*/
    0181 90200076  LDS	R2,flag
    0183 FE27      SBRS	R2,7
    0184 C001      RJMP	0x0186
(0127) 		SEI();
    0185 9478      BSET	7
(0128) 		}
(0129) 	return(value);
    0186 2F04      MOV	R16,R20
    0187 940E0218  CALL	pop_gset2
    0189 9508      RET
_ds1820_write_byte:
  i                    --> R20
  value                --> R22
    018A 940E0221  CALL	push_gset2
    018C 2F60      MOV	R22,R16
(0130) }
(0131) 
(0132) /*===================================================================
(0133) //	函数功能:	向 1-WIRE 总线上写一个字节
(0134) //	形参:		value		写到总线上的值
(0135) //	返回:		void
(0136) //	编写:		2004/8/25
(0137) ===================================================================*/
(0138) void ds1820_write_byte(unsigned char value) {
(0139) 
(0140) 	unsigned char i;
(0141) 	flag = SREG;				/*中断保护*/
    018D B62F      IN	R2,0x3F
    018E 92200076  STS	flag,R2
(0142) 	CLI();						/*关中断*/
    0190 94F8      BCLR	7
(0143) 	for (i = 8; i != 0; i--) {
    0191 E048      LDI	R20,0x8
    0192 C00D      RJMP	0x01A0
(0144) 		DQ_OUT;
    0193 9AD7      SBI	0x1A,7
(0145) 		DQ_CLR;
    0194 98DF      CBI	0x1B,7
(0146) 		NOP();					/*延时4uS*/
    0195 0000      NOP
(0147) 		NOP();
    0196 0000      NOP
(0148) 		NOP();
    0197 0000      NOP
(0149) 		NOP();
    0198 0000      NOP
(0150) 		if (value & 0x01) {
    0199 FD60      SBRC	R22,0
(0151) 			DQ_SET;
    019A 9ADF      SBI	0x1B,7
(0152) 			}
(0153) 		delay_10us(7);			/*延时80uS*/
    019B E007      LDI	R16,7
    019C DF94      RCALL	_delay_10us
(0154) 		DQ_SET;					/*位结束*/
    019D 9ADF      SBI	0x1B,7
(0155) 		value >>= 1;
    019E 9566      LSR	R22
    019F 954A      DEC	R20
    01A0 2344      TST	R20
    01A1 F789      BNE	0x0193
(0156) 		}
(0157) 	if (flag & 0x80) {			/*恢复中断状态*/
    01A2 90200076  LDS	R2,flag
    01A4 FE27      SBRS	R2,7
    01A5 C001      RJMP	0x01A7
(0158) 		SEI();
    01A6 9478      BSET	7
(0159) 		}
    01A7 940E0218  CALL	pop_gset2
    01A9 9508      RET
(0160) }
(0161) 
(0162) /*启动ds1820转换*/
(0163) void ds1820_start(void) {
(0164) 
(0165) 	ds1820_reset();
_ds1820_start:
    01AA DF93      RCALL	_ds1820_reset
(0166) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    01AB EC0C      LDI	R16,0xCC
    01AC DFDD      RCALL	_ds1820_write_byte
(0167) 	ds1820_write_byte(0x44);	/*启动转换*/
    01AD E404      LDI	R16,0x44
    01AE DFDB      RCALL	_ds1820_write_byte
    01AF 9508      RET
_ds1820_read_temp:
  buf                  --> Y+0
  i                    --> R20
    01B0 940E0223  CALL	push_gset1
    01B2 9729      SBIW	R28,0x9
(0168) }
(0169) 
(0170) /*===================================================================
(0171) //	函数功能:	读取温度
(0172) //	形参:		*temperature	温度存储空间
(0173) //	返回:		unsigned char	true为有效
(0174) //	编写:		2004/8/25
(0175) ===================================================================*/
(0176) unsigned int ds1820_read_temp(void) {
(0177) 
(0178) 	unsigned int i;
(0179) 	unsigned char buf[9];
(0180) 
(0181) 	ds1820_reset();
    01B3 DF8A      RCALL	_ds1820_reset
(0182) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    01B4 EC0C      LDI	R16,0xCC
    01B5 DFD4      RCALL	_ds1820_write_byte
(0183) 	ds1820_write_byte(0xBE);	/*读取温度*/
    01B6 EB0E      LDI	R16,0xBE
    01B7 DFD2      RCALL	_ds1820_write_byte
(0184) 	for (i = 0; i < 9; i++) {
    01B8 2744      CLR	R20
    01B9 2755      CLR	R21
    01BA C008      RJMP	0x01C3
(0185) 		buf[i] = ds1820_read_byte();
    01BB DFA1      RCALL	_ds1820_read_byte
    01BC 01CE      MOVW	R24,R28
    01BD 01FA      MOVW	R30,R20
    01BE 0FE8      ADD	R30,R24
    01BF 1FF9      ADC	R31,R25
    01C0 8300      STD	Z+0,R16
    01C1 5F4F      SUBI	R20,0xFF
    01C2 4F5F      SBCI	R21,0xFF
    01C3 3049      CPI	R20,0x9
    01C4 E0E0      LDI	R30,0
    01C5 075E      CPC	R21,R30
    01C6 F3A0      BCS	0x01BB
(0186) 		}
(0187) 	i = buf[1];
    01C7 8149      LDD	R20,Y+1
    01C8 2755      CLR	R21
(0188) 	i <<= 8;
    01C9 2F54      MOV	R21,R20
    01CA 2744      CLR	R20
(0189) 	i |= buf[0];
    01CB 8028      LDD	R2,Y+0
    01CC 2433      CLR	R3
    01CD 2942      OR	R20,R2
    01CE 2953      OR	R21,R3
(0190) 	
(0191) 	return i;
FILE: <library>
    01CF 018A      MOVW	R16,R20
    01D0 9629      ADIW	R28,0x9
    01D1 940E0226  CALL	pop_gset1
    01D3 9508      RET
mod16u:
    01D4 9468      BSET	6
    01D5 C001      RJMP	xdiv16u
div16u:
    01D6 94E8      BCLR	6
xdiv16u:
    01D7 92EA      ST	R14,-Y
    01D8 92FA      ST	R15,-Y
    01D9 938A      ST	R24,-Y
    01DA 24EE      CLR	R14
    01DB 24FF      CLR	R15
    01DC E180      LDI	R24,0x10
    01DD 0F00      LSL	R16
    01DE 1F11      ROL	R17
    01DF 1CEE      ROL	R14
    01E0 1CFF      ROL	R15
    01E1 16E2      CP	R14,R18
    01E2 06F3      CPC	R15,R19
    01E3 F018      BCS	0x01E7
    01E4 1AE2      SUB	R14,R18
    01E5 0AF3      SBC	R15,R19
    01E6 9503      INC	R16
    01E7 958A      DEC	R24
    01E8 F7A1      BNE	0x01DD
    01E9 F416      BRTC	0x01EC
    01EA 2D0E      MOV	R16,R14
    01EB 2D1F      MOV	R17,R15
    01EC 9189      LD	R24,Y+
    01ED 90F9      LD	R15,Y+
    01EE 90E9      LD	R14,Y+
    01EF 9508      RET
mod8u:
    01F0 9468      BSET	6
    01F1 C001      RJMP	xdiv8u
div8u:
    01F2 94E8      BCLR	6
xdiv8u:
    01F3 932A      ST	R18,-Y
    01F4 92FA      ST	R15,-Y
    01F5 92EA      ST	R14,-Y
    01F6 24FF      CLR	R15
    01F7 24EE      CLR	R14
    01F8 E120      LDI	R18,0x10
    01F9 0F00      LSL	R16
    01FA 1CFF      ROL	R15
    01FB 1CEE      ROL	R14
    01FC 16E1      CP	R14,R17
    01FD F010      BCS	0x0200
    01FE 1AE1      SUB	R14,R17
    01FF 9503      INC	R16
    0200 952A      DEC	R18
    0201 F7B9      BNE	0x01F9
    0202 F40E      BRTC	0x0204
    0203 2D0E      MOV	R16,R14
    0204 90E9      LD	R14,Y+
    0205 90F9      LD	R15,Y+
    0206 9129      LD	R18,Y+
    0207 9508      RET
empy16s:
    0208 920A      ST	R0,-Y
    0209 921A      ST	R1,-Y
    020A 938A      ST	R24,-Y
    020B 939A      ST	R25,-Y
    020C 9F02      MUL	R16,R18
    020D 01C0      MOVW	R24,R0
    020E 9F12      MUL	R17,R18
    020F 0D90      ADD	R25,R0
    0210 9F03      MUL	R16,R19
    0211 0D90      ADD	R25,R0
    0212 018C      MOVW	R16,R24
    0213 9199      LD	R25,Y+
    0214 9189      LD	R24,Y+
    0215 9019      LD	R1,Y+
    0216 9009      LD	R0,Y+
    0217 9508      RET
pop_gset2:
    0218 E0E2      LDI	R30,2
    0219 940C0227  JMP	pop
push_gset5:
    021B 92FA      ST	R15,-Y
    021C 92EA      ST	R14,-Y
push_gset4:
    021D 92DA      ST	R13,-Y
    021E 92CA      ST	R12,-Y
push_gset3:
    021F 92BA      ST	R11,-Y
    0220 92AA      ST	R10,-Y
push_gset2:
    0221 937A      ST	R23,-Y
    0222 936A      ST	R22,-Y
push_gset1:
    0223 935A      ST	R21,-Y
    0224 934A      ST	R20,-Y
    0225 9508      RET
pop_gset1:
    0226 E0E1      LDI	R30,1
pop:
    0227 9149      LD	R20,Y+
    0228 9159      LD	R21,Y+
    0229 FDE0      SBRC	R30,0
    022A 9508      RET
    022B 9169      LD	R22,Y+
    022C 9179      LD	R23,Y+
    022D FDE1      SBRC	R30,1
    022E 9508      RET
    022F 90A9      LD	R10,Y+
    0230 90B9      LD	R11,Y+
    0231 FDE2      SBRC	R30,2
    0232 9508      RET
    0233 90C9      LD	R12,Y+
    0234 90D9      LD	R13,Y+
    0235 FDE3      SBRC	R30,3
    0236 9508      RET
    0237 90E9      LD	R14,Y+
    0238 90F9      LD	R15,Y+
    0239 9508      RET

⌨️ 快捷键说明

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