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

📄 main._c

📁 单片机 mega16L 电池放电器源码
💻 _C
字号:
//项目名称:电池放电器
//功能描述:
//外部模块:1602LCD    LM35
//开发人员:书生
//开发日期:2006年1月20日
//*********************************************************
#include <iom8v.h>
#include <macros.h>
#include "discharge.h"
#include "eeprom.h"
#include "LCD_1602.h"
  unsigned char keyboard;
  unsigned char RunTab=0;
  unsigned char RunTab_old;
  
  unsigned char time;
  unsigned char sec=0;
  unsigned char min=0;
  unsigned char hour=0;
  
  unsigned int sc_key,sc_bt1,sc_bt_ctrl,
  sc_discharge,sc_eeprom,sc_lcd_write,
  sc_bt1_record,sc_key_delay,sc_bt1_v_temp;
 
 // discharge
  unsigned char BT1_state;
  unsigned int BT1_V;
  unsigned int BT1_I;
  unsigned int BT1_T;
  unsigned int BT1_V_num;
  unsigned int BT1_V_num_temp;
  unsigned int bt1_v_temp;
  unsigned int bt1_v_temp_1;
  
  unsigned int BT1_I_SET;
  unsigned int PWM;
  unsigned long BT1_mAh;
  unsigned long BT1_time;
  unsigned int mAh;
  unsigned int D882_P;
  
  unsigned int mAh_set=1000;
  unsigned char speed=10;
  unsigned int BT1_P;
//T2溢出中断服务程序 8ms
#pragma interrupt_handler timer2_ovf_isr:5
void timer2_ovf_isr(void)
{
  TCNT2 = 0x06;//重装计时值0xFF=32us  0x00=8.192ms
  timer();//实时时钟
/*----------------------------------
    以下是任务管理器 
----------------------------------*/
  system();//系统后台服务程序
  taskmgr();//任务管理程序
  system_clock();
}

/*----------------------------------
    系统后台服务程序
-----------------------------------*/
void system(void)
{ 
  if((sc_key_delay==0)&&(keyboard!=0)){sc_key_delay=50;}
  if(sc_key_delay==1){keyboard=0;}
  if(sc_key==0)
    {keyboard=key(keyboard);sc_key=16;}//键盘扫描间隔为32*8ms
 
  if(sc_lcd_write==0)
   {
    desktop1();desktop2();desktop3();desktop4();
	Capacitance_setting();discharge_speed();
	record_setting();welcome();
	LCD_write_new();
	sc_lcd_write=32;
	}
	if(BT1_I_SET)
	{
 if(sc_bt1==0)
  {BT1_mAh+=BT1_I;sc_bt1=450;}//容量统计,每3.6秒计一次
 if(sc_discharge==0)
  {BT1_time++;sc_discharge=125;}//放电时间统计
 if(sc_eeprom==0) 
  {
   if(BT1_V<2000)
	{discharge_stop();} 
    EEPROM_WRITE(0x01F0,BT1_mAh);
    EEPROM_WRITE(0x01F4,BT1_time);
    sc_eeprom=1250;
	}
  if(sc_bt_ctrl==0)
    {
	 BT1_I_Ctrl();
      if((BT1_I>BT1_I_SET+5)||(BT1_I<BT1_I_SET-5))
	    sc_bt_ctrl=2;
		else sc_bt_ctrl=48;
	 }
  }
  if(sc_bt1_v_temp==0)
    {bt1_v_temp+=BT1_V;sc_bt1_v_temp=500;}
  if(sc_bt1_record==0)
    {bt1_v_record();sc_bt1_record=7500;}//每分钟记录一次电压
}

/*----------------------------------
        任务管理程序
----------------------------------*/
void taskmgr(void)
  {  
	 if(keyboard==pageup)
	   {
		 if(RunTab!=3){RunTab++;keyboard=0;}
	   }
	 if(keyboard==pagedown)
	   {
	     if(RunTab!=1){RunTab--;keyboard=0;}
	   }
	  if(RunTab_old!=RunTab)
	     {LCD_clear();RunTab_old=RunTab;}
  }

void system_clock(void)
  {  //每个节拍为8ms
	 if(sc_key!=0)  sc_key--; 
	 if(sc_bt1!=0)  sc_bt1--; 
	 if(sc_discharge!=0)  sc_discharge--; 
	 if(sc_eeprom!=0)  sc_eeprom--; 
	 if(sc_lcd_write!=0)  sc_lcd_write--;
	 if(sc_bt1_record!=0)  sc_bt1_record--;
	 if(sc_bt1_v_temp!=0)  sc_bt1_v_temp--;
	 if(sc_key_delay!=0)  sc_key_delay--;
	 if(sc_bt_ctrl!=0)  sc_bt_ctrl--;
  }
void bt1_v_record(void)
  {  
     bt1_v_temp/=15;
     EEPROM_READ(0x01F8,BT1_V_num);
     EEPROM_WRITE(BT1_V_num*2,bt1_v_temp);
	
	if(BT1_V_num<249)
	   {BT1_V_num++;EEPROM_WRITE(0x01F8,BT1_V_num);} 
	   
	 bt1_v_temp=0;
  }
/*------------------------------------
          主程序
-------------------------------------*/
void main(void)
  { 
	 sc_eeprom=500;
	 delay_nms(20);	 
	 init_devices();	 
	 LCD_clear();
	 LED2_OFF;
     LED1_OFF; 
	 RunTab=5;
	 delay_nms(2000);
 while(1)
       { 
	     discharge_init();
		 discharge();
		 delay_nms(100);
       }
  }
void welcome(void)
  {
     unsigned char ID=5;
	  if(RunTab==ID)
		{   
		  LCD_write_string(4,0,"Welcome",15);
		  LCD_write_string(1,1,"Discharger xp",15);   
		}
  }
void discharge_stop(void)
  {
     BT1_I_SET=0;BT1_I=0;
	 BT1_state&=~(1<<1);//已停止放电
	 BT1_state|=(1<<2);//已放完电
	 DDRB&=~(1<<1);G_F;
	 PWM=100;
  }
void discharge_init(void)
  {
      BT1_V=T_BT1_V();
	  if((BT1_V>2000)&&BT1_state==0)//
	    {
		  BT1_state|=(1<<0);
		  RunTab=10;
		}
  }
void Capacitance_setting(void)
  {
    unsigned char ID=10; 
    if(RunTab==ID)
		  {     
		    if((keyboard==up)&&mAh_set<4000)
		     {keyboard=0;mAh_set+=100;}
		    else if((keyboard==down)&&mAh_set>100)
		     {keyboard=0;mAh_set-=100;}
			else if(keyboard==pagedown)
	        { 
			 keyboard=0;
             EEPROM_READ(0x01F0,BT1_mAh);	
	         EEPROM_READ(0x01F4,BT1_time);
			 EEPROM_READ(0x01FC,mAh_set);
			 EEPROM_READ(0x01FE,speed);
			 RunTab=12;
	        }
			LCD_write_string(0,0,"Capacitance",0);
			LCD_write_number(0,1,0,mAh_set,"mAh",8);
			LCD_write_number(10,1,3,BT1_V,"V",15);
		  }
  }
void discharge_speed(void)
  {
      unsigned char ID=11; 
      if(RunTab==ID)
		  { 
		    LCD_write_string(0,0,"speed",0);
			LCD_write_number(9,0,0,6000/speed,"min",15);
			LCD_write_number(0,1,2,speed,"C",8);
			LCD_write_number(9,1,3,mAh_set/100*speed,"A",15);
		     
		    if((keyboard==up)&&speed<120)
		     {keyboard=0;speed+=5;}
		    else if((keyboard==down)&&speed>5)
		     {keyboard=0;speed-=5;}
			else if(keyboard==pagedown)
	        { 
			 keyboard=0;
	         RunTab--;LCD_clear();
	        }
			}
  }
void record_setting(void)
  {
      unsigned char ID=12; 
      if(RunTab==ID)
		  {     
		    EEPROM_WRITE(0x01FC,mAh_set);
			EEPROM_WRITE(0x01FE,speed);
			PWM=500;sc_bt1_record=7500;
			sc_eeprom=1250;sc_bt1_v_temp=500;
	        BT1_I_SET=mAh_set/100*speed;
	        DDRB|=(1<<1);G_N; 
			BT1_state|=(1<<1);
			RunTab=1;
			LCD_clear();
		  }
  }
/*---------------------------------------
             放电程序
----------------------------------------*/
void discharge (void)
  {    
      unsigned long v_temp,i_temp;
	  unsigned char v,i;
	 
	  while(BT1_state&(1<<1))
	  {G_N;
		if(i<4)
		 {i_temp+=T_BT1_I();i++;}
		else
		 {i=0;BT1_I=i_temp>>2;i_temp=0;}	
		delay_nms(5);
		if(v<64)
		 {v_temp+=T_BT1_V()+(BT1_I>>1); v++;}
		else 
		 {v=0;BT1_V=v_temp>>6;v_temp=0;}
		
		delay_nms(5);
		D882_P=(BT1_V-(BT1_I>>1))/100;
		D882_P*=(BT1_I/10);
		BT1_T=T_BT1_T();
		delay_nms(5);
		}
		G_F;
  }
  
/*---------------------------------------
             桌面程序
----------------------------------------*/
void desktop2(void)
  {     
     unsigned char ID=2; //程序标识
		 if(RunTab==ID)
		 {
		    LCD_write_time(7,1,hour,min,sec); //200us发送时间到LCD			
		    LCD_write_number(7,0,0,BT1_time,"sec",10);	
			LCD_write_number(0,1,1,BT1_T,"C",0); 
			LCD_write_number(0,0,0,D882_P,"mW",0);  
		 }
  }	
  
