www.pudn.com > PRMCharger_V0.04.rar > main.c, change:2008-03-09,size:7402b


/****************************************Copyright (c)************************************************** 
**                              智 能 充 电 器 开 发 小 组 
**                                     OurAVR 论坛 
**                                   QQ 群: 26052247  
** 
**                               http://www.ouravr.com/bbs 
** 
** This program was produced by the 
** CodeWizardAVR V1.24.7d Professional 
** Copyright 2008-2009 OurAVR  
** Chip type           : ATmega16 
** Program type        : Application 
** Clock frequency     : 16.000000 MHz 
** Memory model        : Small 
** External SRAM size  : 0 
** Data Stack size     : 256 
**--------------文件信息-------------------------------------------------------------------------------- 
**文   件   名: Main.c 
**创   建   人: 吕海安 
**最后修改日期: 2008年03月02日 
**描        述: 智能充电器软件 
**               
**--------------历史版本信息---------------------------------------------------------------------------- 
** 创建人: 吕海安 
** 版  本: v0.01 
** 日 期: 2008年03月02日 
** 描 述: 原始版本 
** 
**--------------当前版本信息---------------------------------------------------------------------------- 
** 创建人: 吕海安 
** 版  本: v0.04 
** 日 期: 2008年03月09日 
** 描 述: 完成充电器的基本菜单, 满足硬件测试, 可以测试电池状态 
** 
**------------------------------------------------------------------------------------------------------ 
********************************************************************************************************/ 
#include "config.h"      
 
// Declare your global variables here 
INT8U P10msReq;  
INT8U P100msReq;        
 
INT8U para[230];  // 所有参数和全局变量表 
 
/********************************************************************************************************* 
** 函数名称: timer0_ovf_isr 
** 功能描述: Timer 0 overflow interrupt service routine,16.384 mS @ 16M 
** 输入参数: 无 
** 输出参数: 无 
********************************************************************************************************/ 
interrupt [TIM0_OVF] void timer0_ovf_isr(void) 
{    
    static INT16U t0count1; 
    Disable();  
    t0count1++; 
    P10msReq = 1; // 16.384 mS 
    if(t0count1 >= 6) // about 100 mS 
    { 
        t0count1 = 0; 
        P100msReq = 1; 
    }   
    Enable();   
} 
/********************************************************************************************************* 
** 函数名称: InitCPU 
** 功能描述: 初始化I/O端口和各寄存器 
** 输入参数: 无 
** 输出参数: 无 
********************************************************************************************************/ 
void InitCPU(void) 
{ 
    PORTB = 0x00; 
    DDRB = 0x08; 
    PORTC = 0x00; 
    DDRC = 0xC3; 
    PORTD = 0x10; 
    DDRD = 0xB0;   
 
    lcd_init();      // 液晶初始化 
    KEY_init();      // 按键初始化 
    pwm_init();      // PWM 初始化 
    s_analog_init(); // ADC 初始化 
    usart_init();    // 串口初始化 
}  
 
/********************************************************************************************************* 
** 函数名称: p10ms 
** 功能描述: 10 MS扫描程序 
** 输入参数: 无 
** 输出参数: 无 
********************************************************************************************************/ 
void p10ms(void) 
{        
    //cell_output();    // 调用PWM输出控制程序 
} 
/********************************************************************************************************* 
** 函数名称: p100ms 
** 功能描述: 10 MS扫描程序 
** 输入参数: 无 
** 输出参数: 无 
********************************************************************************************************/ 
void p100ms(void) 
{    
    static INT16U timecnt = 0;   
    INT8U i; 
    for(i=0; i<7; i++) 
    { 
        filter_adc(i);   
    }       
    if(timecnt % 2 == 0) 
    { 
        LED1 = !LED1; 
    }   
    ShowMenu();  // 显示菜单程序 
         
/*     
    lcd_locate(0,0);   
    lcd_print_number((((INT16U)Bat0_Vol_H << 8) + Bat0_Vol_L),4,0);         	      
    lcd_locate(0,1); 
    lcd_print_number((((INT16U)Bat0_Cur_H << 8) + Bat0_Cur_L),4,0);        
    lcd_locate(8,0);  
    lcd_print_number((((INT16U)Bat1_Vol_H << 8) + Bat1_Vol_L),4,0);      	      
    lcd_locate(8,1);                              
    lcd_print_number((((INT16U)Bat1_Cur_H << 8) + Bat1_Cur_L),4,0);      
*/ 
    if(timecnt >= 60000) 
    { 
        timecnt = 0; 
    } 
    timecnt ++; 
} 
 
/********************************************************************************************************* 
** 函数名称: main 
** 功能描述: 主函数 
********************************************************************************************************/ 
void main(void) 
{   
    // Declare local variables here  
    //INT16U i;  
    delay_ms(1000); // 上电延时 1 S ,保证 MCU 正常工作 
    InitCPU();      // 初始化 CPU   
    lcd_locate(0,0);     
    lcd_print_stringF("OurOUR, Charger ");    
    LED1 = 1; 
    LED2 = 1; 
    LED3 = 1; 
    LED4 = 1;   
    Enable();       // Global enable interrupts       
 
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200);   
 
/*    //第一次探测,探知电池是否就位 
    for(i=0; i<7; i++) 
    { 
        filter_adc(i); 
    } 
    //电池探测,是否有电池,根据电压探测 
    lcd_locate(0,0);        
    lcd_print_number(Memory_Char_to_Int(BAT_0_BASE + BAT_1_VOL - 1),4,0); 
    if(Memory_Char_to_Int(BAT_0_BASE+BAT_0_VOL-1)<4000) 
    lcd_print_stringF("BAT1 ready!"); 
    else 
    lcd_print_stringF("BAT1 empty!"); 
    lcd_locate(0,1); 
    if(Memory_Char_to_Int(BAT_1_BASE+BAT_1_VOL-1)<4000) 
    lcd_print_stringF("BAT0 ready!"); 
    else 
    lcd_print_stringF("BAT0 empty!"); 
 */    
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200); 
    delay_ms(200); 
 
    //bat_discharge(BAT0, 50); 
    while (1) 
    {    
        if(P10msReq)  
        {    
            P10msReq = 0; 
            p10ms();    // 处理 10 mS 函数 
        } 
        if (P100msReq) 
        {       
            P100msReq = 0; 
            p100ms();   // 处理 100 mS 函数               
        }  
  /* 
        if(memory[BAT0_PWM_VOL_OR_CUR-1]==VOL) 
	{ 
			lcd_locate(0,LINE_1); 
			lcd_print_stringF("Vol Control:"); 
			lcd_locate(0,LINE_2); 
			lcd_print_number(Memory_Char_to_Int(BAT0_VOL_SET-1),4,0); 
			lcd_locate(6,LINE_2); 
			lcd_print_number(Memory_Char_to_Int(BAT_0_BASE+BAT_0_VOL-1),4,0); 
	} 
        else 
	{ 
			lcd_locate(0,LINE_1); 
			lcd_print_stringF("Cur Control:"); 
			lcd_locate(0,LINE_2); 
			lcd_print_number(Memory_Char_to_Int(BAT0_CUR_SET-1),4,0); 
			lcd_locate(6,LINE_2); 
			lcd_print_number(Memory_Char_to_Int(BAT_0_BASE+BAT_0_CUR-1),4,0); 
			//lcd_print_number(cell_pid0(),4,0); 
		// 当调试放电的时候,最好监控OCR0的实际PWM参数 
		//	lcd_locate(0,LINE_2); 
		//	lcd_print_number(OCR0,3,0); 
	} 
 	delay_ms(200); 
	delay_ms(200); 
	delay_ms(200); 
	delay_ms(200); 
	delay_ms(200);  
	*/ 
    }; 
} 
/******************************************************************************************************** 
**                                 END OF FILE 
********************************************************************************************************/ 

送体验金的网站