📄 7135.c
字号:
#include <AT89X52.H>
#include<intrins.h>
#define PERIOD 0x59
#define SECOND 4000
sbit Dwon_Key=P3^1; //下调
sbit Set_Key=P3^0; //设置
sbit Up_Key=P1^7; //上调
sbit LED_Segment=P2^0; //字段
sbit LED_Location=P2^1; //位
sbit Dog_Out=P2^3; //喂狗
sbit dp=P0^7; //点
sbit fk=P0^6; //负号
sbit POL=P1^5; //极性
sbit BUSY=P3^2; //BUSY输入
sbit CD=P1^3; //充电
sbit FD=P1^2; //放电
sbit CM=P2^5; //充满
unsigned char H,L,dog,sec,js,KeyCount,Bat=1,N=1;
int Value,count,MAX_V;
unsigned char code LED_Show[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf,0xab,0x89,0xc7};
unsigned char code LED_Bit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char bdata bData;
sbit YC=bData^0;
sbit FDdone=bData^1;
sbit Full=bData^2;
sbit Puse=bData^3;
void iniINT0(void){
IT0=1;
EX0=1;
BUSY=1;
}
void iniTimer0(void) //初始化Timer0
{
TMOD=TMOD | 0x0d;
TH0=0xD8;
TL0=0xEF;
TR0 = 1;
}
/*------------------------------------定时器T1初始化----------------------------*/
void iniTimer1(void){
TH1 = PERIOD;
TL1 = PERIOD;
TMOD = TMOD | 0x20;
TR1 = 1; /* 启动T1 */
EA = 1; /* 开中断 */
ET1 = 1; /* 允许T1中断 */
}
/*----------------------------------------------------------------------------------*/
/*------------------------------------定时器T1中断服务程序----------------------------*/
timer1() interrupt 3 using 2
{
++dog;++KeyCount;
if(dog<50){
Dog_Out=0;
}
if(dog>50){
Dog_Out=1;
}
if(dog>100){
dog=0;
}
if(++count == SECOND){
count=0;
if(++sec==60){
sec=0;
}
}
if(!Full && !Puse && FDdone && Bat==1){
if(count<=3940){
CD=0;
}
if(count>3940 && count <=3948){
CD=1;
}
if(count>3948 && count <=3988){
FD=0;
}
if(count>3988){
FD=1;
}
}
}
/***************************************外部中断0中断程序****************************************************/
Int0() interrupt 0 using 1
{
int temp;
H=TH0;L=TL0;
TH0=0xD8;TL0=0xEF;
temp=H;
temp=(temp<<8);
temp=temp | L;
if(temp<=19999){
Value=temp;
YC=0;
}
if(temp>=20000){
YC=1; //置溢出标志位
}
}
void Delay50us(char z){
char j,i;
for(j=0;j<z;j++)
for(i=0;i<1;i++)
;
}
/*-----------------------------字段显示触发脉冲--------------------------------------*/
void Segment_Pulse(void){
LED_Segment=1;
_nop_();_nop_();_nop_();
LED_Segment=0;
_nop_();_nop_();_nop_();
}
/*----------------------------------------------------------------------------------*/
/*-----------------------------位显示触发脉冲--------------------------------------*/
void Location_Pulse(void){
LED_Location=1;
_nop_();_nop_();_nop_();
LED_Location=0;
_nop_();_nop_();_nop_();
}
/*----------------------------------------------------------------------------------*/
void Location_0(void){
P0=0;
Location_Pulse();
}
void Show_V(void){ //显示电压
unsigned char x,y;
int j,z,k;
j=Value%10000;z=j%1000;k=z%100;
for(x=0;x<8;x++){
switch(x+1){
case 1:
if(Bat==1){
y=12;
}
if(Bat==2){
y=13;
}
if(Bat==3){
y=14;
}
break;
case 2:y=N;break;
case 3:
if(!YC){
y=10;
}
if(YC){
if(count<2500){
y=1;
}
if(count>2500&&count<5000){
y=10;
}
}
break;
case 4:y=Value/10000;break;
case 5:y=j/1000;break;
case 6:y=z/100;break;
case 7:y=k/10;break;
case 8:y=k%10;break;
default:break;
}
if(x==3|x==4|x==5|x==6|x==7){
if(YC){
y=10;
}
}
P0=LED_Show[y];
if(!POL && x==2){
fk=0;
}
Segment_Pulse();
P0=LED_Bit[x];
Location_Pulse();
Delay50us(20);
Location_0();
}
}
void AutoCD1(void){ //镍镉自动充电
if(!FDdone && !Full){
if(Value > (950*N)){
CD=1;FD=0;
}
if(Value < (950*N)){
FD=1;FDdone=1;
}
}
if(FDdone && !Full){
if(sec==57){
CD=0;FD=1;Puse=1;
}
if(sec==59){
if(Value>MAX_V){
MAX_V=Value; //最大值存于MAX_V
}
if((MAX_V-Value)>(7*N)){ //-△V停止充电检测(脉冲充电)
CM=0;CD=1;FD=1;Full=1;
}
Puse=0;
}
}
}
void AutoNH(void){ //镍氢电池自动充电
if(!FDdone && !Full){
if(Value > (1000*N)){
CD=1;FD=0;
}
if(Value < (1000*N)){
FD=1;CD=0;FDdone=1;
}
}
if(FDdone && !Full){
if(Value>MAX_V){
MAX_V=Value; //最大值存于MAX_V
}
if((MAX_V-Value)>(3*N)){ //-△V停止充电检测(恒流充电)
Full=1;CM=0;CD=1;FD=1;
}
}
}
void BatCD(void){
if(Bat==1){
AutoCD1();
}
if(Bat==2){
AutoNH();
}
if(Bat==3){
;
}
}
void KEY(void){
if(!Up_Key){ //启动充电
Full=0;CM=1;
}
if(!Dwon_Key){ //设置电池节数
if(++KeyCount>200){
N++;KeyCount=0;
if(N==11){
N=1;
}
}
}
if(!Set_Key){ //设置电池种类
if(++js > 25){
Bat++;js=0;
if(Bat>3){
Bat=1;
}
}
}
}
void main(void){
iniINT0();
iniTimer0();
iniTimer1();
Full=1;
while(1){
Show_V();
BatCD();
KEY();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -