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

📄 main.lss

📁 avr当中的一个简单的温度测试程序和学习avr中的一些笔记
💻 LSS
📖 第 1 页 / 共 3 页
字号:
 174:	30 e0       	ldi	r19, 0x00	; 0
 176:	a3 e0       	ldi	r26, 0x03	; 3
 178:	b0 e0       	ldi	r27, 0x00	; 0
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 17a:	cd 01       	movw	r24, r26
 17c:	01 97       	sbiw	r24, 0x01	; 1
 17e:	f1 f7       	brne	.-4      	; 0x17c <Read_DS18B20+0x40>
 180:	21 50       	subi	r18, 0x01	; 1
 182:	30 40       	sbci	r19, 0x00	; 0
 184:	8f ef       	ldi	r24, 0xFF	; 255
 186:	2f 3f       	cpi	r18, 0xFF	; 255
 188:	38 07       	cpc	r19, r24
 18a:	b9 f7       	brne	.-18     	; 0x17a <Read_DS18B20+0x3e>
 18c:	5f 5f       	subi	r21, 0xFF	; 255
 18e:	58 30       	cpi	r21, 0x08	; 8
 190:	c9 f6       	brne	.-78     	; 0x144 <Read_DS18B20+0x8>
 192:	84 2f       	mov	r24, r20
 194:	99 27       	eor	r25, r25
 196:	08 95       	ret

00000198 <Write_DS18B20>:
 198:	48 2f       	mov	r20, r24
 19a:	50 e0       	ldi	r21, 0x00	; 0
 19c:	a3 e0       	ldi	r26, 0x03	; 3
 19e:	b0 e0       	ldi	r27, 0x00	; 0
 1a0:	d2 9a       	sbi	0x1a, 2	; 26
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1a2:	cd 01       	movw	r24, r26
 1a4:	01 97       	sbiw	r24, 0x01	; 1
 1a6:	f1 f7       	brne	.-4      	; 0x1a4 <Write_DS18B20+0xc>
 1a8:	cd 01       	movw	r24, r26
 1aa:	01 97       	sbiw	r24, 0x01	; 1
 1ac:	f1 f7       	brne	.-4      	; 0x1aa <Write_DS18B20+0x12>
 1ae:	40 ff       	sbrs	r20, 0
 1b0:	02 c0       	rjmp	.+4      	; 0x1b6 <Write_DS18B20+0x1e>
 1b2:	d2 98       	cbi	0x1a, 2	; 26
 1b4:	01 c0       	rjmp	.+2      	; 0x1b8 <Write_DS18B20+0x20>
 1b6:	d2 9a       	sbi	0x1a, 2	; 26
 1b8:	2d e3       	ldi	r18, 0x3D	; 61
 1ba:	30 e0       	ldi	r19, 0x00	; 0
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1bc:	e3 e0       	ldi	r30, 0x03	; 3
 1be:	f0 e0       	ldi	r31, 0x00	; 0
 1c0:	cf 01       	movw	r24, r30
 1c2:	01 97       	sbiw	r24, 0x01	; 1
 1c4:	f1 f7       	brne	.-4      	; 0x1c2 <Write_DS18B20+0x2a>
 1c6:	21 50       	subi	r18, 0x01	; 1
 1c8:	30 40       	sbci	r19, 0x00	; 0
 1ca:	8f ef       	ldi	r24, 0xFF	; 255
 1cc:	2f 3f       	cpi	r18, 0xFF	; 255
 1ce:	38 07       	cpc	r19, r24
 1d0:	a9 f7       	brne	.-22     	; 0x1bc <Write_DS18B20+0x24>
 1d2:	d2 98       	cbi	0x1a, 2	; 26
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1d4:	cf 01       	movw	r24, r30
 1d6:	01 97       	sbiw	r24, 0x01	; 1
 1d8:	f1 f7       	brne	.-4      	; 0x1d6 <Write_DS18B20+0x3e>
 1da:	31 97       	sbiw	r30, 0x01	; 1
 1dc:	f1 f7       	brne	.-4      	; 0x1da <Write_DS18B20+0x42>
 1de:	5f 5f       	subi	r21, 0xFF	; 255
 1e0:	58 30       	cpi	r21, 0x08	; 8
 1e2:	11 f0       	breq	.+4      	; 0x1e8 <Write_DS18B20+0x50>
 1e4:	46 95       	lsr	r20
 1e6:	dc cf       	rjmp	.-72     	; 0x1a0 <Write_DS18B20+0x8>
 1e8:	08 95       	ret

000001ea <Delayus>:
 1ea:	9c 01       	movw	r18, r24
 1ec:	e3 e0       	ldi	r30, 0x03	; 3
 1ee:	f0 e0       	ldi	r31, 0x00	; 0
 1f0:	03 c0       	rjmp	.+6      	; 0x1f8 <Delayus+0xe>
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 1f2:	cf 01       	movw	r24, r30
 1f4:	01 97       	sbiw	r24, 0x01	; 1
 1f6:	f1 f7       	brne	.-4      	; 0x1f4 <Delayus+0xa>
 1f8:	21 50       	subi	r18, 0x01	; 1
 1fa:	30 40       	sbci	r19, 0x00	; 0
 1fc:	8f ef       	ldi	r24, 0xFF	; 255
 1fe:	2f 3f       	cpi	r18, 0xFF	; 255
 200:	38 07       	cpc	r19, r24
 202:	b9 f7       	brne	.-18     	; 0x1f2 <Delayus+0x8>
 204:	08 95       	ret

00000206 <Delayms>:
	{
		_delay_loop_2(3);      //_delay_loop_2(1)是延时4个时钟周期,参数为3则延时12
		           //个时钟周期,本实验用12M晶体,则12个时钟周期为12/12=1us
    }
}

//ms级别的延时函数
void Delayms(unsigned int lms)
{
 206:	9c 01       	movw	r18, r24
 208:	0d c0       	rjmp	.+26     	; 0x224 <Delayms+0x1e>
	while(lms--)
 20a:	47 ee       	ldi	r20, 0xE7	; 231
 20c:	53 e0       	ldi	r21, 0x03	; 3
 20e:	e3 e0       	ldi	r30, 0x03	; 3
 210:	f0 e0       	ldi	r31, 0x00	; 0
 */
void
_delay_loop_2(uint16_t __count)
{
	__asm__ volatile (
 212:	cf 01       	movw	r24, r30
 214:	01 97       	sbiw	r24, 0x01	; 1
 216:	f1 f7       	brne	.-4      	; 0x214 <Delayms+0xe>
 218:	41 50       	subi	r20, 0x01	; 1
 21a:	50 40       	sbci	r21, 0x00	; 0
 21c:	8f ef       	ldi	r24, 0xFF	; 255
 21e:	4f 3f       	cpi	r20, 0xFF	; 255
 220:	58 07       	cpc	r21, r24
 222:	b9 f7       	brne	.-18     	; 0x212 <Delayms+0xc>
 224:	21 50       	subi	r18, 0x01	; 1
 226:	30 40       	sbci	r19, 0x00	; 0
 228:	8f ef       	ldi	r24, 0xFF	; 255
 22a:	2f 3f       	cpi	r18, 0xFF	; 255
 22c:	38 07       	cpc	r19, r24
 22e:	69 f7       	brne	.-38     	; 0x20a <Delayms+0x4>
 230:	08 95       	ret

00000232 <DS18B20_StartConvert>:
	{
		Delayus(1000);        //延时1ms
    }
}

//启动温度转换
void DS18B20_StartConvert(void)   
{
 232:	1f 93       	push	r17
	unsigned char i;
	
	DS18B20_Init();     //初始化DS18B20
 234:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
 238:	8c ec       	ldi	r24, 0xCC	; 204
 23a:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Write_DS18B20(DS18B20_CONVERT_RAM);  //	发送温度转换命令	
 23e:	84 e4       	ldi	r24, 0x44	; 68
 240:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
 244:	10 e0       	ldi	r17, 0x00	; 0
		
	for(i=0;i<50;i++)      //延时1S,等转换完成
	{
		Delayms(20);
 246:	84 e1       	ldi	r24, 0x14	; 20
 248:	90 e0       	ldi	r25, 0x00	; 0
 24a:	0e 94 03 01 	call	0x206	; 0x206 <Delayms>
 24e:	1f 5f       	subi	r17, 0xFF	; 255
 250:	12 33       	cpi	r17, 0x32	; 50
 252:	c9 f7       	brne	.-14     	; 0x246 <DS18B20_StartConvert+0x14>
 254:	1f 91       	pop	r17
 256:	08 95       	ret

00000258 <DS18B20_GetConvert>:
	}		
}

//获得温度转换结果
void DS18B20_GetConvert(void)
{
 258:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	DS18B20_Init();    //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
 25c:	8c ec       	ldi	r24, 0xCC	; 204
 25e:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
 262:	8e eb       	ldi	r24, 0xBE	; 190
 264:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Temp_L = Read_DS18B20(); //获得温度的低位
 268:	0e 94 9e 00 	call	0x13c	; 0x13c <Read_DS18B20>
 26c:	80 93 96 00 	sts	0x0096, r24
	
	Temp_H = Read_DS18B20(); //获得温度的高位
 270:	0e 94 9e 00 	call	0x13c	; 0x13c <Read_DS18B20>
 274:	80 93 a5 00 	sts	0x00A5, r24
 278:	08 95       	ret

0000027a <DS18B20_ReadRAM>:
}   

//启动温度转换,带ROM匹配
void DS18B20_StartConvert1(void)   
{
	unsigned char i;
	
	DS18B20_MatchROM();
		
	Write_DS18B20(DS18B20_CONVERT_RAM);  //	发送温度转换命令	
		
	for(i=0;i<50;i++)      //延时1S,等转换完成
	{
		Delayms(20);
	}		
}

//获得温度转换结果,带ROM匹配
void DS18B20_GetConvert1(void)
{
	DS18B20_MatchROM();
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
		
	Temp_L = Read_DS18B20(); //获得温度的低位
	
	Temp_H = Read_DS18B20(); //获得温度的高位
}   


 // 读取RAM内容
void DS18B20_ReadRAM(void)       
{
 27a:	cf 93       	push	r28
 27c:	df 93       	push	r29
	unsigned char i;
	
	DS18B20_Init();     //初始化DSDS18B20
 27e:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配		
 282:	8c ec       	ldi	r24, 0xCC	; 204
 284:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Write_DS18B20(DS18B20_READ_RAM);  //发送读取暂存器指令
 288:	8e eb       	ldi	r24, 0xBE	; 190
 28a:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
 28e:	c7 ea       	ldi	r28, 0xA7	; 167
 290:	d0 e0       	ldi	r29, 0x00	; 0
	
	for(i = 0;i < 9;i++)
	{
		ReadRAM_Buff[i] = Read_DS18B20();
 292:	0e 94 9e 00 	call	0x13c	; 0x13c <Read_DS18B20>
 296:	89 93       	st	Y+, r24
 298:	80 e0       	ldi	r24, 0x00	; 0
 29a:	c0 3b       	cpi	r28, 0xB0	; 176
 29c:	d8 07       	cpc	r29, r24
 29e:	c9 f7       	brne	.-14     	; 0x292 <DS18B20_ReadRAM+0x18>
 2a0:	df 91       	pop	r29
 2a2:	cf 91       	pop	r28
 2a4:	08 95       	ret

000002a6 <DS18B20_WriteRAM>:
	}	
}

//写温度上下限和配置寄存器到RAM
void DS18B20_WriteRAM(void)       
{
 2a6:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	DS18B20_Init();     //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
 2aa:	8c ec       	ldi	r24, 0xCC	; 204
 2ac:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
	
	Write_DS18B20(DS18B20_WRITE_RAM);  //	发送写RAM命令	
 2b0:	8e e4       	ldi	r24, 0x4E	; 78
 2b2:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Write_DS18B20(ThrH);        //写温度报警上限值
 2b6:	80 91 98 00 	lds	r24, 0x0098
 2ba:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
	Write_DS18B20(ThrL);        //写温度报警下限值
 2be:	80 91 99 00 	lds	r24, 0x0099
 2c2:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
	Write_DS18B20(CFG);         //写配置寄存器
 2c6:	80 91 97 00 	lds	r24, 0x0097
 2ca:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
 2ce:	08 95       	ret

000002d0 <DS18B20_CopyEEPROM>:
}

//复制RAM中的温度上下线和配置寄存器到EEPROM
void DS18B20_CopyEEPROM(void)     
{
 2d0:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	DS18B20_Init();     //初始化DSDS18B20
		
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
 2d4:	8c ec       	ldi	r24, 0xCC	; 204
 2d6:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
	
	Write_DS18B20(DS18B20_COPY_RAM);  //	发送复制命令	
 2da:	88 e4       	ldi	r24, 0x48	; 72
 2dc:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Delayms(20);   //  等待复制完成	
 2e0:	84 e1       	ldi	r24, 0x14	; 20
 2e2:	90 e0       	ldi	r25, 0x00	; 0
 2e4:	0e 94 03 01 	call	0x206	; 0x206 <Delayms>
 2e8:	08 95       	ret

000002ea <DS18B20_RecallRAM>:
}

//把EEPROM中的温度上下线和配置寄存器恢复到RAM
void DS18B20_RecallRAM(void)      
{
 2ea:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	DS18B20_Init();     //初始化DSDS18B20
	
	Write_DS18B20(DS18B20_SKIP_ROM);  //发送ROM指令,跳过ROM匹配
 2ee:	8c ec       	ldi	r24, 0xCC	; 204
 2f0:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
		
	Write_DS18B20(DS18B20_RECALL_EEPROM);  //	发送温度转换命令	
 2f4:	88 eb       	ldi	r24, 0xB8	; 184
 2f6:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
	
	Delayms(20);	
 2fa:	84 e1       	ldi	r24, 0x14	; 20
 2fc:	90 e0       	ldi	r25, 0x00	; 0
 2fe:	0e 94 03 01 	call	0x206	; 0x206 <Delayms>
 302:	08 95       	ret

00000304 <DS18B20_ReadROM>:
}

//读ROM,当总线上只有一个节点时,可以执行此操作
void DS18B20_ReadROM(void)
{
 304:	cf 93       	push	r28
 306:	df 93       	push	r29
	unsigned char i;
	
	DS18B20_Init();     //初始化DS18B20
 308:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	
	Write_DS18B20(DS18B20_READ_ROM);  //发送读ROM指令
 30c:	83 e3       	ldi	r24, 0x33	; 51
 30e:	0e 94 cc 00 	call	0x198	; 0x198 <Write_DS18B20>
 312:	ca e9       	ldi	r28, 0x9A	; 154
 314:	d0 e0       	ldi	r29, 0x00	; 0
	
	for(i = 0;i < 8;i++)
	{
		ReadROM_Buff[i] = Read_DS18B20();
 316:	0e 94 9e 00 	call	0x13c	; 0x13c <Read_DS18B20>
 31a:	89 93       	st	Y+, r24
 31c:	80 e0       	ldi	r24, 0x00	; 0
 31e:	c2 3a       	cpi	r28, 0xA2	; 162
 320:	d8 07       	cpc	r29, r24
 322:	c9 f7       	brne	.-14     	; 0x316 <DS18B20_ReadROM+0x12>
 324:	df 91       	pop	r29
 326:	cf 91       	pop	r28
 328:	08 95       	ret

0000032a <DS18B20_SearchROM>:
	}	
}   

//搜索ROM,确定总线上的节点数目和ROM内容
void DS18B20_SearchROM(void)  
{
 32a:	0e 94 69 00 	call	0xd2	; 0xd2 <DS18B20_Init>
	DS18B20_Init();     //初始化DS18B20
	
	Write_DS18B20(DS18B20_SEARCH_ROM);  //发送搜索ROM指令

⌨️ 快捷键说明

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