📄 复件 new400_c.c
字号:
e_138=1;//a_138=1;b_138=1;c_138=1;
temp=dispcode[ram3];
if(shift==2)temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=1;b_138=0;c_138=0;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
temp=dispcode[ram2];
if(shift!=2)temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=0;b_138=1;c_138=0;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
temp=dispcode[ram1];
temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=1;b_138=1;c_138=0;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
//--------------------
if(flag_second==1)//此处完成实际时间显示的转换
{
flag_second==0;
long_temp=real_time;
to_bcd_to_display_ram();
ram5=ram1;
ram6=ram2;
ram7=ram3;
}
//---------------------
temp=dispcode[ram7];
temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=0;b_138=0;c_138=1;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
temp=dispcode[ram6];
temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=1;b_138=0;c_138=1;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
temp=dispcode[ram5];
temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=0;b_138=1;c_138=1;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
//-----------------------
//-----------------------
temp=bits.ram8;
if(set_work==0)
{
if (TMR1ON==0)//实现 指示灯的运/停 亮暗;
{
temp=0xff;
}
else
{
temp=bits.ram8;
}
}
to_74hc164(temp);
e_138=0;a_138=1;b_138=1;c_138=1;
delay_1ms(2); //
e_138=1;//a_138=1;b_138=1;c_138=1;
to_74hc164(0xff);//送出数码管段选熄灭保护处理
}
//---------------------------------
void ad_change(void)
{
asm("nop");
asm("nop");
if (ad_delay<7){ad_delay=ad_delay+1;return;}//ad_delay time
else {ad_delay=0;}
switch (ad_channel)
{//----RA,0通道中的4路set_cur,real_vol,real_cur,set_dvol
case 1: ADCON0=0xc0;a_4052=0;b_4052=0;break;//;11 000/000 000
case 2: ADCON0=0xc0;a_4052=1;b_4052=0;break;//;11 000/001 000
case 3: ADCON0=0xc0;a_4052=0;b_4052=1;break;//RA5;实际电流通道
case 4: ADCON0=0xc0;a_4052=1;b_4052=1;break;//RA5;实际电流通道
//----RA,1通道中的5路分电压
case 5: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=0;b_4052=0;break;//;11 000/010 000
case 6: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=1;b_4052=0;break;//
case 7: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=0;b_4052=1;break;//
case 8: ADCON0=0xc8;mid4_enable=0;mid5_enable=1;a_4052=1;b_4052=1;break;//
case 9: ADCON0=0xc8;mid4_enable=1;mid5_enable=0;a_4052=0;b_4052=0;break;//
default: break;
}
ADCON1=0x85; //D VREF+ D A A
delay_1ms(9); //
ADON=1;
ADFM=1; //the ad results = adresh(2) + adresl(8);
ADIF=0;
ADIE=0;
ADGO=1;
while(ADGO)//
{
asm("nop");
}
//e_4051=1;
long_temp=((ADRESH*256)+ADRESL);
switch (ad_channel)
{//----RA,0通道中的4路set_cur,real_vol,real_dcur,set_dvol
case 1:
{
long_temp=((long_temp*993)/1000);
set_dcur=long_temp;break;//
}
case 2:
{
long_temp=((long_temp*820)/1000);
real_dvol=long_temp;break;//
}
case 3:
{
long_temp=((long_temp*1339)/1000);
real_dcur=long_temp;break;//
}
case 4:
{
long_temp=(((long_temp*248)/1000)+315);
set_dvol=long_temp;break;//
}
case 5:
{
if(long_temp>10)
{
long_temp=((long_temp*4337)/1000-794);
vol_mid1=long_temp;break;//
}
else
{
vol_mid1=0;break;//
}
}
case 6:
{if(long_temp>10)
{
long_temp=((long_temp*3000)/1000-325);
vol_mid2=long_temp;break;//
}
else
{
vol_mid2=0;break;//
}
}
case 7:
{
if(long_temp>10)
{
long_temp=((long_temp*2448)/1000-181);
vol_mid3=long_temp;break;//
}
else
{
vol_mid3=0;break;//
}
}
case 8:
{
if(long_temp>10)
{
long_temp=((long_temp*2356)/1000-194);
vol_mid4=long_temp;break;//
}
else
{
vol_mid4=0;break;//
}
}
case 9:
{
if(long_temp>10)
{
long_temp=((long_temp*4337)/1000-794);
vol_mid5=long_temp;break;//
}
else
{
vol_mid5=0;break;//
}
}
default: break;
}
//---------------------------------
if(average!=0){return;}//如果平均数一次取完;
if(ad_channel<9)//才允许通道数增加;
{ad_channel=ad_channel+1;}
else
{ad_channel=1;}
return;
}
//*******************to bcd**********************
void to_bcd_to_display_ram(void)
{
if (long_temp<1000)ram4=0;
else
{
ii=0;
while(1)
{
long_temp=long_temp-1000;
ii=ii+1;
if (long_temp<1000)break;
}
ram4=ii;
}
if (long_temp<100) ram3=0;
else {
ii=0;
while(1)
{
long_temp=long_temp-100;
ii=ii+1;
if (long_temp<100)break;
}
ram3=ii;
}
if (long_temp<10) {ram2=0;ram1=long_temp;}
else {
ii=0;
while(1)
{
long_temp=long_temp-10;
ii=ii+1;
if (long_temp<10)break;
}
ram2=ii;
ram1=long_temp;
}
return;
}
//***************端口初始化***********************
void port_init(void)
{
asm("nop");
OPTION=0x07;
ADCON1=0x05; //D VREF+ D A A
TRISA=0x1f;
PORTA=0x00; //A
TRISB=0x20; //
PORTB=0x00; //B
ln_con=1;
TRISC=0x00;
PORTC=0x00; //C
T1CON=0xc0; //"11000000" 1:8 prescale value
PIE1=0x01;
ADIE=0; //disable ad interrupt
INTCON=0X40;
TMR1ON=0; //TIMER run
T0IF=0; //clear 中断 flag
T0IE=0; //enable TMR0中断
}
//***************TMR0初始****************
void tmr1_init(void)
{
GIE=1; //开启全局中断
//T0IF=0; //清中断标志
//T0IE=0; //允许TMR0中断
TMR1IF=0;
PIR1=0x00;
PIE1=0x01;
TMR1IE=1;
TMR1ON=0;
}
//***************************************
//*************主程序********************
void main(void)
{
asm("nop");
asm("nop");
asm("nop");
ad_delay=0;
real_time=0x0000;
time.set_dtime=0x0000;
real_dcur=1;real_dvol=2;
set_dcur=3;set_dvol=4;
ram1=1;ram2=0;ram3=0;ram4=0;ram5=0;ram6=0;ram7=0;
bits.led.b_cur=0;bits.led.b_vol=1;//
bits.led.b_mid1=1;
bits.led.b_mid2=1;
bits.led.b_mid3=1;
bits.led.b_mid4=1;
bits.led.b0=1;
bits.led.b_mid5=1;
eep_run=0; //动过充电设置时间需要写入eep标记
ad_delay=0; //ad 延时常数
shift=2; //首先SHIFT切换位置落在电流查看项;
ad_channel=1; //AD通道首先从0开始;
dischar_con=1;//首先关闭放电动作
one_second=20;//累计一秒
one_minute=60;//累计一分
GIE=0; //disable all interrupt
//------------------
port_init();
if(auto_manual==1)mode_flag=1;
else mode_flag=0; //此处率先采样自动——手动模式作为一个判断底数
//------------------
buzzer();
//----以下为实际设置充电时间读出
EEPGD =0;
EEADR = 0x69;
RD = 1;
while(RD == 1);
time.set_dtimeh=EEDATA; //设置充电时间高字节
EEADR = 0x6A;
RD = 1;
while(RD == 1);
time.set_dtimel=EEDATA; //设置充电时间低字节
if (time.set_dtimeh==0xff)
{
//CLRWDT();
EEPGD =0;
EEADRH = 0x00;
EEADR = 0x69;
time.set_dtimeh=EEDATA=0x00;//;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
while(WR == 1);
EEADR = 0x6A;
time.set_dtimel=EEDATA=60;//;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
while(WR == 1);
WREN = 0;
}
else
//----以下为实际放电时间 掉电读出
{
//CLRWDT();
EEPGD =0;
EEADR = 0x30;
RD = 1;
while(RD == 1);
real_time=EEDATA;
if (real_time==0x00ff)
{
//CLRWDT();
EEPGD =0;
EEADR = 0x30;
real_time=EEDATA = 0;//0x3f;
WREN = 1;
GIE = 0;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
while(WR == 1);
WREN = 0;
average=0x0;
average_temp=0x00;
GIE = 0;
}
}
//------------------
delay_1ms(100); //延
tmr1_init(); //tmr0 初始
pwr_up=1; //开启上电小继电器
pwr_up=1; //开启上电小继电器
while(1)
{
asm("nop");
ad_change();
//----------------
/* if((TMR1ON==1)&&(0))
{
dischar_con=1; //停止放电
T1CON&=0xfe;//TMR1ON=0;//tmr0 stop
buzzer();
} */
//----------------
asm("nop");
bodong(); //监测自动/手动模式拨动开关状态是否改变
asm("nop");
shift_scan(); //
asm("nop");
led_display();
asm("nop");
run_scan();
asm("nop");
stop_scan();
}
}
//----------------
/*#asm
#endasm */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -