?? bat_ctrl_12v_24v.c.bak
字號:
/****************************************************************/
/*功能:12v/24v自適應太陽能板充電控制器,跳線選擇模式,無數碼管顯示。
/*版本:v1.0
/*設計人:ye_zhenfeng
/*編寫日期:07-07-30
/*最后修改日期:07-08-23
/*狀態:PASSED
/****************************************************************/
/*頭文件定義*/
#include <reg915.h>
/*特殊寄存器定義*/
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P10 = P1^0;
sbit P11 = P1^1;
sbit P12 = P1^2;
sbit P13 = P1^3;
sbit P14 = P1^4;
/*預定義部分*/
#define uchar unsigned char
#define uint unsigned int
#define AD_NUM 32
//24v
#define TINGCHONG24 87*2 //14.8V*2/3.178V
#define GUOCHONG24 83*2 //14.0V*2
#define YUNCHONG24 80*2 //13.4V*2
#define YUNFANG24 72*2 //12.0V*2
#define GUOFANG24 64*2 //10.8V*2
#define MIEDENG24 20*2 // 3.5V*2
#define LIANGDENG24 14*2 // 2.5V*2
#define NODELAY24 4*2 //0.7v*2
//邊界
#define EDGE 110 //18.5V
//12v
#define TINGCHONG12 87 //14.8V/3.178V
#define GUOCHONG12 83 //14.0V
#define YUNCHONG12 80 //13.4V
#define YUNFANG12 72 //12.0V
#define GUOFANG12 64 //10.8V
#define MIEDENG12 20 // 3.5V
#define LIANGDENG12 14 // 2.5V
#define NODELAY12 4 //0.7v
#define DELAY_MIN 1*8000 //1min
/*全局變量定義*/
struct ad{
uchar index;
uchar BatAd[AD_NUM];
uchar SunAd[AD_NUM];
}AdValue;
uchar SunValue,BatValue; //光電池、蓄電池AD采樣值
uchar Seconds,Minutes,Hours; //實時時鐘計數變量
bit ClrFlag; //Hours清0允許位,'1'為允許
bit PowerFlag; //允許放電標志,‘1’為允許
bit CtrlFlag; //允許光板低電壓打開負荷標志
bit StopFlag; //停允沖標志
bit enL2,enL3;
bit enPWM;
bit enDelay1,enDelay2;
uchar L2Delay,L3Delay; //用于L2、L3閃爍定時,計數50次,越0.5s
uint Delay4min1,Delay4min2; //用于延時4min計數,計數20000次
/*函數聲明部分*/
void Init_Var(void);
void Init_IO(void);
void Init_AD(void);
void Init_Timer(void);
void Init_RTC(void);
void Init_WDT(void);
void Init_Interrupt(void);
void Init_All(void);
uchar Get_Mode(void);
void GetAd(void);
void Main_Logic12(uchar);
void Main_Logic24(uchar);
void Clr_Dog(void);
void Led_Ctrl(bit,uchar);
bit Delay_4min(bit);
/*中斷服務函數*/
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void T0_ISR() interrupt 1
{
TH0 = 0x80; //
TL0 = 0x00; //
if(enPWM)
{
P14 = ~P14;
}
L2Delay++;
L3Delay++;
if(L2Delay>=50)
{
L2Delay = 0;
if(enL2)
P01 = ~P01;
}
if(L3Delay>=50)
{
L3Delay = 0;
if(enL3)
P00 = ~P00;
}
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void T1_ISR() interrupt 3
{
TH1 = 0x80; //
TL1 = 0x00; //
if(enDelay1)
Delay4min1++;
if(enDelay2)
Delay4min2++;
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void RTC_ISR() interrupt 10
{
EA = 0;
if((RTCCON&0x80)==0x80)
{
RTCCON &= 0x63;
if(Minutes == 59)
{
if(Seconds == 59)
{
Seconds = 0;
Minutes = 0;
Hours ++;
}
else
{
Seconds ++;
}
}
else
{
if(Seconds == 59)
{
Seconds = 0;
Minutes ++;
}
else
{
Seconds ++;
}
}
EA = 1;
}
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void AD_ISR() interrupt 14
{
ADCON1 &= 0xF7;
AdValue.BatAd[AdValue.index] = AD1DAT0;
AdValue.SunAd[AdValue.index] = AD1DAT1;
AdValue.index ++;
if(AdValue.index >= AD_NUM)
AdValue.index = 0;
}
/*主函數部分*/
/*********************************************************************/
/*函數名:main()
/*功能:主函數
/*輸入參數:無
/*返回值:無
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void main()
{
uint i,j;
uchar TimeMode = 5;
bit VoltFlag;
Init_All();
i = 10000;
j = 40;
while(i--)
while(j--)
Clr_Dog(); //延時等ad采樣穩定
GetAd();
if(BatValue > EDGE)
VoltFlag = 1;
else
VoltFlag = 0;
while(1)
{
Clr_Dog();
TimeMode = Get_Mode();
GetAd();
if(VoltFlag)
Main_Logic24(TimeMode);
else
Main_Logic12(TimeMode);/**/
//enPWM = 1;
}
}
/*其他函數定義部分*/
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_Var()
{
Clr_Dog();
Seconds = 0;
Minutes = 0;
Hours = 0;
ClrFlag = 1; //允許時間清0
PowerFlag = 1; //允許放電
CtrlFlag = 1; //允許控制器打開負荷
StopFlag = 0; //允許充電
L2Delay = 0;
L3Delay = 0;
Delay4min1 = 0;
Delay4min2 = 0;
enL2 = 0;
enL3 = 0;
enPWM = 0;
enDelay1 = 0;
enDelay2 = 0;
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_IO()
{
Clr_Dog();
P0M1 = 0x0c; //B00001100
P0M2 = 0x33; //B00110011
ADINS = 0x60; //B01100000
P1M1 = 0x2F; //B00101111
P1M2 = 0x10; //B00010000
PT0AD = 0x0C; //禁止P02、P03的數字輸入功能
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_AD()
{
ADINS = 0x60; //選擇CH1、CH2
ADCON1 = 0x45; //允許中斷,使能ADC1,立即啟動方式
ADMODA = 0x20; //雙通道連續轉換
ADMODB = 0xe0; //分頻 = 8
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_Timer()
{
Clr_Dog();
TRIM |= 0x80; //選擇內部RC振蕩器的輸出作為CPU時鐘
TMOD = 0x11; //定時器0工作在模式1
TAMOD = 0x00; //定時器0工作在模式1
TH0 = 0x80; //
TL0 = 0x00; //
TH1 = 0x80;
TL1 = 0x00;
TR0 = 1; //打開定時器0
TR1 = 1;
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_RTC()
{
RTCH = 0xE0;
RTCL = 0xFF; //一個周期1s
RTCCON = 0x63; //內部RC振蕩器輸出時鐘,中斷使能,RTC啟動
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_WDT()
{
Clr_Dog();
ACC = WDCON; //讀取WDT控制寄存器
ACC = ACC|0x04; //置位ACC.2準備啟動WDT
WDL = 0x80; //設置8位倒計時器初值
WDCON = ACC; //啟動WDT
WFEED1 = 0xA5; //清零第一部分
WFEED2 = 0x5A; //清零第二部分
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_Interrupt()
{
EWDRT = 1; //實時時鐘中斷使能
EAD = 1; //AD中斷使能
ET0 = 1; //
ET1 = 1;
// EA = 1; //總中斷使能
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Init_All()
{
Clr_Dog();
Init_Var();
Init_IO();
Init_AD();
Init_Timer();
Init_RTC();
Init_WDT();
Init_Interrupt();
Led_Ctrl(1,2); //L3閃爍——正常運行
Led_Ctrl(0,0); //L2滅——沒有過充或過放
P04 = 0; //負荷12關
P05 = 0; //負荷11關
P14 = 0; //
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
uchar Get_Mode()
{
uchar mode;
Clr_Dog();
mode = 0;
if(!P11)
{
mode += 1;
}
if(!P10)
{
mode += 2;
}
if(!P13)
{
mode += 4;
}
if(!P12)
{
mode += 8;
}
return(mode);
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void GetAd()
{
uchar i;
uint BatTmp,SunTmp;
Clr_Dog();
EAD = 0;
BatTmp = 0;
SunTmp = 0;
for(i=0;i<AD_NUM;i++)
{
BatTmp += AdValue.BatAd[i];
SunTmp += AdValue.SunAd[i];
}
BatValue = BatTmp/AD_NUM;
SunValue = SunTmp/AD_NUM;
EAD = 1;
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Main_Logic12(uchar TimeMode)
{
Clr_Dog();
if(BatValue>TINGCHONG12)// && P14==0)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 0; //停止充電
StopFlag = 1; //停止充電
ET0 = 1;
}
PowerFlag = 1; //允許放電
Led_Ctrl(1,2); //運行狀態燈L3閃爍
Led_Ctrl(0,1); //過充過放燈L2亮
}
else if(BatValue>GUOCHONG12)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 1; //允許PWM
ET0 = 1;
}
PowerFlag = 1; //允許放電
if(SunValue>BatValue)
Led_Ctrl(1,1); //運行狀態燈L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,1); //過充過放燈L2亮
}
else if(BatValue>YUNFANG12)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 1; //全速充電
ET0 = 1;
}
PowerFlag = 1; //允許放電
if(SunValue>BatValue)
Led_Ctrl(1,1); //運行狀態燈L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,0); //過充過放燈L2滅
}
else;
Clr_Dog();
if(BatValue<GUOFANG12)
{
P05 = 0; //關閉負荷11
P04 = 0; //關閉負荷12
enPWM = 0; //禁止PWM
P14 = 1; //全速充電
PowerFlag = 0; //禁止放電
if(SunValue>BatValue)
Led_Ctrl(1,1); //運行狀態燈L3亮(充電)
else
Led_Ctrl(1,2);
Led_Ctrl(0,2); //過充過放燈L2閃爍(過放)
}
else
{
if(BatValue<YUNCHONG12)
{
enPWM = 0; //禁止PWM
P14 = 1; //全速充電
StopFlag = 0; //允許再次充電
if(SunValue>BatValue)
Led_Ctrl(1,1); //運行狀態燈L3亮(充電)
else
Led_Ctrl(1,2);
Led_Ctrl(0,0); //過充過放燈L2滅
}
if(PowerFlag)
{
if(TimeMode == 0)
{
P05 = 1; //啟動負荷
P04 = 1; //啟動負荷
CtrlFlag = 1;
}
else
{
Clr_Dog();
if(SunValue>=LIANGDENG12)
Delay4min2 = 0;
if(SunValue<=MIEDENG12)
Delay4min1 = 0; //延時清0
if(SunValue<NODELAY12)
{
P05 = 1; //啟動負荷11
if(CtrlFlag)
{
P04 = 1; //啟動負荷12
}
if(ClrFlag)
{
Seconds = 0; //清0
Minutes = 0; //清0
Hours = 0; //啟動負荷的同時時間清0開始計數
ClrFlag = 0; //禁止清0
}
}
else if(SunValue<LIANGDENG12)
{
if(Delay_4min(0)) /*延時4min*/
{
if(SunValue<LIANGDENG12)
{
P05 = 1; //啟動負荷
if(CtrlFlag)
{
P04 = 1; //啟動負荷
}
if(ClrFlag)
{
Seconds = 0; //清0
Minutes = 0; //清0
Hours = 0; //啟動負荷的同時時間清0開始計數
ClrFlag = 0; //禁止清0
}
}
}
}
else;
Clr_Dog();
if(SunValue>MIEDENG12)
{
if(Delay_4min(1))/*延時4min*/
{
if(SunValue>MIEDENG12)
{
P05 = 0; //關閉負荷11
P04 = 0; //關閉負荷12
ClrFlag = 1; //允許清0
CtrlFlag = 1;
}
}
}
if(Hours >= TimeMode && ClrFlag==0)
{
P04 = 0; //關閉負荷12
ClrFlag = 1; //允許清0
CtrlFlag = 0;
}
}
}
}
}
/*********************************************************************/
/*函數名:
/*功能:
/*輸入參數:
/*返回值:
/*調用函數:
/*被調用函數:
/*編寫日期:
/*最后修改日期:
/********************************************************************/
void Main_Logic24(uchar TimeMode)
{
Clr_Dog();
if(BatValue>TINGCHONG24)// && P14==0)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 0; //停止充電
StopFlag = 1; //停止充電
ET0 = 1;
}
PowerFlag = 1; //允許放電
Led_Ctrl(1,2); //運行狀態燈L3閃爍
Led_Ctrl(0,1); //過充過放燈L2亮
}
else if(BatValue>GUOCHONG24)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 1; //允許PWM
ET0 = 1;
}
PowerFlag = 1; //允許放電
if(SunValue>BatValue)
Led_Ctrl(1,1); //運行狀態燈L3亮
else
Led_Ctrl(1,2);
Led_Ctrl(0,1); //過充過放燈L2亮
}
else if(BatValue>YUNFANG24)
{
if(!StopFlag)
{
ET0 = 0;
enPWM = 0; //禁止PWM
P14 = 1; //全速充
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -