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

📄 ds1820.lst

📁 DS18B20的使用情况以及电路接法和原代码!可以参考做测温电路
💻 LST
📖 第 1 页 / 共 2 页
字号:
(0045) 	DQ_OUT;
    011F 9AD3      SBI	0x1A,3
(0046) 	DQ_CLR;
    0120 98DB      CBI	0x1B,3
(0047) 	delay_10us(49);				/*延时500uS(480-960)*/
    0121 E301      LDI	R16,0x31
    0122 DFE9      RCALL	_delay_10us
(0048) 	DQ_SET;
    0123 9ADB      SBI	0x1B,3
(0049) 	DQ_IN;
    0124 98D3      CBI	0x1A,3
(0050) 	delay_10us(7);				/*延时80uS*/
    0125 E007      LDI	R16,7
    0126 DFE5      RCALL	_delay_10us
(0051) 	i = DQ_R;
    0127 B349      IN	R20,0x19
    0128 7048      ANDI	R20,0x8
(0052) 	delay_10us(49);				/*延时500uS(保持>480uS)*/
    0129 E301      LDI	R16,0x31
    012A DFE1      RCALL	_delay_10us
(0053) 	if (flag & 0x80) {			/*恢复中断状态*/
    012B 90200073  LDS	R2,flag
    012D FE27      SBRS	R2,7
    012E C001      RJMP	0x0130
(0054) 		SEI();
    012F 9478      BSET	7
(0055) 		}
(0056) 	if (i) {
    0130 2344      TST	R20
    0131 F011      BEQ	0x0134
(0057) 		return 0x00;
    0132 2700      CLR	R16
    0133 C001      RJMP	0x0135
(0058) 		}
(0059) 	else {
(0060) 		return 0x01;
    0134 E001      LDI	R16,1
    0135 940E0257  CALL	pop_gset1
    0137 9508      RET
_ds1820_read_byte:
  value                --> R20
  i                    --> R22
    0138 940E0252  CALL	push_gset2
(0061) 		}
(0062) }
(0063) 
(0064) /*DS18B20字节读取函数*/
(0065) unsigned char ds1820_read_byte(void) {
(0066) 
(0067) 	unsigned char i;
(0068) 	unsigned char value = 0;
    013A 2744      CLR	R20
(0069) 	flag = SREG;				/*中断保护*/
    013B B62F      IN	R2,0x3F
    013C 92200073  STS	flag,R2
(0070) 	CLI();						/*关中断*/
    013E 94F8      BCLR	7
(0071) 	for (i = 8; i != 0; i--) {
    013F E068      LDI	R22,0x8
    0140 C019      RJMP	0x015A
(0072) 		value >>= 1;
    0141 9546      LSR	R20
(0073) 		DQ_OUT;
    0142 9AD3      SBI	0x1A,3
(0074) 		DQ_CLR;
    0143 98DB      CBI	0x1B,3
(0075) 		delay4us;					/*延时4uS*/
    0144 0000      NOP
    0145 0000      NOP
    0146 0000      NOP
    0147 0000      NOP
(0076) 		DQ_SET;
    0148 9ADB      SBI	0x1B,3
(0077) 		DQ_IN;
    0149 98D3      CBI	0x1A,3
(0078) 		delay10us;					/*延时10uS*/
    014A 0000      NOP
    014B 0000      NOP
    014C 0000      NOP
    014D 0000      NOP
    014E 0000      NOP
    014F 0000      NOP
    0150 0000      NOP
    0151 0000      NOP
    0152 0000      NOP
    0153 0000      NOP
(0079) 		if (DQ_R) {
    0154 9BCB      SBIS	0x19,3
    0155 C001      RJMP	0x0157
(0080) 			value|=0x80;
    0156 6840      ORI	R20,0x80
(0081) 			}
(0082) 		delay_10us(5);			/*延时60uS*/
    0157 E005      LDI	R16,5
    0158 DFB3      RCALL	_delay_10us
    0159 956A      DEC	R22
    015A 2366      TST	R22
    015B F729      BNE	0x0141
(0083) 		}
(0084) 	if (flag & 0x80) {			/*恢复中断状态*/
    015C 90200073  LDS	R2,flag
    015E FE27      SBRS	R2,7
    015F C001      RJMP	0x0161
(0085) 		SEI();
    0160 9478      BSET	7
(0086) 		}
(0087) 	return(value);
    0161 2F04      MOV	R16,R20
    0162 940E0246  CALL	pop_gset2
    0164 9508      RET
_ds1820_write_byte:
  i                    --> R20
  value                --> R22
    0165 940E0252  CALL	push_gset2
    0167 2F60      MOV	R22,R16
(0088) }
(0089) 
(0090) /*DS18B20字节写入函数*/
(0091) void ds1820_write_byte(unsigned char value) {
(0092) 
(0093) 	unsigned char i;
(0094) 	flag = SREG;				/*中断保护*/
    0168 B62F      IN	R2,0x3F
    0169 92200073  STS	flag,R2
(0095) 	CLI();						/*关中断*/
    016B 94F8      BCLR	7
(0096) 	for (i = 8; i != 0; i--) {
    016C E048      LDI	R20,0x8
    016D C00D      RJMP	0x017B
(0097) 		DQ_OUT;
    016E 9AD3      SBI	0x1A,3
(0098) 		DQ_CLR;
    016F 98DB      CBI	0x1B,3
(0099) 		delay4us;					/*延时4uS*/
    0170 0000      NOP
    0171 0000      NOP
    0172 0000      NOP
    0173 0000      NOP
(0100) 		if (value & 0x01) {DQ_SET;}
    0174 FD60      SBRC	R22,0
    0175 9ADB      SBI	0x1B,3
(0101) 		//每次都只写最低位,如果最低位是1的话输出高电平作为写1信号,否则无动作即为0						
(0102) 		delay_10us(7);			/*延时80uS*/
    0176 E007      LDI	R16,7
    0177 DF94      RCALL	_delay_10us
(0103) 		DQ_SET;					/*位结束*/
    0178 9ADB      SBI	0x1B,3
(0104) 		value >>= 1;
    0179 9566      LSR	R22
    017A 954A      DEC	R20
    017B 2344      TST	R20
    017C F789      BNE	0x016E
(0105) 		}
(0106) 	if (flag & 0x80) {			/*恢复中断状态*/
    017D 90200073  LDS	R2,flag
    017F FE27      SBRS	R2,7
    0180 C001      RJMP	0x0182
(0107) 		SEI();
    0181 9478      BSET	7
(0108) 		}
    0182 940E0246  CALL	pop_gset2
    0184 9508      RET
(0109) }
(0110) 
(0111) /*启动ds1820转换*/
(0112) void ds1820_start(void) {
(0113) 
(0114) 	ds1820_reset();
_ds1820_start:
    0185 DF93      RCALL	_ds1820_reset
(0115) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    0186 EC0C      LDI	R16,0xCC
    0187 DFDD      RCALL	_ds1820_write_byte
(0116) 	ds1820_write_byte(0x44);	/*启动转换*/
    0188 E404      LDI	R16,0x44
    0189 DFDB      RCALL	_ds1820_write_byte
    018A 9508      RET
_ds1820_read_temp:
  buf                  --> Y+0
  i                    --> R20
    018B 940E0254  CALL	push_gset1
    018D 9729      SBIW	R28,0x9
(0117) }
(0118) 
(0119) /*DS8B20读取温度信息*/
(0120) unsigned int ds1820_read_temp(void) {
(0121) 
(0122) 	unsigned int i;
(0123) 	unsigned char buf[9];
(0124) 
(0125) 	ds1820_reset();
    018E DF8A      RCALL	_ds1820_reset
(0126) 	ds1820_write_byte(0xCC);	/*勿略地址*/
    018F EC0C      LDI	R16,0xCC
    0190 DFD4      RCALL	_ds1820_write_byte
(0127) 	ds1820_write_byte(0xBE);	/*读取温度*/
    0191 EB0E      LDI	R16,0xBE
    0192 DFD2      RCALL	_ds1820_write_byte
(0128) 	for (i = 0; i < 9; i++) 
    0193 2744      CLR	R20
    0194 2755      CLR	R21
    0195 C008      RJMP	0x019E
(0129) 	    {
(0130) 		buf[i] = ds1820_read_byte();
    0196 DFA1      RCALL	_ds1820_read_byte
    0197 01CE      MOVW	R24,R28
    0198 01FA      MOVW	R30,R20
    0199 0FE8      ADD	R30,R24
    019A 1FF9      ADC	R31,R25
    019B 8300      STD	Z+0,R16
    019C 5F4F      SUBI	R20,0xFF
    019D 4F5F      SBCI	R21,0xFF
    019E 3049      CPI	R20,0x9
    019F E0E0      LDI	R30,0
    01A0 075E      CPC	R21,R30
    01A1 F3A0      BCS	0x0196
(0131) 		}
(0132) 	i = buf[1];
    01A2 8149      LDD	R20,Y+1
    01A3 2755      CLR	R21
(0133) 	i <<= 8;
    01A4 2F54      MOV	R21,R20
    01A5 2744      CLR	R20
(0134) 	i |= buf[0];
    01A6 8028      LDD	R2,Y+0
    01A7 2433      CLR	R3
    01A8 2942      OR	R20,R2
    01A9 2953      OR	R21,R3
(0135) 	
(0136) 	return i;
    01AA 018A      MOVW	R16,R20
    01AB 9629      ADIW	R28,0x9
    01AC 940E0257  CALL	pop_gset1
    01AE 9508      RET
_ds1820:
  i                    --> R20
    01AF 940E0254  CALL	push_gset1
(0137) }
(0138) void ds1820(void)
(0139) {unsigned int i;
(0140) ds1820_start();					/*启动一次转换*/
    01B1 DFD3      RCALL	_ds1820_start
(0141) 		delay_nms(300);					/*等待转换结束*/
    01B2 E20C      LDI	R16,0x2C
    01B3 E011      LDI	R17,1
    01B4 DEBB      RCALL	_delay_nms
(0142) 		i = ds1820_read_temp();			/*读取温度数值*/
    01B5 DFD5      RCALL	_ds1820_read_temp
    01B6 01A8      MOVW	R20,R16
(0143) 		i = (i * 10) / 16;				/*数值处理*/
    01B7 E00A      LDI	R16,0xA
    01B8 E010      LDI	R17,0
    01B9 019A      MOVW	R18,R20
    01BA 940E0236  CALL	empy16s
    01BC 01A8      MOVW	R20,R16
    01BD 9556      LSR	R21
    01BE 9547      ROR	R20
    01BF 9556      LSR	R21
    01C0 9547      ROR	R20
    01C1 9556      LSR	R21
    01C2 9547      ROR	R20
    01C3 9556      LSR	R21
    01C4 9547      ROR	R20
(0144) 		temp_1820[0] = i / 1000+48;			/*将显示信息加载到显示缓存区*/
    01C5 EE28      LDI	R18,0xE8
    01C6 E033      LDI	R19,3
    01C7 018A      MOVW	R16,R20
    01C8 940E021C  CALL	div16u
    01CA 01C8      MOVW	R24,R16
    01CB 96C0      ADIW	R24,0x30
    01CC 93800060  STS	temp_1820,R24
(0145) 		i = i % 1000;
    01CE EE28      LDI	R18,0xE8
    01CF E033      LDI	R19,3
    01D0 018A      MOVW	R16,R20
    01D1 940E021A  CALL	mod16u
    01D3 01A8      MOVW	R20,R16
(0146) 		temp_1820[1] = i / 100+48;
    01D4 E624      LDI	R18,0x64
    01D5 E030      LDI	R19,0
    01D6 940E021C  CALL	div16u
    01D8 01C8      MOVW	R24,R16
    01D9 96C0      ADIW	R24,0x30
    01DA 93800061  STS	temp_1820+1,R24
(0147) 		i = i % 100;
    01DC E624      LDI	R18,0x64
    01DD E030      LDI	R19,0
    01DE 018A      MOVW	R16,R20
    01DF 940E021A  CALL	mod16u
    01E1 01A8      MOVW	R20,R16
(0148) 		temp_1820[2] = i / 10+48;
    01E2 E02A      LDI	R18,0xA
    01E3 E030      LDI	R19,0
    01E4 940E021C  CALL	div16u
    01E6 01C8      MOVW	R24,R16
    01E7 96C0      ADIW	R24,0x30
    01E8 93800062  STS	temp_1820+2,R24
(0149) 		temp_1820[4] = i % 10+48;
    01EA E02A      LDI	R18,0xA
    01EB E030      LDI	R19,0
    01EC 018A      MOVW	R16,R20
    01ED 940E021A  CALL	mod16u
    01EF 01C8      MOVW	R24,R16
    01F0 96C0      ADIW	R24,0x30
    01F1 93800064  STS	0x64,R24
    01F3 940E0257  CALL	pop_gset1
    01F5 9508      RET
_main:
    01F6 9722      SBIW	R28,2
FILE: D:\avr\+++精华+++\+M16范例+\18b20\main.c
(0001) /***************************************
(0002) *              温度计                  *
(0003) * 程序功能: 用18b20探测温度            *
(0004) * 时钟频率: 内部1M                     *
(0005) * 设    计:莫锦攀                     *
(0006) * 修改日期:2007年07月29日             *
(0007) * 编译环境:ICC-AVR6.31                *
(0008) * 实验环境:M16学习板                  *
(0009) * 使用端口: LCD:PC4,PC5,PA4~PA7        *
(0010) *           18b20:PD7                  *
(0011) * 相关说明: 18b20延时要求精确所以单独  *
(0012) *           延时函数.                  *
(0013) *                                      *
(0014) ***************************************/
(0015) 
(0016) #include <iom16v.h>						/*包含相关头文件*/
(0017) #include "1602.h"
(0018) #include "delay.h"
(0019) #include "DS1820.h"
(0020) 
(0021) 
(0022) void main(void) {
(0023) 
(0024) 	
(0025) 
(0026) 	DDRA = 0x00;						/*方向输入*/
    01F7 2422      CLR	R2
    01F8 BA2A      OUT	0x1A,R2
(0027) 	PORTA = 0xFF;						/*打开上拉*/
    01F9 EF8F      LDI	R24,0xFF
    01FA BB8B      OUT	0x1B,R24
(0028) 	DDRB = 0xFF;						/*方向输出*/
    01FB BB87      OUT	0x17,R24
(0029) 	PORTB = 0xF0;						/*电平设置*/
    01FC EF80      LDI	R24,0xF0
    01FD BB88      OUT	0x18,R24
(0030) 	DDRC = 0x00;
    01FE BA24      OUT	0x14,R2
(0031) 	PORTC = 0xFF;
    01FF EF8F      LDI	R24,0xFF
    0200 BB85      OUT	0x15,R24
(0032) 	DDRD = 0x00;
    0201 BA21      OUT	0x11,R2
(0033) 	PORTD = 0xFF;
    0202 BB82      OUT	0x12,R24
(0034) 
(0035) 	delay_nms(100);
    0203 E604      LDI	R16,0x64
    0204 E010      LDI	R17,0
    0205 DE6A      RCALL	_delay_nms
(0036) 	//ds1820_reset();						/*复位D18B20*/
(0037) 	LCD_init();						/*启动显示任务*/
    0206 DE78      RCALL	_LCD_init
(0038) 	LCD_write_string(2,0,"Temperature");
    0207 E687      LDI	R24,0x67
    0208 E090      LDI	R25,0
    0209 8399      STD	Y+1,R25
    020A 8388      STD	Y+0,R24
    020B 2722      CLR	R18
    020C E002      LDI	R16,2
    020D DEDC      RCALL	_LCD_write_string
    020E C008      RJMP	0x0217
(0039) 	while (1) {
(0040) 		ds1820();
    020F DF9F      RCALL	_ds1820
(0041) 		LCD_write_string(4,1,temp_1820);
FILE: <library>
    0210 E680      LDI	R24,0x60
    0211 E090      LDI	R25,0
    0212 8399      STD	Y+1,R25
    0213 8388      STD	Y+0,R24
    0214 E021      LDI	R18,1
    0215 E004      LDI	R16,4
    0216 DED3      RCALL	_LCD_write_string
    0217 CFF7      RJMP	0x020F
    0218 9622      ADIW	R28,2
    0219 9508      RET
mod16u:
    021A 9468      BSET	6
    021B C001      RJMP	xdiv16u
div16u:
    021C 94E8      BCLR	6
xdiv16u:
    021D 92EA      ST	R14,-Y
    021E 92FA      ST	R15,-Y
    021F 938A      ST	R24,-Y
    0220 24EE      CLR	R14
    0221 24FF      CLR	R15
    0222 E180      LDI	R24,0x10
    0223 0F00      LSL	R16
    0224 1F11      ROL	R17
    0225 1CEE      ROL	R14
    0226 1CFF      ROL	R15
    0227 16E2      CP	R14,R18
    0228 06F3      CPC	R15,R19
    0229 F018      BCS	0x022D
    022A 1AE2      SUB	R14,R18
    022B 0AF3      SBC	R15,R19
    022C 9503      INC	R16
    022D 958A      DEC	R24
    022E F7A1      BNE	0x0223
    022F F416      BRTC	0x0232
    0230 2D0E      MOV	R16,R14
    0231 2D1F      MOV	R17,R15
    0232 9189      LD	R24,Y+
    0233 90F9      LD	R15,Y+
    0234 90E9      LD	R14,Y+
    0235 9508      RET
empy16s:
    0236 920A      ST	R0,-Y
    0237 921A      ST	R1,-Y
    0238 938A      ST	R24,-Y
    0239 939A      ST	R25,-Y
    023A 9F02      MUL	R16,R18
    023B 01C0      MOVW	R24,R0
    023C 9F12      MUL	R17,R18
    023D 0D90      ADD	R25,R0
    023E 9F03      MUL	R16,R19
    023F 0D90      ADD	R25,R0
    0240 018C      MOVW	R16,R24
    0241 9199      LD	R25,Y+
    0242 9189      LD	R24,Y+
    0243 9019      LD	R1,Y+
    0244 9009      LD	R0,Y+
    0245 9508      RET
pop_gset2:
    0246 E0E2      LDI	R30,2
    0247 940C0258  JMP	pop
pop_gset3:
    0249 E0E4      LDI	R30,4
    024A 940C0258  JMP	pop
push_gset5:
    024C 92FA      ST	R15,-Y
    024D 92EA      ST	R14,-Y
push_gset4:
    024E 92DA      ST	R13,-Y
    024F 92CA      ST	R12,-Y
push_gset3:
    0250 92BA      ST	R11,-Y
    0251 92AA      ST	R10,-Y
push_gset2:
    0252 937A      ST	R23,-Y
    0253 936A      ST	R22,-Y
push_gset1:
    0254 935A      ST	R21,-Y
    0255 934A      ST	R20,-Y
    0256 9508      RET
pop_gset1:
    0257 E0E1      LDI	R30,1
pop:
    0258 9149      LD	R20,Y+
    0259 9159      LD	R21,Y+
    025A FDE0      SBRC	R30,0
    025B 9508      RET
    025C 9169      LD	R22,Y+
    025D 9179      LD	R23,Y+
    025E FDE1      SBRC	R30,1
    025F 9508      RET
    0260 90A9      LD	R10,Y+
    0261 90B9      LD	R11,Y+
    0262 FDE2      SBRC	R30,2
    0263 9508      RET
    0264 90C9      LD	R12,Y+
    0265 90D9      LD	R13,Y+
    0266 FDE3      SBRC	R30,3
    0267 9508      RET
    0268 90E9      LD	R14,Y+
    0269 90F9      LD	R15,Y+
    026A 9508      RET

⌨️ 快捷键说明

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