void desktop1(void)
 {
   unsigned char ID=1; 
   if(RunTab==ID)
		  {     
		    if(keyboard==up)
		     {keyboard=0;BT1_I_SET+=50;}
		    else if(keyboard==down)
		     {keyboard=0;BT1_I_SET-=50;}
			else if(keyboard==clear)
	        { 
			 keyboard=0;
	         BT1_mAh=0;
			 BT1_time=0;
		     EEPROM_WRITE(0x01F0,BT1_mAh);
		     EEPROM_WRITE(0x01F4,BT1_time);
		     BT1_V_num=0;BT1_V_num_temp=0;
		     EEPROM_WRITE(0x01F8,BT1_V_num);
		     sec=0;min=0;hour=0;
		     sc_bt1_record=7500;
	        }
		    LCD_write_number(0,0,3,BT1_V,"V",6);
			LCD_write_number(0,1,3,BT1_I,"A",6);
			if(BT1_state&(1<<2))
			LCD_write_string(7,0,"Finish",15);
			  else
			LCD_write_number(7,0,0,PWM,"PWM",0);
			LCD_write_number(7,1,1,BT1_mAh/100,"mAh",15);
		  }
 }
void desktop3(void)
  {     
     unsigned char ID=3; //程序标识
		 if(RunTab==ID)
		 {  
		    if(BT1_V_num_temp<BT1_V_num-1)
			 {
			   if(keyboard==up)
			    { 
				  keyboard=0;
				  BT1_V_num_temp++;
				  EEPROM_READ(BT1_V_num_temp*2,bt1_v_temp_1);
				 }
			  }
			  
			  if(BT1_V_num_temp<BT1_V_num-10)
			 {
			   if(keyboard==Turn)
			    { 
				  keyboard=0;
				  BT1_V_num_temp+=10;
				  EEPROM_READ(BT1_V_num_temp*2,bt1_v_temp_1);
				 }
			  }
			
			if(BT1_V_num_temp>0)
			 {
			   if(keyboard==down)
			    { 
				  keyboard=0;
				  BT1_V_num_temp--;
				  EEPROM_READ(BT1_V_num_temp*2,bt1_v_temp_1);
				 }
			  }
			  
			 if(BT1_V_num_temp>10)
			 {
			   if(keyboard==Return)
			    { 
				  keyboard=0;
				  BT1_V_num_temp-=10;
				  EEPROM_READ(BT1_V_num_temp*2,bt1_v_temp_1);
				 }
			  }
			  
			LCD_write_number(0,1,3,bt1_v_temp_1,"V",8);
			LCD_write_number(0,0,0,BT1_V_num_temp,"min",8);
		    LCD_write_number(10,0,0,BT1_V_num,"min",15);
	        LCD_write_number(10,1,3,BT1_V,"V",15);
		 }
} 

void desktop4(void)
  {     
     unsigned char ID=4; //程序标识
		 if(RunTab==ID)
		 { 
		   if(PWM<250)
		   {
		    if(keyboard==up)
			   {
			     keyboard=0;
				 PWM+=5;
				 OCR1A=PWM-1;
				 LCD_write_number(0,1,3,534/1*PWM/25,"V",0);  
			   }
			 }
			if(PWM>5)
		   {
		    if(keyboard==down)
			   {
			     keyboard=0;
				 PWM-=5;
				 OCR1A=PWM-1;
				 LCD_write_number(0,1,3,534/1*PWM/25,"V",0);  
			   }
			 } 
		    LCD_write_time(8,1,hour,min,sec); //200us发送时间到LCD			
		    LCD_write_number(7,0,0,PWM,"PWM",15);	
			LCD_write_number(0,0,3,BT1_P,"V",0);
			 
		 }
  }	


void BT1_I_Ctrl (void)
  { 
   if(BT1_I_SET!=0)
   {
     if(BT1_I>BT1_I_SET+1)
	  {
	  if(PWM!=0)
	  PWM-=1;
	  OCR1A=PWM;
	  }
	  else if(BT1_I<BT1_I_SET-1)
	  {
	  if(PWM!=1900)
	  PWM+=1;
	  OCR1A=PWM;
	  }
	  }
	  else
	   {PWM=300;OCR1A=PWM;}
  }

/*-------------------------
        实时时钟
--------------------------*/
void timer(void)
{ 
  ++time;//秒计时
 if(time==125)//125分频8*125=1s
   {
      time=0;
      ++sec; 
	 if(sec==60)
	 {
	  sec=0;
	  min++;
	   if(min==60)
	   {
	    min=0;
		hour++;		
		 if(hour==24)
		 {
		   hour=0;		   
		 }
	   }
	 }
   //LCD_check(0,0);
   }
}

⌨️ 快捷键说明

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