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

📄 can-18b20.lst

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0162) 			   {//str[0] = read_MCP (0x61);
(0163) 	            //str[1] = read_MCP (0x62);
(0164) 		        //str[2] = read_MCP (0x65);
(0165) 		        //str[3] = read_MCP (0x66);
(0166) 		         bit_modify(CANINTF, 0x01,0x00); //清除RX0IF标志
    00EB 2422      CLR	R2
    00EC 8228      STD	Y+0,R2
    00ED E021      LDI	R18,1
    00EE E20C      LDI	R16,0x2C
    00EF DF93      RCALL	_bit_modify
(0167) 				 		
(0168) 	           }
    00F0 9621      ADIW	R28,1
    00F1 D27E      RCALL	pop_gset1
    00F2 D2A8      RCALL	pop_lset
    00F3 9518      RETI
_crccheck:
  j                    --> R20
  r                    --> R14
  cbit                 --> Y+0
  bit0                 --> R8
  byte                 --> R10
  i                    --> R12
  temp                 --> R22
  len                  --> R6
  p                    --> R4
    00F4 D270      RCALL	push_gset5
    00F5 2E62      MOV	R6,R18
    00F6 0128      MOVW	R4,R16
    00F7 9721      SBIW	R28,1
(0169)       
(0170) }
(0171) 
(0172) /*===================================================================
(0173) //	函数功能:	DS18B20数据校验函数
(0174) //	形参:		void
(0175) //	返回:		unsigned char	校验结果
(0176) //	编写:		2004/8/25
(0177) //	备注:		CRC公式为:CRC = X^8 + X^5 + X^4 + 1
(0178) ===================================================================*/
(0179) unsigned char crccheck(unsigned char *p,unsigned char len)
(0180) {
(0181) 	unsigned char bit0,cbit,r,temp,i,j,byte;
(0182) 	temp = 0;
    00F8 2766      CLR	R22
(0183) 	for(j = 0; j < len; j++)
    00F9 2744      CLR	R20
    00FA C020      RJMP	0x011B
(0184) 	{
(0185) 		byte = p[j];
    00FB 2FE4      MOV	R30,R20
    00FC 27FF      CLR	R31
    00FD 0DE4      ADD	R30,R4
    00FE 1DF5      ADC	R31,R5
    00FF 80A0      LDD	R10,Z+0
(0186) 		for(i = 0; i < 8; i++)
    0100 24CC      CLR	R12
    0101 C015      RJMP	0x0117
(0187) 		{
(0188)         		cbit = temp & 0x01;
    0102 2F86      MOV	R24,R22
    0103 7081      ANDI	R24,1
    0104 8388      STD	Y+0,R24
(0189)         		bit0 = byte&0x01;
    0105 2D8A      MOV	R24,R10
    0106 7081      ANDI	R24,1
    0107 2E88      MOV	R8,R24
(0190)         		temp >>=   1;
    0108 9566      LSR	R22
(0191)         		r = cbit ^ bit0;
    0109 80E8      LDD	R14,Y+0
    010A 26E8      EOR	R14,R24
(0192)         		if(r == 1)
    010B 2D8E      MOV	R24,R14
    010C 3081      CPI	R24,1
    010D F439      BNE	0x0115
(0193)         			temp ^= 0x8c;
    010E E88C      LDI	R24,0x8C
    010F E090      LDI	R25,0
    0110 2E26      MOV	R2,R22
    0111 2433      CLR	R3
    0112 2628      EOR	R2,R24
    0113 2639      EOR	R3,R25
    0114 2D62      MOV	R22,R2
(0194)         		byte >>= 1;
    0115 94A6      LSR	R10
    0116 94C3      INC	R12
    0117 2D8C      MOV	R24,R12
    0118 3088      CPI	R24,0x8
    0119 F340      BCS	0x0102
    011A 9543      INC	R20
    011B 1546      CP	R20,R6
    011C F2F0      BCS	0x00FB
(0195)         	}
(0196)     	}
(0197) 	return	temp;	
    011D 2F06      MOV	R16,R22
    011E 9621      ADIW	R28,1
    011F D243      RCALL	pop_gset5
    0120 9508      RET
(0198) }
(0199) 
(0200) /*===================================================================
(0201) //	函数功能:	us延时函数
(0202) //	形参:		void
(0203) //	返回:		void
(0204) //	编写:		2004/8/25
(0205) ===================================================================*/
(0206) void	delay_us(unsigned int time)
(0207) {     
(0208) 	do
(0209) 	{ //delay_1us();
(0210) 		time--;
_delay_us:
  time                 --> R16
    0121 5001      SUBI	R16,1
    0122 4010      SBCI	R17,0
(0211) 	}	
(0212) 	while (time>1);
    0123 E081      LDI	R24,1
    0124 E090      LDI	R25,0
    0125 1780      CP	R24,R16
    0126 0791      CPC	R25,R17
    0127 F3C8      BCS	0x0121
    0128 9508      RET
_ds1820_ack:
  ack                  --> R20
    0129 D243      RCALL	push_gset1
(0213) }
(0214) 
(0215) /*===================================================================
(0216) //	函数功能:	判断总线应答
(0217) //	形参:		void
(0218) //	返回:		unsigned char	true为应答
(0219) //	编写:		2004/8/25
(0220) ===================================================================*/
(0221) unsigned char ds1820_ack(void)
(0222) {
(0223) 	unsigned char ack;
(0224) 	DDRC |= DQ;
    012A 9AA5      SBI	0x14,5
(0225) 	PORTC &= ~DQ;
    012B 98AD      CBI	0x15,5
(0226) 	delay_us(450);							//	reset
    012C EC02      LDI	R16,0xC2
    012D E011      LDI	R17,1
    012E DFF2      RCALL	_delay_us
(0227) 	PORTC |= DQ;
    012F 9AAD      SBI	0x15,5
(0228) 	DDRC &= ~DQ;
    0130 98A5      CBI	0x14,5
(0229) 	delay_us(45);
    0131 E20D      LDI	R16,0x2D
    0132 E010      LDI	R17,0
    0133 DFED      RCALL	_delay_us
(0230) 	ack = DQ & PIND;
    0134 B340      IN	R20,0x10
    0135 7240      ANDI	R20,0x20
(0231) 	delay_us(450);							//	host receive
    0136 EC02      LDI	R16,0xC2
    0137 E011      LDI	R17,1
    0138 DFE8      RCALL	_delay_us
(0232) 	if(ack)
    0139 2344      TST	R20
    013A F011      BEQ	0x013D
(0233) 		return 1;
    013B E001      LDI	R16,1
    013C C001      RJMP	0x013E
(0234) 	else
(0235) 		return 0;
    013D 2700      CLR	R16
    013E D231      RCALL	pop_gset1
    013F 9508      RET
_read_byte:
  value                --> R20
  i                    --> R22
    0140 D22A      RCALL	push_gset2
(0236) }
(0237) 
(0238) /*===================================================================
(0239) //	函数功能:	从 1-wire 总线上读取一个字节
(0240) //	形参:		void
(0241) //	返回:		unsigned char	读到的值
(0242) //	编写:		2004/8/25
(0243) ===================================================================*/
(0244) unsigned char	read_byte(void)
(0245) {
(0246) 	unsigned char	i;
(0247) 	unsigned char	value = 0;
    0141 2744      CLR	R20
(0248) 	for(i = 8; i > 0; i--)
    0142 E068      LDI	R22,0x8
    0143 C016      RJMP	0x015A
(0249) 	{
(0250) 		value >>= 1;						//	low bit first
    0144 9546      LSR	R20
(0251) 		DDRC |= DQ;
    0145 9AA5      SBI	0x14,5
(0252) 		PORTC &= ~DQ;						//	pull DQ low to start timeslot
    0146 98AD      CBI	0x15,5
(0253) 		delay_us(3);
    0147 E003      LDI	R16,3
    0148 E010      LDI	R17,0
    0149 DFD7      RCALL	_delay_us
(0254) 		PORTC |= DQ;
    014A 9AAD      SBI	0x15,5
(0255) 		DDRC &= ~DQ;						//	release bus
    014B 98A5      CBI	0x14,5
(0256) 		delay_us(10);
    014C E00A      LDI	R16,0xA
    014D E010      LDI	R17,0
    014E DFD2      RCALL	_delay_us
(0257) 		if(DQ & PINC)
    014F 9B9D      SBIS	0x13,5
    0150 C001      RJMP	0x0152
(0258) 		value|=0x80;
    0151 6840      ORI	R20,0x80
(0259) 		delay_us(100);
    0152 E604      LDI	R16,0x64
    0153 E010      LDI	R17,0
    0154 DFCC      RCALL	_delay_us
(0260) 		DDRC |= DQ;
    0155 9AA5      SBI	0x14,5
(0261) 		delay_us(5);						//	time interval
    0156 E005      LDI	R16,5
    0157 E010      LDI	R17,0
    0158 DFC8      RCALL	_delay_us
    0159 956A      DEC	R22
    015A 2422      CLR	R2
    015B 1626      CP	R2,R22
    015C F338      BCS	0x0144
(0262) 	}
(0263) 	return(value);
    015D 2F04      MOV	R16,R20
    015E D202      RCALL	pop_gset2
    015F 9508      RET
_write_byte:
  i                    --> R20
  value                --> R22
    0160 D20A      RCALL	push_gset2
    0161 2F60      MOV	R22,R16
(0264) }
(0265) 
(0266) /*===================================================================
(0267) //	函数功能:	向 1-WIRE 总线上写一个字节
(0268) //	形参:		value		写到总线上的值
(0269) //	返回:		void
(0270) //	编写:		2004/8/25
(0271) ===================================================================*/
(0272) void	write_byte(unsigned char value)
(0273) {
(0274) 	unsigned char	i;
(0275) 	DDRC |= DQ;
    0162 9AA5      SBI	0x14,5
(0276) 	for(i = 8; i > 0; i--)
    0163 E048      LDI	R20,0x8
    0164 C015      RJMP	0x017A
(0277) 	{
(0278) 		if(value & 0x01)
    0165 FF60      SBRS	R22,0
    0166 C009      RJMP	0x0170
(0279) 		{
(0280) 			PORTC &= ~DQ;					//	pull DQ low to start timeslot
    0167 98AD      CBI	0x15,5
(0281) 			delay_us(10);
    0168 E00A      LDI	R16,0xA
    0169 E010      LDI	R17,0
    016A DFB6      RCALL	_delay_us
(0282) 			PORTC |= DQ;
    016B 9AAD      SBI	0x15,5
(0283) 			delay_us(100);
    016C E604      LDI	R16,0x64
    016D E010      LDI	R17,0
    016E DFB2      RCALL	_delay_us
(0284) 		}
    016F C008      RJMP	0x0178
(0285) 		else
(0286) 		{
(0287) 			PORTC &= ~DQ;					//	pull DQ low to start timeslot
    0170 98AD      CBI	0x15,5
(0288) 			delay_us(100);
    0171 E604      LDI	R16,0x64
    0172 E010      LDI	R17,0
    0173 DFAD      RCALL	_delay_us
(0289) 			PORTC |= DQ;
    0174 9AAD      SBI	0x15,5
(0290) 			delay_us(10);
    0175 E00A      LDI	R16,0xA
    0176 E010      LDI	R17,0
    0177 DFA9      RCALL	_delay_us
(0291) 		}
(0292) 		value >>= 1;
    0178 9566      LSR	R22
    0179 954A      DEC	R20
    017A 2422      CLR	R2
    017B 1624      CP	R2,R20
    017C F340      BCS	0x0165
    017D D1E3      RCALL	pop_gset2
    017E 9508      RET
_wait:
  i                    --> R20
  n                    --> R22
    017F D1EB      RCALL	push_gset2
    0180 01B8      MOVW	R22,R16
(0293) 	}
(0294) }
(0295) 
(0296) /*===================================================================
(0297) //	函数功能:	读取温度
(0298) //	形参:		*temperature	温度存储空间
(0299) //	返回:		unsigned char	true为有效
(0300) //	编写:		2004/8/25
(0301) ===================================================================*/
(0302) /*unsigned char	Read_Temperature(unsigned int *temperature)
(0303) {
(0304) 	unsigned char	i;
(0305) 	union{
(0306) 		unsigned char c[2];
(0307) 		unsigned int x;
(0308) 	}temp;
(0309) 	unsigned char	temporary[9];
(0310) 
(0311) 	while(!ds1820_ack());
(0312) 	write_byte(0xCC);						//	Skip ROM
(0313) 	write_byte(0x44);						//	Start Conversion
(0314) 	//for(i = 0; i < 16; i++)
(0315) 		//delay_us(50000);
(0316) 	delay(20);
(0317) 	while(!ds1820_ack());
(0318) 	write_byte(0xCC);						//	Skip ROM
(0319) 	write_byte(0xBE);						//	Read Scratch Pad
(0320) 	for(i = 0; i < 9; i++)
(0321) 		temporary[i] = read_byte();
(0322) 	temp.c[0] = temporary[0];
(0323) 	temp.c[1] = temporary[1];
(0324) 	
(0325) 	if(crccheck(temporary,9))
(0326) 		return	0;
(0327) 	else
(0328) 	{	
(0329) 		*temperature = temp.x;
(0330) 		return	1;
(0331) 	}
(0332) }
(0333) */
(0334) /*===================================================================
(0335) //	函数功能:	读取Rom Code
(0336) //	形参:		*temp		DS18B20的Rom Code存储空间
(0337) //	返回:		unsigned char	true为有效
(0338) //	编写:		2004/8/25
(0339) ===================================================================*/
(0340) /*unsigned char	Read_RomCode(unsigned char *temp)
(0341) {
(0342) 	ds1820_ack();
(0343) 	write_byte(0x33);
(0344) 	temp[0] = read_byte();
(0345) 	temp[1] = read_byte();
(0346) 	temp[2] = read_byte();
(0347) 	temp[3] = read_byte();
(0348) 	temp[4] = read_byte();
(0349) 	temp[5] = read_byte();
(0350) 	temp[6] = read_byte();
(0351) 	temp[7] = read_byte();
(0352) 	if(crccheck(temp,8))
(0353) 		return	0;
(0354) 	else
(0355) 		return	1;
(0356) }
(0357) */
(0358) /*===================================================================
(0359) //	函数功能:	匹配DS18B20
(0360) //	形参:		*p	DS18B20的Rom Code
(0361) //	返回:		void
(0362) //	编写:		2004/8/25

⌨️ 快捷键说明

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