📄 bat_ctrl_12v24v_led.c
字号:
/****************************************************************/
/*功能:
/*版本:v1.0
/*设计人:ye_zhenfeng
/*编写日期:07-08-25
/*最后修改日期:
/*状态:in test
/****************************************************************/
/*头文件定义*/
#include <reg915.h>
/*特殊寄存器定义*/
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit HC595_SHC = P1^0;
sbit HC595_STC = P1^1;
sbit HC595_DAT = P1^2;
sbit BUTTON = P1^3;
sbit P14 = P1^4;
/*预定义部分*/
#define uchar unsigned char
#define uint unsigned int
#define AD_NUM 32
//24v
#define TINGCHONG24 88*2 //14.8V*2/3.178V
#define GUOCHONG24 83*2 //14.0V*2
#define YUNCHONG24 80*2 //13.4V*2
#define YUNFANG24 75*2 //12.4V*2
#define GUOFANG24 65*2 //10.8V*2
#define MIEDENG24 19*2 //3.5V*2
#define LIANGDENG24 16*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 75 //12.4V
#define GUOFANG12 65 //10.8V
#define MIEDENG12 19 // 3.5V
#define LIANGDENG12 16 // 2.5V
#define NODELAY12 4 //0.7v
#define DELAY_MIN 1*8000 // 1.5min
/*全局变量定义*/
uchar code segment[10] =
{0x3f, // '0'
0x06, // '1'
0x5b, // '2'
0x4f, // '3'
0x66, // '4'
0x6d, // '5'
0x7d, // '6'
0x07, // '7'
0x7f, // '8'
0x6f // '9'
};
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 SegFlag; //数码管显示标志
//bit ModeBackFlag; //模式返回标志,'1'表示等待返回
bit ModeWaitFlag; //模式设定进入等待标志,'1'表示等待进入计数
bit ModeSetFlag; //模式设置状态标志,'1'表示处于模式设定状态
bit enL2,enL3;
bit enPWM;
bit enDelay1,enDelay2;
uchar L2Delay,L3Delay; //用于L2、L3闪烁定时,计数50次,越0.5s
uint Delay4min1,Delay4min2; //用于延时4min计数,计数20000次
uchar Mode; //
uchar ModeSet,ModeBack; //进入模式、模式返回等待定时
/*函数声明部分*/
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 Display(void);
void Dis_seg(uchar);
void Main_Logic12(uchar);
void Main_Logic24(uchar);
void Clr_Dog(void);
void Led_Ctrl(bit,uchar);
bit Delay_4min(bit);
/*中断服务函数*/
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void E0_ISR() interrupt 0
{
EA = 0;
ModeBack = 0; //
if(ModeSetFlag)
{
if(Mode==9)
Mode = 0;
else
Mode ++;
}
else
{
ModeWaitFlag = 1;
}
EA = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void T0_ISR() interrupt 1
{
EA = 0;
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;
}
EA = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
void T1_ISR() interrupt 3
{
EA = 0;
TH1 = 0x80; //
TL1 = 0x00; //
if(enDelay1)
Delay4min1++;
if(enDelay2)
Delay4min2++;
EA = 1;
}
/*********************************************************************/
/*函数名:
/*功能:
/*输入参数:
/*返回值:
/*调用函数:
/*被调用函数:
/*编写日期:
/*最后修改日期:
/********************************************************************/
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 ++;
}
}
}
SegFlag = !SegFlag;
if(ModeWaitFlag)
{
if(!BUTTON)
{
if(ModeSet>=5)
{
ModeSetFlag = 1;
ModeWaitFlag = 0;
ModeSet = 0;
}
else
ModeSet ++;
}
}
else
{
if(ModeSetFlag)
{
if(ModeBack >=5)
{
ModeSetFlag = 0;
ModeBack = 0;
}
else
ModeBack ++;
}
}
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;
uchar TimeMode;
bit VoltFlag;
Init_All();
i = 1000;
while(i--)
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 = 0x2C; //B00101100 //P1.0P1.1P1.2作为数码管输出
P1M2 = 0x17; //B00010111 //P1.3作为键盘中断输入
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -