📄 b3tszh4.c
字号:
/* *************************************************** */
/* ******* BAT3TS1.C to Battery Multimeter ****** */
/* ******* Programed at 2001.6.1 - 7.1 ****** */
/* ******* Modify at 2001.7.10 ****** */
/* ******* Modify at 2001.7.20 ****** */
/* ******* Modify at 2001.12.8 ****** */
/* ******* Modify at 2002.4.1 ****** */
/* ******* Modify at 2002.5.8 for 12V battery ****** */
/* *************************************************** */
#include <reg52.h>
#include <stdio.h> /* standard I/O .h-file */
#include <ctype.h> /* character functions */
#include <string.h> /* string and memory functions */
#include <stdlib.h> /* standard library .h-file */
#include <math.h>
#include <absacc.h> /* */
#include <intrins.h> /* Total 8 */
/* sfr WDTC = 0x8F; */
/* Watchdog: clr_WDT=WDTC.6; enb_WDT=WDTC.7; */
/* sbit clr_WDT = WDTC^6; */
/* sbit enb_WDT = WDTC^7; */
/* sfr REMI = 0x8E; */
/* Reduce EMI: red_EMI=REMI.0; */
sbit DSP_DIG = P3^2;
sbit DSP_LED = P1^4; /* 0:display LED; 1:display digitals */
sbit A4051 = P1^5; /* 4051 channel select */
sbit B4051 = P1^6;
sbit C4051 = P1^7;
sbit KSC = P3^6; /* =WR, control CCI */
sbit KLD = P3^7; /* =RD, control CCV */
/* TLC549 pin defination */
sbit AD_CS = P2^0;
sbit AD_CLK = P2^1; /*4*/
sbit AD_DO = P2^2;
/* 93C46 pin defination */
sbit EPR_CS = P2^3; /*4*/
sbit EPR_CLK = P2^4;
sbit EPR_DO = P2^5; /* in from 93C46 */
sbit EPR_DI = P2^6; /* out to 93C46 */
/* manuel start test control */
sbit MS_CONT = P2^7;
void dlyst0(void);
void dlyss(void);
void dlys(void);
void dly(unsigned char times);
unsigned char powt(unsigned char base,unsigned char m);
unsigned int powti(unsigned char base,unsigned char m);
unsigned int average_l(unsigned char tim);
unsigned int average(unsigned char tim);
unsigned int Read_from_AD(void);
void send_byte(unsigned char dat);
unsigned int read_word(unsigned char addr);
void write_word(unsigned char addr,unsigned int data_out);
void make_data_ld(unsigned int Tem,char VIQ);
char get_key1(char tim);
char get_key2(char tim);
char get_key(char ksr);
char get_key_all();
void INIT_VIQ();
void save_VIQ();
void make_VIQ();
void LED_on(char bz);
void bell(unsigned char tim);
void VIQ_LED(char cha,char bz);
void show_SEL();
void show_SET();
void show_ADJ();
/*unsigned int get_OCV(unsigned char tim);*/
unsigned int get_OCV1(unsigned char tim);
unsigned int get_CCV(unsigned char tim);
unsigned char data_ld[17],U6_data,P1_data;
char DISP_count,FLASH_bz,OCV_bz,CCV_bz,CCI_bz,WORK_bz;
unsigned int FLASH_count,SEC_count,BELL_count,BATS_count;
idata char VIQ_LED_bz,ADJ_LED_bz,LED_on_bz;
idata unsigned int LOW_LIMIT[3],HIGH_LIMIT[3],ADJ_data[3];
idata float ADJ_data_act[3];
sfr WDTC = 0x8F;
/* Watchdog: clr_WDT=WDTC.6; enb_WDT=WDTC.7; */
/*sbit clr_WDT = WDTC^6;
sbit enb_WDT = WDTC^7; */
sfr REMI = 0x8E;
/* Reduce EMI: red_EMI=REMI.0; */
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
main() {
unsigned char dat,key_pressed,key_pressed_count;
char key_pressed_bz,key_obj,VIQ_select;
char chx,ACCESS_key,key_ACC2,TEST_bz,GOOD_bz[3],BELL_bz;
int dati;
idata int OCV_data,CCV_data,CCI_data;
idata float vx;
/*************** init first datas *****************/
SCON = 0x50; /* serial 232 port = mode 1 */
TMOD = 0x11; /* T0: timer,mode 1; T1=timer,mode 1 */
TL0 = 105; /* T1: 0.5mS timer = 666, to control display */
TH0 = 253; /* 16MHz, 1 count = 0.75uS */
TR0 = 1;
TH1 = 0; /* normal timer */
TL1 = 0;
TR1 = 0;
PCON = 0; /* T2: baud rate generator */
T2CON = 0;
TR2 = 0;
IE = 0; /* Disable all interrupt */
IP = 0;
TI = 0;
RI = 0;
ES = 0; /* Disable serial interrupt */
ET0 = 1; /* Enable T0 timer */
ET1 = 0; /* Disable T1 timer */
AD_CS = 1;
AD_CLK = 0;
AD_DO = 1;
EPR_CS = 0;
EPR_CLK = 0;
EPR_DI = 0;
EPR_DO = 1;
dly(1);
INIT_VIQ();
P1 = 0xf0;
P3 = 0x0f;
P0 = 0x54; /* U5:Display datas =0 */
dlyss();
T0 = 1;
dlyss();
T0 = 0;
P0 = 0x0f; /* U6: Control datas */
dlyss();
T1 = 1;
dlyss();
T1 = 0;
U6_data=0x0f;
if(OCV_bz==0) make_data_ld(10000,1);
else make_data_ld(0,1);
if(CCV_bz==0) make_data_ld(10000,2);
else make_data_ld(0,2);
if(CCI_bz==0) make_data_ld(10000,3);
else make_data_ld(0,3);
make_data_ld(0,4);
data_ld[16]=0x00;
/****************************************************/
ACCESS_key=0;
key_pressed=0;
key_pressed_bz=0;
key_ACC2=0;
TEST_bz=0;
WORK_bz=0;
GOOD_bz[0]=0;
GOOD_bz[1]=0;
GOOD_bz[2]=0;
FLASH_bz=0;
LED_on_bz=0;
KSC=0;
KLD=0;
SEC_count=0;
BELL_bz=0;
BELL_count=0;
BATS_count=0;
P1_data=0x10;
/*enb_WDT=1;
red_EMI=1;*/
EA = 1; /** ????? **/
main_loop_start:
WDTC=0xc4;
/********test**********
ET0=0;
ET1=0;
KLD=1;
KLD=0;
KSC=1;
KSC=0;
KLD=1;
KLD=0;
KSC=1;
KSC=0;
get_key_all();
/************test***********/
/*clr_WDT=1; clear Watchdog, reset period : 100 = 350 mS */
/********************************
*** Try CCV & CCI circut. ***
dati=1;
rls:
KSC=1;
dly(2);
KSC=0;
dly(2);
if(dati==1) goto rls;
/******************************/
if(TEST_bz>0) goto TEST_PROGRAM;
/**************** Key Set System Program *******************/
if(ACCESS_key==0) {
dat=get_key1(2);
if(dat==1) {
dat=get_key2(50);
if(dat==1) {
ACCESS_key=1;
key_pressed=1;
key_pressed_bz=1;
key_obj=1;
bell(50);
LED_on(1);
}
}
else
goto TEST_PROGRAM;
}
if(ACCESS_key==1 && key_ACC2==0) { /**---------- ACCESS_key=1 ****/
if(key_pressed_bz>0) {
dat=get_key_all();
if(dat==0) {
key_pressed_bz=0;
if(key_pressed==2) {
key_ACC2=1;
VIQ_select=1;
VIQ_LED_bz=1;
ADJ_LED_bz=1;
}
key_pressed=0;
}
dly(10);
}
else {
dat=get_key_all();
if(dat>0)
dat=get_key(dat);
if(dat>0) {
key_pressed_bz=1;
key_pressed=dat;
bell(40);
}
if(key_pressed==1) {
key_obj++;
if(key_obj>4) key_obj=1;
LED_on(key_obj);
}
}
} /**----- ACCESS_key=1, key_ACC2=0 ****/
if(ACCESS_key==1 && key_ACC2==1) { /**---------- ACCESS_key=1 **********************/
/*********** key_obj=1-4 ****************************************************/
if(key_obj==1) { /* key operation over */
save_VIQ();
ACCESS_key=0;
key_ACC2=0;
key_pressed=0;
key_pressed_bz=0;
LED_on(0);
}
/****************** key_obj=1 ******************************************/
else if(key_obj==2) { /* select test object */
show_SEL();
FLASH_bz=VIQ_select;
if(key_pressed_bz>0) {
dat=get_key_all();
if(dat==0) {
key_pressed_bz=0;
if(key_pressed==2) {
ACCESS_key=0;
key_ACC2=0;
save_VIQ();
data_ld[16]=0;
FLASH_bz=0;
LED_on(0);
}
key_pressed=0;
}
dly(10);
}
else {
dat=get_key_all();
if(dat>0) dat=get_key(dat);
if(dat>0) {
key_pressed=dat;
key_pressed_bz=1;
bell(40);
}
if(key_pressed==1) {
VIQ_select++;
if(VIQ_select>3) VIQ_select=1;
}
else if(key_pressed==3) {
if(VIQ_select==1) OCV_bz=0;
else if(VIQ_select==2) CCV_bz=0;
else if(VIQ_select==3) CCI_bz=0;
}
else if(key_pressed==4) {
if(VIQ_select==1) OCV_bz=1;
else if(VIQ_select==2) CCV_bz=1;
else if(VIQ_select==3) CCI_bz=1;
}
}
} /* (key_obj==2) */
/****************** key_obj==2 ********************************************/
else if(key_obj==3) { /* set LOW/HIGH LIMITt */
show_SET();
dat=(VIQ_LED_bz+1)/2;
FLASH_bz=dat;
if(key_pressed_bz>0) {
dat=get_key_all();
if(dat==0) {
key_pressed_bz=0;
key_pressed_count=0;
if(key_pressed==2) {
ACCESS_key=0;
key_ACC2=0;
save_VIQ();
data_ld[16]=0;
FLASH_bz=0;
LED_on(0);
}
key_pressed=0;
dly(10);
}
else if(dat==3 && key_pressed_count>30) { /* < */
dat=VIQ_LED_bz/2;
dat=VIQ_LED_bz-dat*2;
if(dat==1) {
dat=VIQ_LED_bz/2;
LOW_LIMIT[dat]-=20;
}
else {
dat=VIQ_LED_bz/2;
HIGH_LIMIT[dat-1]-=20;
}
dly(150);
}
else if(dat==4 && key_pressed_count>30) { /* > */
dat=VIQ_LED_bz/2;
dat=VIQ_LED_bz-dat*2;
if(dat==1) {
dat=VIQ_LED_bz/2;
LOW_LIMIT[dat]+=20;
}
else {
dat=VIQ_LED_bz/2;
HIGH_LIMIT[dat-1]+=20;
}
dly(150);
}
else if(key_pressed_count<110)
key_pressed_count++;
} /*** (key_pressed_bz>0) ***/
else {
dat=get_key_all();
if(dat>0) dat=get_key(dat);
if(dat>0) {
key_pressed=dat;
key_pressed_bz=1;
bell(40);
}
if(key_pressed==1) {
VIQ_LED_bz++;
if(VIQ_LED_bz>6) VIQ_LED_bz=1;
}
else if(key_pressed==3) { /* < = decrease */
dat=VIQ_LED_bz/2;
dat=VIQ_LED_bz-dat*2;
if(dat==1) {
dat=VIQ_LED_bz/2;
LOW_LIMIT[dat]--;
}
else {
dat=VIQ_LED_bz/2;
HIGH_LIMIT[dat-1]--;
}
}
else if(key_pressed==4) { /* > = increase */
dat=VIQ_LED_bz/2;
dat=VIQ_LED_bz-dat*2;
if(dat==1) {
dat=VIQ_LED_bz/2;
LOW_LIMIT[dat]++;
}
else {
dat=VIQ_LED_bz/2;
HIGH_LIMIT[dat-1]++;
}
}
} /*key_pressed_bz=0*/
} /* key_obj==3; set LOW/HIGH LIMITt */
/****************** key_obj==3 **********************************************/
else if(key_obj==4) { /* set Adjust Number of OCV/CCV/CCI */
show_ADJ();
FLASH_bz=ADJ_LED_bz;
if(key_pressed_bz>0) {
dat=get_key_all();
if(dat==0) {
key_pressed_bz=0;
key_pressed_count=0;
if(key_pressed==2) {
ACCESS_key=0;
key_ACC2=0;
save_VIQ();
data_ld[16]=0;
FLASH_bz=0;
LED_on(0);
if(OCV_bz==1) make_data_ld(0,1);
else make_data_ld(10000,1);
if(CCV_bz==1) make_data_ld(0,2);
else make_data_ld(10000,2);
if(CCI_bz==1) make_data_ld(0,3);
else make_data_ld(10000,3);
}
key_pressed=0;
dly(10);
}
else if(dat==3 && key_pressed_count>30) { /* < */
dat=ADJ_LED_bz-1;
if(ADJ_data[dat]>10) ADJ_data[dat]-=10;
dly(150);
}
else if(dat==4 && key_pressed_count>30) { /* > */
dat=ADJ_LED_bz-1;
if(ADJ_data[dat]<2000) ADJ_data[dat]+=10;
dly(150);
}
else if(key_pressed_count<110)
key_pressed_count++;
} /*** (key_pressed_bz>0) ***/
else {
dat=get_key_all();
if(dat>0) dat=get_key(dat);
if(dat>0) {
key_pressed=dat;
key_pressed_bz=1;
bell(40);
}
if(key_pressed==1) { /* F1 key */
ADJ_LED_bz++;
if(ADJ_LED_bz>3) ADJ_LED_bz=1;
}
else if(key_pressed==3) { /* < = decrease */
dat=ADJ_LED_bz-1;
if(ADJ_data[dat]>1) ADJ_data[dat]--;
}
else if(key_pressed==4) { /* > = increase */
dat=ADJ_LED_bz-1;
if(ADJ_data[dat]<2000) ADJ_data[dat]++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -