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

📄 charger.lst

📁 a good program for battery charge,only for reference
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0513)  SEI();						   //使能全局中断
    0562 9478      BSET	7
(0514)  timer1_init(); 			   //timer 1 interrupt sources
    0563 DB82      RCALL	_timer1_init
(0515)  TIMSK1 = 0x01; 			   //timer 1 interrupt sources
    0564 E081      LDI	R24,1
    0565 9380006F  STS	0x6F,R24
(0516)  TCNT1H = 0xFE; 			   //reload counter high value
    0567 EF8E      LDI	R24,0xFE
    0568 93800085  STS	0x85,R24
(0517)  TCNT1L = 0xAA; 			   //reload counter low value
    056A EA8A      LDI	R24,0xAA
    056B 93800084  STS	0x84,R24
(0518)  PORTD &= ~(1<<Red);		   //关闭红色指示灯
    056D 985A      CBI	0x0B,2
(0519)  PORTD &= ~(1<<Green);		   //关闭绿色指示灯
    056E 985B      CBI	0x0B,3
(0520)  adc_init();
    056F DC0F      RCALL	_adc_init
(0521)  adc_old=0;
    0570 2422      CLR	R2
    0571 2433      CLR	R3
    0572 9230011E  STS	adc_old+1,R3
    0574 9220011D  STS	adc_old,R2
(0522)  adc_rel=0;  
    0576 92300114  STS	adc_rel+1,R3
    0578 92200113  STS	adc_rel,R2
(0523) 	  
(0524) 		PORTB &= ~(1<<P0);	   //关断P0   0.8A恒流充电
    057A 9829      CBI	0x05,1
(0525) 		PORTD &= ~(1<<P1);	   //关断P1   0.8A恒流充电
    057B 985D      CBI	0x0B,5
(0526) 		PORTB &= ~(1<<P2);	   //关断P2   0.8A恒流充电
    057C 982F      CBI	0x05,7
(0527) 		PORTB |= (1<<P3);      //打开P3   0.8A恒流充电
    057D 9A2E      SBI	0x05,6
(0528) 
(0529)  temp |= (1<<anther);
    057E 91800116  LDS	R24,temp
    0580 6280      ORI	R24,0x20
    0581 93800116  STS	temp,R24
(0530)  alarm();  					   //检测过流、低压、过温 
    0583 DEDC      RCALL	_alarm
    0584 C1FF      RJMP	0x0784
(0531)  //------------------ 开始进入主流层 --------------------/ 	
(0532)   //------------------在2A负载情况下,-------------------/
(0533)  // 电池电压15.55V  ADC1=421  充电器输出15.8V 电池电压15.55V
(0534)  // 电池电压14.4V   ADC1=390   
(0535)  // 电池电压13.8V   ADC1=374
(0536)  // 电池电压13.2V   ADC1=358
(0537)  // 电池电压13.0V   ADC1=353  
(0538)  // 电池电压12.6V   ADC1=342  
(0539)  // 电池电压12.0V   ADC1=326
(0540)  // 电池电压11.5V   ADC1=313
(0541)  // 电池电压10V     ADC1=273
(0542)  // 2A     ADC7=229
(0543)  //-----------------在0.16A负载情况下,------------------//
(0544)  // 电池电压15.55V  ADC1=411
(0545)  // 电池电压14.4V   ADC1=380  
(0546)  // 电池电压13.8V   ADC1=364
(0547)  // 电池电压13.2V   ADC1=348
(0548)  // 电池电压13.0V   ADC1=343
(0549)  // 电池电压12.6V   ADC1=332
(0550)  // 电池电压12.0V   ADC1=316
(0551)  // 电池电压11.5V   ADC1=303
(0552)  // 电池电压10.0V   ADC1=263
(0553)  // 0.16A     ADC7=31
(0554) //------------------------------------------------------/
(0555) // 电流2A情况下,充电输出电压      15.8 V  ;TC132=2.820 V 000  00000000
(0556) // 电流2A情况下,充电输出电压      14.4 V  ;TC132=2.978 V 878  00000000		
(0557) // 电流2A情况下,充电输出电压      13.8 V  ;TC132=3.015 V 892  00000000
(0558) // 电流2A情况下,充电输出电压      13.2 V  ;TC132=3.047 V 903  00000000 
(0559) // 电流2A情况下,充电输出电压      13.0 V  ;TC132=3.056 V 893
(0560) // 电流2A情况下,充电输出电压      12.6 V  ;TC132=3.075 V 899
(0561) // 电流0.16A情况下,充电输出电压   12.6 V  ;TC132=3.100 V 906
(0562) // 电流0.16A情况下,充电输出电压   12.0 V  ;TC132=3.127 V 921  00000000
(0563) // 电流0.16A情况下,充电输出电压   11.5 V  ;TC132=3.148 V 930  00000000
(0564) // 电流0.16A情况下,充电输出电压   10.0 V  ;TC132=3.211 V 950  00000000
(0565) //------------------------------------------------------/
(0566)  while(1)					 
(0567)  {  		 
(0568) 	goto	 step_3;	 	        //开始应该  goto	 step_3进入恒流充电	
(0569) /***** 第一步 去硫化、脉冲、14.4V&13.8V 0.8A 1Hz 脉冲充电 红色指示灯*****/ 
(0570) step_1:
(0571) goto	 step_3;
(0572) /****************** 第二步 软启动、14.4V/0.8A 红色指示灯***********************/
(0573) step_2:		
(0574) goto	 step_3;
(0575) /********************* 第三步 恒流4A、红色灯**************************/ 
(0576) step_3: 
(0577)     Second_count_1=00; 		  		//延时24小时,等于86400秒
    0585 2422      CLR	R2
    0586 2433      CLR	R3
    0587 92300112  STS	Second_count_1+1,R3
    0589 92200111  STS	Second_count_1,R2
(0578)  	Second_count_2=00; 				//Second_count_1*Second_count_2=60*1660
    058B 92300110  STS	Second_count_2+1,R3
    058D 9220010F  STS	Second_count_2,R2
    058F C069      RJMP	0x05F9
(0579) 	while(1)
(0580) 		{
(0581) 		temp |= (1<<anther);
    0590 91800116  LDS	R24,temp
    0592 6280      ORI	R24,0x20
    0593 93800116  STS	temp,R24
(0582) 		alarm();	   				//报警扫描			
    0595 DECA      RCALL	_alarm
(0583) 		Delay(0x7ff);  
    0596 EF0F      LDI	R16,0xFF
    0597 E017      LDI	R17,7
    0598 DD6C      RCALL	_Delay
(0584) 		Delay(0x7ff);  		
    0599 EF0F      LDI	R16,0xFF
    059A E017      LDI	R17,7
    059B DD69      RCALL	_Delay
(0585) 		
(0586) 		PORTD |= (1<<Red);			//指示灯显示红色		
    059C 9A5A      SBI	0x0B,2
(0587) 		PORTD &= ~(1<<Green);		//绿色指示灯灭
    059D 985B      CBI	0x0B,3
(0588) 										  
(0589) 		PORTB &= ~(1<<P0);			//关断P0   4A恒流充电
    059E 9829      CBI	0x05,1
(0590) 		PORTD &= ~(1<<P1);			//关断P1   4A恒流充电
    059F 985D      CBI	0x0B,5
(0591) 		PORTB &= ~(1<<P2);			//关断P2   4A恒流充电
    05A0 982F      CBI	0x05,7
(0592) 		PORTB |= (1<<P3);   		//打开P3   4A恒流充电
    05A1 9A2E      SBI	0x05,6
(0593) 		TC1321_SET(878);			// D/A送电压14.4V	
    05A2 E60E      LDI	R16,0x6E
    05A3 E013      LDI	R17,3
    05A4 DC83      RCALL	_TC1321_SET
(0594) 	 		while(Second_count_2>1459) 	//24小时到 1459
    05A5 EB83      LDI	R24,0xB3
    05A6 E095      LDI	R25,5
    05A7 9020010F  LDS	R2,Second_count_2
    05A9 90300110  LDS	R3,Second_count_2+1
    05AB 1582      CP	R24,R2
    05AC 0593      CPC	R25,R3
    05AD F408      BCC	0x05AF
    05AE C112      RJMP	0x06C1
(0595) 			{						   	//则跳到第七步					  
(0596) 			goto	step_7;
(0597) 			}	
(0598) 				
(0599) 				
(0600) 			 adc_mux=0X07;
    05AF E087      LDI	R24,7
    05B0 9380010A  STS	adc_mux,R24
(0601) 			 Delay(0xff);   				  		  //A/D采样延时
    05B2 EF0F      LDI	R16,0xFF
    05B3 E010      LDI	R17,0
    05B4 DD50      RCALL	_Delay
(0602) 			 ad_reulst();
    05B5 DE74      RCALL	_ad_reulst
(0603) 			 Second_count_3=00;
    05B6 2422      CLR	R2
    05B7 2433      CLR	R3
    05B8 9230010E  STS	Second_count_3+1,R3
    05BA 9220010D  STS	Second_count_3,R2
(0604) 			 if(adc_old > 0x33 && adc_old < 390 )     //电流
    05BC E383      LDI	R24,0x33
    05BD E090      LDI	R25,0
    05BE 9020011D  LDS	R2,adc_old
    05C0 9030011E  LDS	R3,adc_old+1
    05C2 1582      CP	R24,R2
    05C3 0593      CPC	R25,R3
    05C4 F518      BCC	0x05E8
    05C5 01C1      MOVW	R24,R2
    05C6 3886      CPI	R24,0x86
    05C7 E0E1      LDI	R30,1
    05C8 079E      CPC	R25,R30
    05C9 F4F0      BCC	0x05E8
(0605) 			 {	
(0606) 			 	  while(Second_count_3<2) 			  //等待2秒,因为拔掉电池,电流下降也会满足此条件,但是应该进入
    05CA 9180010D  LDS	R24,Second_count_3
    05CC 9190010E  LDS	R25,Second_count_3+1
    05CE 3082      CPI	R24,2
    05CF E0E0      LDI	R30,0
    05D0 079E      CPC	R25,R30
    05D1 F3C0      BCS	0x05CA
(0607) 				  {	  								  //0电流报警,而不该进入第四步,所以等待2秒															   
(0608) 			//	    temp |= (1<<anther);
(0609) 			//	  	alarm();
(0610) 			//		PORTB &= ~(1<<P0);				  //关断P0   4A恒流充电
(0611) 			//		PORTD &= ~(1<<P1);				  //关断P1   4A恒流充电
(0612) 			//		PORTB &= ~(1<<P2);				  //关断P2   4A恒流充电
(0613) 			//		PORTB |= (1<<P3);   			  //打开P3   4A恒流充电				  
(0614) 				;
(0615) 				  }	  
(0616) 					 adc_mux=0X07;
    05D2 E087      LDI	R24,7
    05D3 9380010A  STS	adc_mux,R24
(0617) 			         Delay(0xff);   				  //A/D采样延时
    05D5 EF0F      LDI	R16,0xFF
    05D6 E010      LDI	R17,0
    05D7 DD2D      RCALL	_Delay
(0618) 			 		 ad_reulst();
    05D8 DE51      RCALL	_ad_reulst
(0619) 					 if(adc_old > 0x33 && adc_old < 390 )
    05D9 E383      LDI	R24,0x33
    05DA E090      LDI	R25,0
    05DB 9020011D  LDS	R2,adc_old
    05DD 9030011E  LDS	R3,adc_old+1
    05DF 1582      CP	R24,R2
    05E0 0593      CPC	R25,R3
    05E1 F430      BCC	0x05E8
    05E2 01C1      MOVW	R24,R2
    05E3 3886      CPI	R24,0x86
    05E4 E0E1      LDI	R30,1
    05E5 079E      CPC	R25,R30
    05E6 F408      BCC	0x05E8
(0620) 					 {
(0621) 			 		 goto	step_4;  
    05E7 C012      RJMP	0x05FA
(0622) 					 }
(0623) 			 }	
(0624) 			 
(0625) 			 
(0626) 				adc_mux=0X01;  		   	  		  		//采样当前电池电压大小		
    05E8 E081      LDI	R24,1
    05E9 9380010A  STS	adc_mux,R24
(0627) 			    Delay(0xff);   		//A/D采样延时
    05EB EF0F      LDI	R16,0xFF
    05EC E010      LDI	R17,0
    05ED DD17      RCALL	_Delay
(0628) 			    ad_reulst();	    //刷新A/D采样值
    05EE DE3B      RCALL	_ad_reulst
(0629) 				if(adc_old > 390 )  //检测当前电压是不是大于14.4V  A/D电压1.31 
    05EF E886      LDI	R24,0x86
    05F0 E091      LDI	R25,1
    05F1 9020011D  LDS	R2,adc_old
    05F3 9030011E  LDS	R3,adc_old+1
    05F5 1582      CP	R24,R2
    05F6 0593      CPC	R25,R3
    05F7 F408      BCC	0x05F9
(0630) 				{	
(0631) 				goto	step_4;     //则跳到第四步
    05F8 C001      RJMP	0x05FA
    05F9 CF96      RJMP	0x0590
(0632) 				}
(0633) 		}
(0634) /************************ 第四步 恒压、14.4V、橙色灯***************************/		
(0635) step_4:		
(0636)     		Second_count_1=00; 	  		 		//延时10小时,等于36000秒
    05FA 2422      CLR	R2
    05FB 2433      CLR	R3
    05FC 92300112  STS	Second_count_1+1,R3
    05FE 92200111  STS	Second_count_1,R2
(0637)  			Second_count_2=00; 	  		 		//Second_count_1*Second_count_2=60*600
    0600 92300110  STS	Second_count_2+1,R3
    0602 9220010F  STS	Second_count_2,R2
    0604 C0BA      RJMP	0x06BF
(0638) 	while(1)
(0639) 		{
(0640) 		temp |= (1<<anther);			 		//允许0电流检测		 
    0605 91800116  LDS	R24,temp
    0607 6280      ORI	R24,0x20
    0608 93800116  STS	temp,R24
(0641) 		alarm();	   		    		 		//报警扫描			
    060A DE55      RCALL	_alarm
(0642) 		PORTB &= ~(1<<P0);				 		//关断P0   4A恒流充电
    060B 9829      CBI	0x05,1
(0643) 		PORTD &= ~(1<<P1);				 		//关断P1   4A恒流充电
    060C 985D      CBI	0x0B,5
(0644) 		PORTB &= ~(1<<P2);				 		//关断P2   4A恒流充电
    060D 982F      CBI	0x05,7
(0645) 		PORTB |= (1<<P3);   			 		//打开P3   4A恒流充电		
    060E 9A2E      SBI	0x05,6
(0646) 		PORTD |= (1<<Green);			 		//指示灯显示绿色		
    060F 9A5B      SBI	0x0B,3
(0647) 		PORTD |= (1<<Red);				 		//红色指示亮
    0610 9A5A      SBI	0x0B,2
(0648) 		TC1321_SET(878);	 			 		// D/A送电压14.4V ,同时进行温度补偿	
    0611 E60E      LDI	R16,0x6E
    0612 E013      LDI	R17,3
    0613 DC14      RCALL	_TC1321_SET
    0614 C015      RJMP	0x062A
(0649) 		
(0650) 	 		while(Second_count_2>600)  			//10小时到  600
(0651) 			{						   			//则跳到第七步					  
(0652) 				Second_count_1=00; 				//延时55秒
    0615 2422      CLR	R2
    0616 2433      CLR	R3
    0617 92300112  STS	Second_count_1+1,R3
    0619 92200111  STS	Second_count_1,R2
    061B C00D      RJMP	0x0629
(0653) 				while(1)		   				//延时3分钟,防止电流反灌
(0654) 				{
(0655) 				 	TC1321_SET_138(892);	 	// D/A送电压13.8V ,同时进行温度补偿	
    061C E70C      LDI	R16,0x7C
    061D E013      LDI	R17,3
    061E DC5E      RCALL	_TC1321_SET_138
(0656) 				    if(Second_count_1>55)
    061F E387      LDI	R24,0x37
    0620 E090      LDI	R25,0
    0621 90200111  LDS	R2,Second_count_1
    0623 90300112  LDS	R3,Second_count_1+1
    0625 1582      CP	R24,R2
    0626 0593      CPC	R25,R3
    0627 F408      BCC	0x0629
(0657) 				    {goto	step_7;}
    0628 C098      RJMP	0x06C1
    0629 CFF2      RJMP	0x061C
    062A E588      LDI	R24,0x58
    062B E092      LDI	R25,2
    062C 9020010F  LDS	R2,Second_count_2
    062E 90300110  LDS	R3,Second_count_2+1
    0630 1582      CP	R24,R2
    0631 0593      CPC	R25,R3
    0632 F310      BCS	0x0615
(0658) 				}	
(0659) 			}	
(0660) 			
(0661) 			
(0662) 			adc_mux=0X01;  		   		 		//采样当前电池电压大小		
    0633 E081      LDI	R24,1
    0634 9380010A  STS	adc_mux,R24
(0663) 			Delay(0xff);   		   				//A/D采样延时
    0636 EF0F      LDI	R16,0xFF
    0637 E010      LDI	R17,0
    0638 DCCC      RCALL	_Delay
(0664) 			ad_reulst();	  	   				//刷新A/D采样值
    0639 DDF0      RCALL	_ad_reulst
(0665) 			if(adc_old < 353) 	   				//检测当前电压是不是小于13V 
    063A 9180011D  LDS	R24,adc_old
    063C 9190011E  LDS	R25,adc_old+1
    063E 3681      CPI	R24,0x61
    063F E0E1      LDI	R30,1
    0640 079E      CPC	R25,R30
    0641 F408      BCC	0x0643
(0666) 			{			  		   				//小于13V则跳到第3步
(0667) 			goto	step_3;    
    0642 CF42      RJMP	0x0585
(0668) 			}			
(0669) 			
(0670) 			
(0671) 			adc_mux=0X07;  		    			//采样当前电流大小		
    0643 E087      LDI	R24,7
    0644 9380010A  STS	adc_mux,R24
(0672) 			Delay(0xff);   						//A/D采样延时
    0646 EF0F      LDI	R16,0xFF
    0647 E010      LDI	R17,0
    0648 DCBC      RCALL	_Delay
(0673) 			ad_reulst();						//刷新A/D采样值		
    0649 DDE0      RCALL	_ad_reulst
(0674) 			Second_count_3=0;					//为3秒等待做准备,因为拔掉电池插座也会满足此条件,但应该进入0电流报警,所以等3秒再检测电流
    064A 2422      CLR	R2
    064B 2433      CLR	R3
    064C 9230010E  STS	Second_count_3+1,R3
    064E 9220010D  STS	Second_count_3,R2
(0675) 			if(adc_old > 0x33 && adc_old < 217) //检测当前电流是不是小于2A---0.6V A/D
    0650 E383      LDI	R24,0x33
    0651 E090      LDI	R25,0
    0652 9020011D  LDS	R2,adc_old
    0654 9030011E  LDS	R3,adc_old+1
    0656 1582      CP	R24,R2
    0657 0593      CPC	R25,R3
    0658 F008      BCS	0x065A
    0659 C065      RJMP	0x06BF
    065A 01C1      MOVW	R24,R2
    065B 3D89      CPI	R24,0xD9
    065C E0E0      LDI	R30,0
    065D 079E      CPC	R25,R30
    065E F008      BCS	0x0660
    065F C05F      RJMP	0x06BF
(0676) 			{			  		    	   		//小于则跳到第5步
(0677) 			 	  while(Second_count_3

⌨️ 快捷键说明

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