📄 main.c
字号:
/********************************************************************************/
//
// builder : 2007-04-10
// Target : ATMEAG 48V
// Crystal : 内部 8.00 MHz
//
// 快速充电器
/********************************************************************************/
#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#define uchar unsigned char
#define uint unsigned int
#define SET_LED1 PORTB |= (1<<PB6)
#define SET_LED2 PORTB |= (1<<PB7)
#define SET_LED3 PORTD |= (1<<PD2)
#define SET_LED4 PORTD |= (1<<PD3)
#define SET_LED5 PORTD |= (1<<PD4)
#define CLR_LED1 PORTB &= ~(1<<PB6)
#define CLR_LED2 PORTB &= ~(1<<PB7)
#define CLR_LED3 PORTD &= ~(1<<PD2)
#define CLR_LED4 PORTD &= ~(1<<PD3)
#define CLR_LED5 PORTD &= ~(1<<PD4)
#define CLR_PWM PORTD &= ~(1<<PD5)
uchar pwm_data;
uint IREF;
uint VREF;
uchar stop;
uchar stop_num;
uchar time;
uchar time_5ms;
uchar time_1s;
uchar time_min;
uint charge;
uchar mode;
uchar power;
uchar buz_t,buz;
uchar key1,key2;
/*---------------------------------------------------------------
初始化
----------------------------------------------------------------*/
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x63; //setup
TCNT1L = 0xC0;
TCCR1A = 0x00;
TCCR1B = 0x01; //start Timer
}
void timer2_init(void) // PWM
{
TCCR2B = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x01; //setup
OCR2A = 0x7F;
OCR2B = 0x00;
TCCR2A = 0xC3;
}
void init_devices(void)
{
asm("cli");
DDRB = 0xFF;
PORTB = 0x30;
DDRC = 0x00;
PORTC = 0x00;
DDRD = 0x3F;
PORTD = 0xC0;
adc_int();
timer0_init();
timer1_init();
timer2_init();
MCUCR = 0x00;
EICRA = 0x00; //extended ext ints
EIMSK = 0x00;
TIMSK0 = 0x00; //timer 0 interrupt sources
TIMSK1 = 0x01; //timer 1 interrupt sources
TIMSK2 = 0x00; //timer 2 interrupt sources
asm("sei");
}
void delay(uint t)
{
uint i,j,k;
for(i=0;i<t;i++)
{
for(j=0;j<2000;j++)
{
for(k=0;k<500;k++);;
}
}
}
/*---------------------------------------------------------------
BUZ 控制
----------------------------------------------------------------*/
void buz_set(uchar i)
{
TCCR2B = 0x02; //start
buz_t = 0;
buz = i;
}
/*---------------------------------------------------------------
恒流控制
----------------------------------------------------------------*/
void I_auto_set(void)
{
uint I_data;
if(power)
{
SET_LED1;
I_data = adc_colect(2); // 读电流值
if(I_data<IREF)
{
if(pwm_data<254) pwm_data ++;
}
else if(I_data>(IREF+5))
{
if(pwm_data>2) pwm_data --;
}
Pwm_set(pwm_data); // 设置占空比
}
else
{
TCCR0B = 0x00; //start timer
TCCR0A = 0x00;
CLR_PWM;
CLR_LED1;
}
}
/*---------------------------------------------------------------
电压检测
----------------------------------------------------------------*/
void V_auto_set(void)
{
uint temp;
temp = adc_colect(2); // 读电流值
if(temp>10)
{
TCCR0A = 0x00; //0x23;
TCCR0B = 0x00; //start timer
delay(120);
temp = adc_colect(4); // 读电流值
temp = adc_colect(4); // 读电流值
if(VREF>=temp) stop ++;
else stop = 0;
if(stop>stop_num) // 3分钟电压无变化电已充满
{
stop = 0;
power = 0;
CLR_LED1;
SET_LED2;
for(temp=0;temp<3;temp++)
{
buz_set(200);
delay(180);
}
}
VREF = temp;
}
else power = 0; // 没接电池关机
}
/*---------------------------------------------------------------
T1 5ms 中断
----------------------------------------------------------------*/
SIGNAL(SIG_OVERFLOW1)
{
TCNT1H = 0x63; //reload counter high value
TCNT1L = 0xC0; //reload counter low value
time_5ms = 1;
buz_t ++;
if(buz_t>buz) TCCR2B = 0x00;
}
/*---------------------------------------------------------------
按键扫描
----------------------------------------------------------------*/
void key_set(void)
{
uchar temp;
temp = PIND & 0xC0;
if(temp==0x80) key1 ++;
else key1 = 0;
if(temp==0x40) key2 ++;
else key2 = 0;
}
/*---------------------------------------------------------------
按键处理
----------------------------------------------------------------*/
void key(void)
{
uchar i;
i = PIND & 0xC0;
if(key1>3 && (i==0xc0))
{
key1 = 0;
buz_set(40);
power = !power;
charge = 0;
stop = 0;
CLR_LED2;
pwm_data = 0;
time_min = 0;
}
else if(key2>3 && (i==0xc0))
{
key2 = 0;
buz_set(20);
mode ++;
if(mode>=3) mode = 0;
}
if(mode==0)
{
IREF = 98;//93;
stop_num = 6;
PORTD &= 0xE0;
SET_LED3;
}
else if(mode==1)
{
IREF = 190;
stop_num = 5;
PORTD &= 0xE0;
SET_LED4;
}
else if(mode==2)
{
IREF = 350;
stop_num = 4;
PORTD &= 0xE0;
SET_LED5;
}
}
/*---------------------------------------------------------------
main
----------------------------------------------------------------*/
void main(void)
{
uchar i;
delay(50);
init_devices();
buz_set(400);
while(1)
{
key();
if(time_5ms)
{
time_5ms = 0;
key_set();
I_auto_set();
time_1s ++;
if(time_1s>=200)
{
time_1s = 0;
time_min ++;
charge ++;
}
if(time_min >60)
{
time_min = 0;
V_auto_set();
}
if(charge>3600)
{
power = 0;
SET_LED2;
charge = 0;
}
}
}
}
/*-------------------- the end ------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -