📄 main._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 + -