|
楼主 |
发表于 2014-5-7 21:46:20
|
显示全部楼层
时间有限,代码先贴上来,大家先看看。回头再做详细注释。
#include "htc.h"
//#include "pic16f676.h"
__CONFIG (INTOSCIO&CPD &PWRTEN&BOREN&MCLRDIS&WDTDIS&CPROTECT);
volatile unsigned char OSCCTL @ 0x8F;
volatile unsigned char PWMCTL @ 0x15;
volatile unsigned char PR1 @ 0x16;
volatile unsigned char CCPR1L @ 0x13;
volatile unsigned char CCPR1H @ 0x14;
volatile unsigned char PR2 @ 0x92;
volatile unsigned char CCPR2L @ 0x93;
volatile unsigned char CCPR2H @ 0x94;
volatile bit PWM1ON @((unsigned)&PWMCTL*8)+0;
volatile bit PWM2ON @((unsigned)&PWMCTL*8)+1;
volatile bit RC6 @((unsigned)&PORTC*8)+6;
volatile bit RC7 @((unsigned)&PORTC*8)+7;
volatile bit TRISC6 @((unsigned)&TRISC*8)+6;
volatile bit TRISC7 @((unsigned)&TRISC*8)+7;
volatile bit WPUA3 @((unsigned)&WPUA*8)+3;
#define LED_1_ON() RC3=1
#define LED_1_OFF() RC3=0
#define LED_1_FLASH() RC3=!RC3
#define LED_1_STATUS() RC3
#define LED_2_ON() RC6=1
#define LED_2_OFF() RC6=0
#define LED_2_FLASH() RC6=!RC6
#define LED_2_STATUS() RC6
#define LED_3_ON() RC2=1
#define LED_3_OFF() RC2=0
#define LED_3_FLASH() RC2=!RC2
#define LED_3_STATUS() RC2
#define LED_4_ON() RA1=1
#define LED_4_OFF() RA1=0
#define LED_4_FLASH() RA1=!RC1
#define LED_4_STATUS() RA1
#define LED_LIGHT_ON() PWM2ON=1;RC7=1
#define LED_LIGHT_OFF() PWM2ON=0;RC7=0
#define LED_LIGHT_FLASH() RC7=!RC7
#define KEY_STATUS !RA2
#define ChargeEndStatus RA4 ////1为充电结束,0为充电中
#define OUT_ENABLE() RA5=1
#define OUT_DISABLE() RA5=0
#define OUT_STATUS RA5
#define POWERON() RA0=1
#define POWEROFF() RA0=0
#define WORK_STATUS RA0
/*1.250V的参考电压 20 次累加的结果*/
#define VCOUNT_4V15 25924 //4.15V=25924,4.01V=26940,4.20V=25600
#define VCOUNT_4V1 26256 //26256
#define VCOUNT_4V05 26597 //26597
#define VCOUNT_4V0 26947 // 26947
#define VCOUNT_3V95 27306 //3v95=27306
#define VCOUNT_3V9 27676 //3v9=27676
#define VCOUNT_3V85 28056 //3v85=28055
#define VCOUNT_3V8 28446 //3v8=28444,3v85=28055,3v75=28845
#define VCOUNT_3V75 28845 //3v8=28444,3v85=28055,3v75=28845
#define VCOUNT_3V7 29257
#define VCOUNT_3V6 32000 //3V4=32000,3V6=30118,3V7=29257,3V4=32000
#define VCOUNT_3V0 39385 //2.8V=39385,3.0v=36571
#define SHORT_COUNT 10 //短路计数,执行短路保护前计数,防止误判。
void Delay(int iDelay);
unsigned int read_a2d_16(unsigned char channel);
void ChargeBattery(void);//充电管理
void DischargeBattery(void);//放电管理
void DischargeBatteryIsEnd(void);//放电是否结束
void StartSleep();//开始睡眠
void StartWork(void);//开始工作
unsigned int GetBatteryV(void);
void CheckKeyPress(void);//判断按键状态
void CheckPWMKeyPress();//判断PWM按键状态
void CheckChargeStatus(void);//判断充电状态
unsigned int GetBatteryAverage5Add( unsigned int uiValue);//得到电压平均值的10次累加结果
unsigned int GetBatteryAverage4(unsigned char channel);//得到采样通道的6次平均值(除出了最高和最低值)
void PowerIsShort(void);//电源是否短路
void BatteryIsLow(void);//电源是否低电压,如果是低电压,则关闭输出
//得到数模采样值
unsigned int GetAdcValue(unsigned char channel,unsigned char count);
//取得电压的等级
unsigned char GetChargeGrade(unsigned int iBatteryV);
void SetWorkParam(unsigned char uiGradeValue);//设置工作参数
volatile unsigned int g_uiChargeCount=0; // 充电计数
volatile unsigned char g_ucWorkMode=0;//空闲状态,1 放电状态,2 充电状态
volatile unsigned int g_uiBatteryV=0;//电池电压
volatile unsigned int g_uiDischargBatteryV=0;//放电电流的电压检测
volatile unsigned char g_ucDisChargeGrade=0;//放电电压的级别,
volatile unsigned char g_ucPowerShortCount=0;//电源短路计数,如果达到50次,则认为已经短路
volatile unsigned int g_uiDischargeCount=0;//放电计数当检测到对外部设备充电电流小于100mA超过10S,关闭充电输出,进入按键等待状态
volatile unsigned int g_uiReturnWorkCount=0;//正常工作状态计数,当计数大于某一数字时复位不正常计数,以达到排除干扰的目的
volatile unsigned int g_uiNullWorkCount=0;//空载工作状态计数,当计数大于某一数字时表示空载要进入睡眠状态
volatile unsigned int gui_vol_short=0;//短路保护点动态电压变量
volatile unsigned char g_ucChargeFlag=0;//充电状态标志,1 在充电,0 不在充电状态
volatile unsigned char g_ucLedShowCount=0;//指示灯亮的时间
volatile unsigned char g_uiPWMValue=150;//0到 150之间,20一级,共8级,10~150
volatile unsigned char g_uiChargeLedNo=0;//充电,led循环计数
volatile unsigned char g_ucKeyPressCount=0;//按键时间检测
volatile bit g_ucKeyPressFlag=0;//按键事件标志,1 按下 ,0 松开
volatile bit g_b2sKeyPressFlag=0;//按键事件2S标志,1 按下时间超过2S
volatile bit g_bChargeValue=0; //充电器状态判断,1表示充电器有效,0充电器拔出
volatile bit g_bCheckFlag=0;
volatile bit g_bAdcCheckFlag=0; //Feb2增加,调整ADC采样间隔,定时器中断一次才开始判断电池电量,改变相应参数
volatile bit g_bLedCheckFlag=0;
volatile bit g_bIsRun=0;//0,在睡眠,1 唤醒后启动了一次电量检测,然后开启输出 |
|