#include "config.h"
sfr IE2 = 0xaf;
sfr AUXINTIF = 0xef;
#define ET3 0x20
#define T3IF 0x02
u8 dis_buf[100];
u8 state = 0;
bit EEP_Write_flag = 0;
bit EEP_Read_flag = 0;
void eeprom_write_fun();
void eeprom_read_power_on();
void Open_cir_fun();
bit open_short_cir_job = 0;
bit eep_w_job = 0;
bit eep_r_job = 0;
bit dis_job = 0;
void Timer0Init(void)
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x00; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0 = 1;
}
void Timer1Init(void) //01微秒@33.000MHz
{
TMOD |= 0x40; //外部计数模式
TL1 = 0xff;
TH1 = 0xff;
TR1 = 1; //启动定时器
ET1 = 1; //使能定时器中断
}
void Timer3Init(void) //10毫秒@33.1776MHz
{
T4T3M &= 0xFD; //定时器时钟12T模式
T3L = 0x00; //设置定时初始值
T3H = 0x94; //设置定时初始值
T4T3M |= 0x08; //定时器3开始计时
IE2 = ET3; //使能定时器中断
}
unsigned long WB_num = 0;
u16 DS_NUM = 0;
u16 WB_NUM_SAVE = 0;
u16 TH0_NUM_SAVE = 0;
u16 TL0_NUM_SAVE = 0;
u16 TH1_NUM_SAVE = 0;
u16 TL1_NUM_SAVE = 0;
u16 DS_NUM_SAVE = 0;
u16 JS_NUM = 0;
u16 JS_NUM_SAVE = 0;
float PL = 0;
float Freq = 0;
float DS = 0;
float JS = 0;
bit OK = 0;
float Freq_state_open[15]={0};
float Freq_save[15] = {0};
u8 Freq_index_save[15]={0};
float Most_MAX[15] = {0};
float Most_MIN[15] = {0};
float Freq_state_index_open = 0;
float _Ref = 0;
u8 Sub = 1;
bit Save_start = 1;
void TIME1() interrupt 3 //计数器
{
JS_NUM++;
}
void TIME0() interrupt 1
{
DS_NUM++;
if(DS_NUM>=331)//≈655.35ms
{
TR0 = 0;
TR1 = 0;
JS_NUM_SAVE = JS_NUM;
JS_NUM = 0;
TH0_NUM_SAVE = TH0;
TH0 = 0;
TL0_NUM_SAVE = TL0;
TL0 = 0;
TH1_NUM_SAVE = TH1;
TH1 = 0;
TL1_NUM_SAVE = TL1;
TL1 = 0;
DS_NUM_SAVE = DS_NUM;
DS_NUM = 0;
DS = 65535*DS_NUM_SAVE+TH0_NUM_SAVE*256+TL0_NUM_SAVE;
JS = 65535*JS_NUM_SAVE+TH1_NUM_SAVE*256+TL1_NUM_SAVE;
Freq = (JS*33177600/DS)/1.036892929292929;
Freq = Freq/1000;
TR0 = 1;
TR1 = 1;
}
}
bit Sub1_start_flag = 0;
bit Sub2_start_flag = 0;
bit Sub3_start_flag = 0;
bit bit_cls = 0;
bit Vocie_fun_flag = 0;
bit _1s_voice_time_flag = 0;
u16 _1s_voice_time = 0;
void TM3_Isr() interrupt 19
{
u8 i = 0;
static u8 key_value = 0;
static u8 _5ms_time = 0;
(_5ms_time>199)?(_5ms_time = 0):_5ms_time++;
if(_5ms_time%2==0)open_short_cir_job = 1;
if(_5ms_time%20==0)eep_w_job = 1;
if(_5ms_time%40==0)dis_job = 1;
if(_1s_voice_time_flag)
{
_1s_voice_time++;
}
// if(Sub==1)
// {
// if(_5ms_time%199==0)LCD_CLS();
// }
// if(Sub==2)
// {
// if(_5ms_time%199==0)Sub3_start_flag = 1;
// }
// if(Sub==3)
// {
// if(_5ms_time%199==0)Sub3_start_flag = 1;
// }
key_value = key_get();
switch(key_value)
{
case 1:
Sub=1;Sub1_start_flag = 1;_1s_voice_time_flag = 1;
break;
case 2:
Sub=2;Sub3_start_flag = 1;_1s_voice_time_flag = 1;
break;
case 3:
Sub=3;Sub3_start_flag = 1; _1s_voice_time_flag = 1;
break;
case 4:
Sub=4;
break;
case 5:
Freq_state_open[Freq_state_index_open] = Freq; //存频率
Freq_state_index_open++;
if(Freq_state_index_open==15)
{
Save_start = 1;
Freq_state_index_open = 0;
}
EEP_Write_flag = 1;
break;
case 14:
Vocie_fun_flag = 1;
break;
case 15:
Vocie_fun_flag = 0;
break;
case 16:
Sub=0;
break;
}
}
void Find_max_min()
{
static u8 a = 0xff;
static u8 index = 0;
static u8 step = 0;
static u8 index_1 = 0;
float temp = 0;
int i, j;
if(Save_start)
{
Save_start = 0;
_Ref = Freq_state_open[0];
for(i=0;i<15;i++)
{
Freq_save = _Ref/Freq_state_open;
}
for (i = 1; i < 15; i++)//外层循环是比较的轮数,数组内有10个数,那么就应该比较10-1=9轮
{
for (j = 0; j < 15 - i; j++)//内层循环比较的是当前一轮的比较次数,例如:第一轮比较9-1=8次,第二轮比较9-2=7次
{
if (Freq_save[j] > Freq_save[j + 1])//相邻两个数如果逆序,则交换位置
{
temp = Freq_save[j];
Freq_save[j] = Freq_save[j + 1];
Freq_save[j + 1] = temp;
}
}
}
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
if(a==j)continue;
if(Freq_save==(_Ref/Freq_state_open[j]))
{
// a = j;
Freq_index_save = j;
}
}
}
Most_MAX[Freq_index_save[0]] = (Freq_save[0]+Freq_save[1])/2;
Most_MIN[Freq_index_save[0]] = 0;
Most_MAX[Freq_index_save[14]] = 999999;
Most_MIN[Freq_index_save[14]] = (Freq_save[13]+Freq_save[14])/2;
for(i=1;i<14;i++)
{
Most_MAX[Freq_index_save] = (Freq_save+Freq_save[i+1])/2;
Most_MIN[Freq_index_save] = (Freq_save+Freq_save[i-1])/2;
}
}
}
void Juge_LC();
void check_d1()
{
static u8 D1_D2_Nomarl = 0;
P5M0 = 0xff; P5M1 = 0X00;
P7M0 = 0xff; P7M1 = 0X00;
D_CHECK_B = 0;//AB io 置0
D_CHECK_A = 0;
Relay_close();//关闭继电器
P5M0 = 0X00; P5M1 = 0X00;//切换IO模式
P7M0 = 0X00; P7M1 = 0XFF;
D_CHECK_A = 1;//P5
Delay_ms(10);
if(D_CHECK_B==1)//正常
{
D1_D2_Nomarl = 1;
// LCD_P8x16Str(0,2,"D1 ");
// LCD_P14x16Ch(32,2,24);//无
// LCD_P14x16Ch(48,2,20);//故
// LCD_P14x16Ch(64,2,21);//障
}
else
{
D1_D2_Nomarl = 0;
LCD_P8x16Str(0,2,"D2 ");//断路
LCD_P14x16Ch(48,2,28);//
LCD_P14x16Ch(64,2,27);//
Voice.diode = 16;
}
D_CHECK_A = 0;
D_CHECK_B = 0;
P5M0 = 0X00; P5M1 = 0Xff;
P7M0 = 0X00; P7M1 = 0X00;
D_CHECK_B = 1;//P7
Delay_ms(10);
if(D_CHECK_A==1)
{
if(D1_D2_Nomarl==1)
{
Voice.diode = 18;
LCD_P8x16Str(0,2,"D1 D2 ");
LCD_P14x16Ch(64,2,24);//无
LCD_P14x16Ch(80,2,20);//故
LCD_P14x16Ch(96,2,21);//障
}
}
else
{
if(D1_D2_Nomarl==0)
{
LCD_P8x16Str(0,2,"D1 D2 ");//断路
LCD_P14x16Ch(48,2,28);//
LCD_P14x16Ch(64,2,27);//
Voice.diode = 15;
}
else
{
LCD_P8x16Str(0,2,"D1 ");//断路
LCD_P14x16Ch(48,2,28);//
LCD_P14x16Ch(64,2,27);//
Voice.diode = 15;
}
}
D_CHECK_A = 0;
D_CHECK_B = 0;
}
void check_LC()
{
Relay_open();//继电器吸合
P5M0 = 0X00; P5M1 = 0X00;
P7M0 = 0X00; P7M1 = 0X00;
D_CHECK_B = 0;//AB io 置0
D_CHECK_A = 0;
Delay_ms(200);
Find_max_min();//找边界
Juge_LC();//判断LC
}
void Juge_LC()
{
if(NOW_FREQ<Most_MAX[0]&&NOW_FREQ>Most_MIN[0])
{
LCD_P14x16Ch(0,0,29);//电
LCD_P14x16Ch(16,0,30);//感
LCD_P14x16Ch(32,0,29);//电
LCD_P14x16Ch(48,0,32);//容
LCD_P14x16Ch(64,0,24);//无
LCD_P14x16Ch(80,0,20);//故
LCD_P14x16Ch(96,0,21);//障
Voice.LC = 17;
}
else if(NOW_FREQ<Most_MAX[1]&&NOW_FREQ>Most_MIN[1])
{
LCD_P8x16Str(0,0,"C1 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 1;
}
else if(NOW_FREQ<Most_MAX[2]&&NOW_FREQ>Most_MIN[2])
{
LCD_P8x16Str(0,0,"C2 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 2;
}
else if(NOW_FREQ<Most_MAX[3]&&NOW_FREQ>Most_MIN[3])
{
LCD_P8x16Str(0,0,"C3 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 3;
}
else if(NOW_FREQ<Most_MAX[4]&&NOW_FREQ>Most_MIN[4])
{
LCD_P8x16Str(0,0,"C4 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 4;
}
else if(NOW_FREQ<Most_MAX[5]&&NOW_FREQ>Most_MIN[5])
{
LCD_P8x16Str(0,0,"L1 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 5;
}
else if(NOW_FREQ<Most_MAX[6]&&NOW_FREQ>Most_MIN[6])
{
LCD_P8x16Str(0,0,"L2 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 6;
}
else if(NOW_FREQ<Most_MAX[7]&&NOW_FREQ>Most_MIN[7])
{
LCD_P8x16Str(0,0,"L3 ");
LCD_P14x16Ch(32,0,28);//开
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 7;
}
else if(NOW_FREQ<Most_MAX[8]&&NOW_FREQ>Most_MIN[8])
{
LCD_P8x16Str(0,0,"C1 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 8;
}
else if(NOW_FREQ<Most_MAX[9]&&NOW_FREQ>Most_MIN[9])
{
LCD_P8x16Str(0,0,"C2 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 9;
}
else if(NOW_FREQ<Most_MAX[10]&&NOW_FREQ>Most_MIN[10])
{
LCD_P8x16Str(0,0,"C3 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 10;
}
else if(NOW_FREQ<Most_MAX[11]&&NOW_FREQ>Most_MIN[11])
{
LCD_P8x16Str(0,0,"C4 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 11;
}
else if(NOW_FREQ<Most_MAX[12]&&NOW_FREQ>Most_MIN[12])
{
LCD_P8x16Str(0,0,"L1 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 12;
}
else if(NOW_FREQ<Most_MAX[13]&&NOW_FREQ>Most_MIN[13])
{
LCD_P8x16Str(0,0,"L2 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 13;
}
else if(NOW_FREQ<Most_MAX[14]&&NOW_FREQ>Most_MIN[14])
{
LCD_P8x16Str(0,0,"L3 ");
LCD_P14x16Ch(32,0,25);//短
LCD_P14x16Ch(48,0,27);//路
Voice.LC = 14;
}
}
void Sub_3()
{
if(Sub3_start_flag)
{
check_LC();//先测电容
check_d1();//再测电感
if(_1s_voice_time_flag==0)_1s_voice_time_flag = 1;
}
}
void Sub_1()
{
if(Sub1_start_flag)
{
check_LC();
if(_1s_voice_time_flag==0)_1s_voice_time_flag = 1;
}
}
void main()
{
u8 i = 0;
int j;
float T = 0;
sys_int();
Timer0Init();
Timer1Init();
Timer3Init();
UartInit();
LCD_Init();
LCD_CLS();
eeprom_read_power_on();
P_SW2 = 0x80;
XOSCCR = 0xc0; //启动外部晶振
while (!(XOSCCR & 1)); //等待时钟稳定
CLKDIV = 0x00; //时钟不分频
CLKSEL = 0x01; //选择外部晶振
P_SW2 = 0x00;
D_CHECK_A = 0;
D_CHECK_B = 0;
Relay_open();
EA = 1;
Usart_send("AF:31\r\n");
while(1)
{
if(open_short_cir_job)
{
if(Sub==1)Sub_1();
if(Sub==2)Sub_3();
if(Sub==3)Sub_3();
if(Vocie_fun_flag)
{
if(_1s_voice_time>=200)
{
Find_LC_voice();
_1s_voice_time = 0;
_1s_voice_time_flag = 0;
}
}
open_short_cir_job = 0;
}
if(eep_w_job)
{
eeprom_write_fun();
eep_w_job = 0;
}
if(dis_job)
{
dis_play();
dis_job = 0;
}
}
}
void eeprom_write_fun()
{
u8 i = 0;
unsigned long addr = 0x0000;
static u8 write_check = 1;
if(EEP_Write_flag)
{
EEP_Write_flag = 0;
write_check = 0;
EEPROM_Erase(0x0000);Delay_ms(1);
EEPROM_Write(0x0000,(u8*)&write_check,4);Delay_ms(1);
for(i=0;i<15;i++)
{
EEPROM_Write(addr,(u8*)&Most_MAX,4);Delay_ms(1);
addr+=4;
}
for(i=0;i<15;i++)
{
EEPROM_Write(addr,(u8*)&Most_MIN,4);Delay_ms(1);
addr+=4;
}
for(i=0;i<15;i++)
{
EEPROM_Write(addr,(u8*)&Freq_state_open,4);Delay_ms(1);
addr+=4;
}
}
}
void eeprom_read_power_on()
{
u8 i = 0;
long addr = 0x0000;
static u8 read_check = 0;
if(EEP_Read_flag==0)
{
EEP_Read_flag = 1;
EEPROM_Read(0x0000,(u8*)&read_check,4);Delay_ms(1);
if(read_check==0)
{
for(i=0;i<15;i++)
{
EEPROM_Read(addr,(u8*)&Most_MAX,4);Delay_ms(1);
addr+=4;
}
for(i=0;i<15;i++)
{
EEPROM_Read(addr,(u8*)&Most_MIN,4);Delay_ms(1);
addr+=4;
}
for(i=0;i<15;i++)
{
EEPROM_Read(addr,(u8*)&Freq_state_open,4);Delay_ms(1);
addr+=4;
}
}
}
}