📄 复件 new400_c.c
字号:
#include "pic.h"
#include "pic1687x.h"
#include "math.h"
//__CONFIG (XT & PROTECT & PWRTEN & BOREN & WDTDIS);
//unsigned char get_code(uchar i);
void delay_1ms(unsigned int i);
void to_74hc164(unsigned char dd);
void tmr1_init(void);
void port_init(void);
void led_display(void);
void buzzer(void);
void ad_change(void);
void run_scan(void);
void stop_scan(void);
void shift_scan(void);
void bodong(void);
void to_bcd_to_display_ram(void);
void interrupt ISR(void);
void average_real_vol(void);
void average_real_cur(void);
//----------------------------------------------
unsigned char ram8;// @ 0x20;
unsigned char flag;//
unsigned char shift,average;
unsigned char one_second,one_minute;
unsigned char i,dd,j,k,temp,ad_channel,ii,ad_delay;
unsigned long long_temp;
unsigned short average_temp;//平均次数和 平均累计值
unsigned short set_dcur,set_dvol,vol_mid1,vol_mid2,vol_mid3,vol_mid4,vol_mid5;
unsigned short real_ccur,real_dcur,real_cvol,real_dvol,real_time,set_dtime;
unsigned char ram1,ram2,ram3,ram4,ram5,ram6,ram7;//
//----------------------------------------------
bit from_4051 @ (unsigned)&PORTA*8+0;
bit ad_real_1_4_vol @ (unsigned)&PORTA*8+1;
bit set_work @ (unsigned)&PORTA*8+2;//用于工作\设置模式切换
bit three @ (unsigned)&PORTA*8+4; //three key all输入
//bit ad_real_cur @ (unsigned)&PORTA*8+5;
bit ln_con @ (unsigned)&PORTB*8+0; //220v 继电器控制端
bit dischar_con @ (unsigned)&PORTB*8+1; //放电控制端
bit beep @ (unsigned)&PORTB*8+2; //buzzer
bit a_4052 @ (unsigned)&PORTB*8+4; //
bit auto_manual @ (unsigned)&PORTB*8+5; //手动自动模式设置
bit mid4_enable @ (unsigned)&PORTB*8+6;//1-4节分电压4052使能端
bit mid5_enable @ (unsigned)&PORTB*8+7;//第5节分电压4052使能端
bit a_138 @ (unsigned)&PORTC*8+0; //a-138
bit b_138 @ (unsigned)&PORTC*8+1; //b-138
bit c_138 @ (unsigned)&PORTC*8+2; //c-138
bit e_138 @ (unsigned)&PORTC*8+3; //ENABLE——
bit pwr_up @ (unsigned)&PORTC*8+4; //pwr_up 口线上电接通+12V输入控制端,
bit b_4052 @ (unsigned)&PORTC*8+5; //a-4051
bit clk_164 @ (unsigned)&PORTC*8+6; //run_stop i/o
bit data_164 @ (unsigned)&PORTC*8+7; //run_stop i/o
bit eep_run,flag_run,flag_stop,flag_shift,flag_second,mode_flag;
//---------------------------
//以下定义为指示灯位标记地址!!!
/*
bit b_dis @ (unsigned)&ram8*8+7;
bit b_char @ (unsigned)&ram8*8+6;
bit b_pulse @ (unsigned)&ram8*8+5;
bit b_time @ (unsigned)&ram8*8+4;
bit b_vol @ (unsigned)&ram8*8+3;
bit b_cur @ (unsigned)&ram8*8+2;
*/
//--------------------------------------------------------
const unsigned char dispcode[14]={0x04,0xc7,0x88,0x81,0x43,
0x21,0x20,0x87,0x00,0x01,0xff,0x1c,0xff,0x1c};
//常数型 数组 0123456789段码
//const unsigned char *point;
//unsigned char dispbuf[6]={0,0,0,0,0,0};//缓冲数组
union{
unsigned int set_dtime;
unsigned char set_dtimeh,set_dtimel;
}time;
//--------------------------------
union{
struct {
unsigned b0:1;
unsigned b_mid5:1;
unsigned b_cur:1; //3
unsigned b_vol:1; //5
unsigned b_mid1:1;
unsigned b_mid2:1;//6
unsigned b_mid3:1;
unsigned b_mid4:1;
}led;
unsigned char ram8;
}bits;
//**************中断SERVICE程序****************************
void interrupt ISR(void) //中断服务程序
{
if (T0IE && T0IF) //
{
T0IF = 0; //清
}
if (TMR1IE && TMR1IF) //
{
TMR1IF = 0; //清
TMR1H = 0x3c;
TMR1L = 0xaf; //15535;
if (one_second!=0){one_second=one_second-1;return;}
else {one_second=20;}
if (one_minute!=0){one_minute=one_minute-1;return;}
else {one_minute=60;}//60;
real_time=real_time+1;
flag_second=1;//one time occuppy
//CLRWDT();
/*
EEPGD =0;
EEADR = 0x30;
EEADRH = 0x00;
EEDATA=0X20;//real_time; //;写入时间
WREN = 1;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
while(WR == 1);
WREN = 0;
TMR1IF = 0;//清
return; */
}
}
//-------------------------------------
void to_74hc164(unsigned char dd)//
{
//int j; //局部变量i
for (j=0;j<8;j++)
{
data_164=(bit)(dd&0x01);
clk_164=1;
asm("nop");asm("nop");
clk_164=0;
asm("nop");asm("nop");
dd=dd>>1;
}
}
//****************1ms延时程序******************
void delay_1ms(unsigned int i)
{
unsigned char j;
for(;i!=0;i--)
for(j=141;j!=0;j--);
}
///****************按键检测*********************
//-----------------------------------
//以下开始扫描按扭
//-----------------------------------
void shift_scan(void)
{
asm("nop");
temp=0x7f;
to_74hc164(temp);
delay_1ms(3);
if (three==0)
{
if (flag_shift==1)
{
flag_shift=0;
buzzer();
shift=shift+1;
}
}
else
{
flag_shift=1;
}
//-----------------------------------------
if (shift>=8) shift=1;
{
bits.ram8=0xff;
switch (shift)
{
case 1:
{
if(set_work==0)//判断是否处于工作/设置电流模式
{
long_temp=real_dcur;
}
else
{
long_temp=set_dcur;
}
to_bcd_to_display_ram();
bits.led.b_vol=0; break;//*1*/
}
case 2:
{
if(set_work==0)//判断是否处于工作/设置电流模式
{
long_temp=real_dvol;
}
else
{
long_temp=set_dvol;
}
to_bcd_to_display_ram();
bits.led.b_cur=0; break;//*2*/
}
case 3:
{
long_temp=vol_mid1;
to_bcd_to_display_ram();
bits.led.b_mid1=0; break;
}
case 4:
{
long_temp=vol_mid2;
to_bcd_to_display_ram();
bits.led.b_mid2=0; break;
}
case 5:
{
long_temp=vol_mid3;
to_bcd_to_display_ram();
bits.led.b_mid3=0; break;
}
case 6:
{
long_temp=vol_mid4;
to_bcd_to_display_ram();
bits.led.b_mid4=0; break;
}
case 7:
{
long_temp=vol_mid5;
to_bcd_to_display_ram();
bits.led.b_mid5=0; break;
}
default: break;
}
return;
}
}
//---------------
void run_scan(void)
{
temp=0xdf;
to_74hc164(temp);
delay_1ms(3);
if (three==0)
{
eep_run=0;
if(flag_run==1)
{
flag_run=0; //只有在非充电时间设置模式,蜂鸣和按钮弹起才使能
buzzer();
if(auto_manual==1)
{
if(mode_flag==1)
{
dischar_con=0; //放电控制端关闭
ln_con=0; //开始220v充电
real_time=0;
T1CON|=0x01; //TMR1ON=1; //tmr0 run;
TMR1ON=1; //TIMER run
TMR1IE=1;
GIE=1;
return;
}
}
else
{
if(mode_flag==0)
{
ln_con=1; //开始关闭220v充电
dischar_con=1; //放电控制端开启
real_time=0;
T1CON|=0x01; //TMR1ON=1; //tmr0 run;
TMR1ON=1; //TIMER run
TMR1IE=1;
GIE=1;
return;
}
}
}
}
else
{
flag_run=1;
}
}
//---------------
void stop_scan(void)
{
temp=0xbf;
to_74hc164(temp);
delay_1ms(3);
if (three==0)
{
if(flag_stop==1)
{
flag_stop=0; //只有在非充电时间设置模式,蜂鸣和按钮弹起才使能
buzzer();
//ln_con=1;//220V 继电器关闭
dischar_con=0;//放电控制端开启关闭
TMR1ON=0; //TIMER run
TMR1IE=0;
//GIE=1;
}
}
else
{
flag_stop=1;
}
}
//-----------------------------------------
//以下为拨动开关状态检测函数
void bodong(void)
{
if(auto_manual==1)
{
if(mode_flag==0) //表示已经发生过开关扳动
{
mode_flag=1;
ln_con=1; //关闭220v充电
delay_1ms(3);
dischar_con=0;//放电控制端停止
TMR1ON=0; //tmr0 run;
return;
}
else
{
return;
}
}
else
{
if(mode_flag==1) //表示已经发生过开关扳动
{
mode_flag=0;
ln_con=1; //关闭220v充电
delay_1ms(3);
dischar_con=0;//放电控制端停止
TMR1ON=0; //tmr0 run;
return;
}
else
{
return;
}
}
}
//==========================================
//-----------5次平均实际电流处理-------
void average_real_cur(void)
{ asm("nop");
if(average<10)
{
average=average+1;//五次平均累加
average_temp=(average_temp+long_temp);
return;
}
else
{
average=0;
real_ccur=real_dcur=(average_temp/10);
average_temp=0;
}
}
//--------------5次平均实际电流电压处理----
void average_real_vol(void)
{ asm("nop");
if(average<10)
{
average=average+1;//五次平均累加
average_temp=(average_temp+long_temp);
return;
}
else
{
average=0;
real_cvol=real_dvol=(average_temp/10);
average_temp=0;
}
}
//==========================================
void buzzer(void)
{
asm("nop");
beep=1;
delay_1ms(12);
beep=0;
}
//============================================
void led_display(void)
{
asm("nop");
asm("nop");
e_138=1;//enable 74hc138 select
temp=dispcode[ram4];
temp|=0x10;
to_74hc164(temp);
e_138=0;a_138=0;b_138=0;c_138=0;
delay_1ms(2); //延
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -