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

📄 can-18b20.lst

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 LST
📖 第 1 页 / 共 4 页
字号:
(0363) ===================================================================*/
(0364) /*void ds1820_match(unsigned char *p)
(0365) {
(0366) 	unsigned char i;
(0367) 	ds1820_ack();
(0368) 	write_byte(0x55);	 
(0369) 	for(i=0;i<8;i++)
(0370) 		write_byte(p[i]);
(0371) }
(0372) */
(0373) 
(0374) 
(0375) /*nms delay*/
(0376) void wait(unsigned int n)
(0377) {unsigned int i;
(0378)  for(i=0;i<n;i++)
    0181 2744      CLR	R20
    0182 2755      CLR	R21
    0183 C003      RJMP	0x0187
(0379)  delay_1ms();
    0184 D007      RCALL	_delay_1ms
    0185 5F4F      SUBI	R20,0xFF
    0186 4F5F      SBCI	R21,0xFF
    0187 1746      CP	R20,R22
    0188 0757      CPC	R21,R23
    0189 F3D0      BCS	0x0184
    018A D1D6      RCALL	pop_gset2
    018B 9508      RET
(0380) }
(0381) 
(0382) /*1ms delay*/
(0383) void delay_1ms(void)
(0384) {unsigned int i;
(0385)  for(i=0;i<1035;i++);
_delay_1ms:
  i                    --> R16
    018C 2700      CLR	R16
    018D 2711      CLR	R17
    018E C002      RJMP	0x0191
    018F 5F0F      SUBI	R16,0xFF
    0190 4F1F      SBCI	R17,0xFF
    0191 300B      CPI	R16,0xB
    0192 E0E4      LDI	R30,4
    0193 071E      CPC	R17,R30
    0194 F3D0      BCS	0x018F
    0195 9508      RET
_delay:
  i                    --> R20
  n                    --> R16
    0196 D1D6      RCALL	push_gset1
(0386) }
(0387) 
(0388) void delay(unsigned int n)
(0389) { unsigned int i;
(0390)   for(i=0;i<n;i++)
    0197 2744      CLR	R20
    0198 2755      CLR	R21
    0199 C003      RJMP	0x019D
(0391)    asm("nop");
    019A 0000      NOP
    019B 5F4F      SUBI	R20,0xFF
    019C 4F5F      SBCI	R21,0xFF
    019D 1740      CP	R20,R16
    019E 0751      CPC	R21,R17
    019F F3D0      BCS	0x019A
    01A0 D1CF      RCALL	pop_gset1
    01A1 9508      RET
_HC595_SENDDAT:
  i                    --> R20
  dat                  --> R16
    01A2 D1CA      RCALL	push_gset1
(0392) }
(0393) 
(0394) /*595数据传输*/
(0395) void HC595_SENDDAT(unsigned char dat)
(0396) {unsigned char i;
(0397)   C_CS;  //cs 拉低
    01A3 98A9      CBI	0x15,1
(0398)   asm("nop");
    01A4 0000      NOP
(0399)   for(i=0;i<8;i++)
    01A5 2744      CLR	R20
    01A6 C00B      RJMP	0x01B2
(0400)   {C_CLK ;  //时钟拉低
    01A7 98A8      CBI	0x15,0
(0401)      asm("nop");
    01A8 0000      NOP
(0402)      if((dat&0x80)!=0)
    01A9 FF07      SBRS	R16,7
    01AA C002      RJMP	0x01AD
(0403)      S_DATA;
    01AB 9AAA      SBI	0x15,2
    01AC C001      RJMP	0x01AE
(0404)      else
(0405)      C_DATA; 
    01AD 98AA      CBI	0x15,2
(0406)      dat<<=1;
    01AE 0F00      LSL	R16
(0407) 	 asm("nop");
    01AF 0000      NOP
(0408)   S_CLK;  // 时钟拉高
    01B0 9AA8      SBI	0x15,0
    01B1 9543      INC	R20
    01B2 3048      CPI	R20,0x8
    01B3 F398      BCS	0x01A7
(0409)  }
(0410)  S_CS;  //cs 拉高
    01B4 9AA9      SBI	0x15,1
    01B5 D1BA      RCALL	pop_gset1
    01B6 9508      RET
_time0_ovf_isr:
    01B7 D1CC      RCALL	push_lset
(0411) }
(0412) //定时器1中断,1ms中断一次
(0413) #pragma interrupt_handler time0_ovf_isr:10
(0414) void time0_ovf_isr(void)
(0415) {
(0416)  TCNT0=0xF8; //重新装置
    01B8 EF88      LDI	R24,0xF8
    01B9 BF82      OUT	0x32,R24
(0417)  count++;
    01BA 91800070  LDS	R24,count
    01BC 91900071  LDS	R25,count+1
    01BE 9601      ADIW	R24,1
    01BF 93900071  STS	count+1,R25
    01C1 93800070  STS	count,R24
(0418)  if(count>=100)  //100ms
    01C3 3684      CPI	R24,0x64
    01C4 E0E0      LDI	R30,0
    01C5 079E      CPC	R25,R30
    01C6 F030      BCS	0x01CD
(0419)     count=0;
    01C7 2422      CLR	R2
    01C8 2433      CLR	R3
    01C9 92300071  STS	count+1,R3
    01CB 92200070  STS	count,R2
(0420)    if(flag==0)
    01CD 90200060  LDS	R2,flag
    01CF 2022      TST	R2
    01D0 F491      BNE	0x01E3
(0421)      {     flag=1;
    01D1 E081      LDI	R24,1
    01D2 93800060  STS	flag,R24
(0422) 	        //个位显示
(0423) 	       PORTC&=(~0x18);
    01D4 B385      IN	R24,0x15
    01D5 7E87      ANDI	R24,0xE7
    01D6 BB85      OUT	0x15,R24
(0424) 		   HC595_SENDDAT(table[ge]|0x80); //加小数点
    01D7 E681      LDI	R24,0x61
    01D8 E090      LDI	R25,0
    01D9 91E0006D  LDS	R30,ge
    01DB 27FF      CLR	R31
    01DC 0FE8      ADD	R30,R24
    01DD 1FF9      ADC	R31,R25
    01DE 8100      LDD	R16,Z+0
    01DF 6800      ORI	R16,0x80
    01E0 DFC1      RCALL	_HC595_SENDDAT
(0425) 		   PORTC|=0x10;
    01E1 9AAC      SBI	0x15,4
(0426) 		   }
    01E2 C010      RJMP	0x01F3
(0427) 	else
(0428) 	{     flag=0;		     
    01E3 2422      CLR	R2
    01E4 92200060  STS	flag,R2
(0429) 		   //十位显示
(0430) 		   PORTC&=(~0x18);
    01E6 B385      IN	R24,0x15
    01E7 7E87      ANDI	R24,0xE7
    01E8 BB85      OUT	0x15,R24
(0431) 		   HC595_SENDDAT(table[shi]); 
    01E9 E681      LDI	R24,0x61
    01EA E090      LDI	R25,0
    01EB 91E0006E  LDS	R30,shi
    01ED 27FF      CLR	R31
    01EE 0FE8      ADD	R30,R24
    01EF 1FF9      ADC	R31,R25
    01F0 8100      LDD	R16,Z+0
    01F1 DFB0      RCALL	_HC595_SENDDAT
(0432) 		   PORTC|=0x08;
    01F2 9AAB      SBI	0x15,3
(0433) 		   }
    01F3 D1A7      RCALL	pop_lset
    01F4 9518      RETI
_main:
  m                    --> R12
  a                    --> R10
  temh                 --> R20
  teml                 --> R22
  i                    --> R12
  temporary            --> Y+0
  j                    --> R14
    01F5 9729      SBIW	R28,0x9
(0434) 		   
(0435) }
(0436) 
(0437) /*************************** 主机先发送,等待接收***************************/
(0438) /* 说明:外部中断0不使能,如果允许,显示保持不住。*/
(0439) void main( void )
(0440) {	unsigned char	i,j;
(0441) 	unsigned char teml,temh;
(0442)     unsigned char a=0; 
    01F6 24AA      CLR	R10
(0443)     unsigned int m;
(0444) 	unsigned char	temporary[9];
(0445) 	 //M8 端口初始化
(0446) 	 PORTB=0x07;  //MCP2515 disable(CS,PB2),PB1,PB0上、下行灯灭
    01F7 E087      LDI	R24,7
    01F8 BB88      OUT	0x18,R24
(0447)      DDRB|=0x07; 
    01F9 B387      IN	R24,0x17
    01FA 6087      ORI	R24,7
    01FB BB87      OUT	0x17,R24
(0448) 	 DDRD=0xC0;  //1100 0000 PD7、PD6输出保持,PD5、PD4按键输入	
    01FC EC80      LDI	R24,0xC0
    01FD BB81      OUT	0x11,R24
(0449) 	 PORTC=0x02;  //CS disable
    01FE E082      LDI	R24,2
    01FF BB85      OUT	0x15,R24
(0450) 	 DDRC|=0x1F;    //PC3为595的位选COM2(十位),PC4为595的位选COM1(个位)+595(PC0、PC1、PC2)
    0200 B384      IN	R24,0x14
    0201 618F      ORI	R24,0x1F
    0202 BB84      OUT	0x14,R24
(0451) 	 /*use int0*/
(0452) 	// GICR|=0x40;   //int0 enable
(0453) 	//MCUCR|=0x02;  //下降沿触发中断0
(0454) 	//uart_init();  //串口初始化
(0455) 	//初始化SPI
(0456) 	 init_SPI();
    0203 DE46      RCALL	_init_SPI
(0457) 	//reset mcp2515
(0458)    	 reset_MCP();  
    0204 DE4B      RCALL	_reset_MCP
(0459) 	//初始化 CAN
(0460)      init_can();
    0205 DEA2      RCALL	_init_can
(0461) 	 minus_flag=0; //初始化负温度标志
    0206 2422      CLR	R2
    0207 9220006B  STS	minus_flag,R2
(0462) 	 CLI(); //关中断
    0209 94F8      BCLR	7
(0463) 	//矫正第一次数据,不矫正第一次显示85
(0464) 	    while(!ds1820_ack());
    020A DF1E      RCALL	_ds1820_ack
    020B 2300      TST	R16
    020C F3E9      BEQ	0x020A
(0465) 	    write_byte(0xCC);						//	Skip ROM
    020D EC0C      LDI	R16,0xCC
    020E DF51      RCALL	_write_byte
(0466) 	    write_byte(0x44);						//	Start Conversion
    020F E404      LDI	R16,0x44
    0210 DF4F      RCALL	_write_byte
(0467) 	    wait(750);
    0211 EE0E      LDI	R16,0xEE
    0212 E012      LDI	R17,2
    0213 DF6B      RCALL	_wait
(0468) 	    while(!ds1820_ack());
    0214 DF14      RCALL	_ds1820_ack
    0215 2300      TST	R16
    0216 F3E9      BEQ	0x0214
(0469) 		write_byte(0xCC);						//	Skip ROM
    0217 EC0C      LDI	R16,0xCC
    0218 DF47      RCALL	_write_byte
(0470) 	    write_byte(0xBE);						//	Read Scratch Pad
    0219 EB0E      LDI	R16,0xBE
    021A DF45      RCALL	_write_byte
(0471) 	 	teml = read_byte();	
    021B DF24      RCALL	_read_byte
    021C 2F60      MOV	R22,R16
(0472) 		temh = read_byte();	
    021D DF22      RCALL	_read_byte
    021E 2F40      MOV	R20,R16
(0473) 		m=temh*256+teml;
    021F 2F24      MOV	R18,R20
    0220 2733      CLR	R19
    0221 E000      LDI	R16,0
    0222 E011      LDI	R17,1
    0223 D12D      RCALL	empy16s
    0224 0168      MOVW	R12,R16
    0225 2E26      MOV	R2,R22
    0226 2433      CLR	R3
    0227 0CC2      ADD	R12,R2
    0228 1CD3      ADC	R13,R3
(0474) 		  if ((m&0xf800)!=0)
    0229 01C6      MOVW	R24,R12
    022A 7080      ANDI	R24,0
    022B 7F98      ANDI	R25,0xF8
    022C 3080      CPI	R24,0
    022D 0789      CPC	R24,R25
    022E F089      BEQ	0x0240
(0475)              {minus_flag=1;
    022F E081      LDI	R24,1
    0230 9380006B  STS	minus_flag,R24
(0476) 			  m=(~m)+1; //取反
    0232 01C6      MOVW	R24,R12
    0233 9580      COM	R24
    0234 9590      COM	R25
    0235 9601      ADIW	R24,1
    0236 016C      MOVW	R12,R24
(0477)               a=(unsigned char)((m*5)/80);}
    0237 E005      LDI	R16,5
    0238 E010      LDI	R17,0
    0239 019C      MOVW	R18,R24
    023A D116      RCALL	empy16s
    023B E520      LDI	R18,0x50
    023C E030      LDI	R19,0
    023D D0E1      RCALL	div16u
    023E 2EA0      MOV	R10,R16
    023F C008      RJMP	0x0248
(0478)           else
(0479)               a=(unsigned char)((m*5)/80);
    0240 E005      LDI	R16,5
    0241 E010      LDI	R17,0
    0242 0196      MOVW	R18,R12
    0243 D10D      RCALL	empy16s
    0244 E520      LDI	R18,0x50
    0245 E030      LDI	R19,0
    0246 D0D8      RCALL	div16u
    0247 2EA0      MOV	R10,R16
(0480) 		shi=a/10;
    0248 E01A      LDI	R17,0xA
    0249 2D0A      MOV	R16,R10
    024A D0F0      RCALL	div8u
    024B 9300006E  STS	shi,R16
(0481)         ge=a%10;
    024D E01A      LDI	R17,0xA
    024E 2D0A      MOV	R16,R10
    024F D0E9      RCALL	mod8u
    0250 9300006D  STS	ge,R16
(0482) 		if(minus_flag==1)
    0252 9180006B  LDS	R24,minus_flag
    0254 3081      CPI	R24,1
    0255 F429      BNE	0x025B
(0483) 		wendu=a|0x80; //暂时做 char处理
    0256 2D8A      MOV	R24,R10
    0257 6880      ORI	R24,0x80
    0258 9380006F  STS	wendu,R24
    025A C002      RJMP	0x025D
(0484) 		else
(0485) 		wendu=a;
    025B 92A0006F  STS	wendu,R10
(0486) 	TCNT0=0xF8;//1ms
    025D EF88      LDI	R24,0xF8
    025E BF82      OUT	0x32,R24
(0487) 	TCCR0=5; //1024
    025F E085      LDI	R24,5
    0260 BF83      OUT	0x33,R24
(0488) 	TIMSK=(1<<TOIE0);
    0261 E081      LDI	R24,1
    0262 BF89      OUT	0x39,R24
(0489) 	count=0;
    0263 2422      CLR	R2
    0264 2433      CLR	R3
    0265 92300071  STS	count+1,R3
    0267 92200070  STS	count,R2
(0490) 	dot1=0;
    0269 9220006C  STS	dot1,R2
(0491) 	//开中断
(0492) 	SEI(); 
    026B 9478      BSET	7
    026C C0AD      RJMP	0x031A
(0493) 	while(1)
(0494) 	{ if(count==0)
    026D 90200070  LDS	R2,count
    026F 90300071  LDS	R3,count+1
    0271 2022      TST	R2
    0272 F009      BEQ	0x0274
    0273 C0A6      RJMP	0x031A
    0274 2033      TST	R3
    0275 F009      BEQ	0x0277
    0276 C0A3      RJMP	0x031A
(0495) 	   { fill_msg_box_0(); //填充CAN数据
    0277 DE1E      RCALL	_fill_msg_box_0

⌨️ 快捷键说明

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