ye工,下面是主程序,中断函数里调用了一个时间显示程序,lcd_int里面,驱动程序驱动LCD显示当前时间,精确到0.1秒
//YT-BT1C05A-MAIN
//Programer:James he.(can can).
#include<pic.h> //头文件
#include<pic16f887.h> //PIC头文件
#include"define.h" //定义头文件
#include"function.h" //函数头文件
__CONFIG(INTIO&WDTDIS&PWRTEN&MCLRDIS&CP&CPD&BOREN&FCMEN&LVPDIS&DEBUGEN);//单片机配置位设置:8M,MCLR
__CONFIG(0xFDFF);
//*******************各函数声明,变量声明************//
unsigned int adres,delay_time,timer;
unsigned char intcon_t,temp;//中断备份,共用寄存器
unsigned char command,number,battery_n,ddram,key_r; //按键用,PWM分频用
//程序号,测试串数,
unsigned char pro=0, test_s=2; //按键用,PWM分频用
//程序号 0 1
unsigned char id[] ={ 15, 0}; //基准单位1uA
unsigned int Cx[] ={4150, 0}; //充电下限电压1mV
unsigned int Cs[] ={4250, 0}; //充电上限电压1mV
unsigned int Ct_x[] ={ 700, 0}; //充电下限延时1ms
unsigned int Ct_s[] ={1200, 0}; //充电上限延时1ms
unsigned int Crs[] ={4050, 0}; //充电恢复上限1mV
unsigned int Crx[] ={3950, 0}; //充电恢复下限1mV
unsigned char C_I[] ={ 20, 0}; //充电判断电流1ma
unsigned int Ds[] ={2800, 0}; //放电上限电压1mV
unsigned int Dx[] ={2700, 0}; //放电下限电压1mV
unsigned int Dt_x[] ={ 50, 0}; //放电下限延时1ms
unsigned int Dt_s[] ={ 500, 0}; //放电上限延时1ms
unsigned int Drx[] ={2950, 0}; //放电恢复下限1mV
unsigned int Drs[] ={3050, 0}; //放电恢复上限1mV
unsigned char D_I[] ={ 5, 0}; //充电判断电流1ma
unsigned int Df_t[] ={1000, 0}; //断开负载延时1ms
//**************中断服务程序************************//
void interrupt counter(void)
{ if(T0IF)
{ TMR0=9;
T0IF=0;
if(delay_time) delay_time--;
}
if(TMR1IF)
{ if(!lcd_s) timer_show(); //时间显示处理
else
{ TMR1IF=0;
TMR1H=0x3C;
TMR1L=0xB0;
timer++;
}
} //延时减1
if(!STA)
{ while(!STA); WDTCON=1;}
}
//==================主程序开始======================//
void main()
{ init();
while(1)
//==================程序开始检测按键================//
{ lcd_init(); //单片机初始化函数
lcd_clear_2line(); //清除第二行
lcd_write_char("PL replace part");
PORTA=0b00010000;
PORTB=0b01100000;
PORTC=0b0;
PORTD=0b0;
PORTE=0b1000;
key_r=0;
key_s=0;
cd_send(ch+dc,of); //充放电模拟关闭
all_voltage(b_all,b_of); //关闭电压输出
all_voltage(b_all,3600); //所有电压复位
key(); //检测按键。
sound(10); //声音提示
number=0; //序号显示清零
timer=0; //时间显示清零
lcd_write_curs(0x84); //光标定位
lcd_write_char("Timer: S"); //时间位标框
TMR1IF=0;
INTCON=0b11000000;
lcd_s=0;
//==================静态功耗========================//
if(1)
{ all_voltage(b_all,b_on); //打开电压输出
IDC=0; //取样电路打开
lcd_write_char_no("leakage"); //漏电测试显示
delay_ms(500); //延时200ms
ADCON0=0b10101101; //AD通道选择11
ad_test(); //AD测量子程序
if(adres<id[pro])
{enb=1;IDC=1;delay_ms(500);lcd_write_char_ok();}//测试结果处理
else enb=0;
}
//==================过充电测试======================//
if(enb)
{ SW3=1;
ch_s=1;
dc_s=0;
cd_send(ch,on+C_I[pro]); //充电模拟打开
delay_ms(50);
cd_send(ch,on+C_I[pro]); //充电模拟打开
delay_ms(50);
lcd_write_char_no("charge"); //充电下限显示
delay_ms(500);
sound(10);
ch_id(); //充电状态识别
sb_id_l(); //是否OK
lcd_write_char_no("LED test"); //充电下限显示
temp=0; //清空备用寄存器
ADCON0=0b10001101; //AD通道选择3
while(1) //LED检测
{ cd_send(ch,of+C_I[pro]);
delay_ms(500);
ad_test(); //AD测量子程序
if(adres>500) temp++;else temp=0; //大于3V
cd_send(ch,on+C_I[pro]);
delay_ms(500);
ad_test(); //AD测量子程序
if(adres<60) temp++;else temp=0; //小于300V
if(temp>3) break;
if(timer>100) WDTCON=1;
}
}
//------------------过充电测试----------------------//
for(battery_n=1;battery_n<=test_s;battery_n++)
{
//---------------
if(enb) //过充下限测试
{ lcd_write_char_cd("x"); //充电下限显示B1充电测试
all_voltage(battery_n,Cx[pro]); //充电下限测试
ok_ng(Ct_s[pro]); //充电下限延时测试
sb_id_l(); //是否OK
}
if(enb) //过充上限,下限延时测试
{ lcd_write_char_cd("sx"); //充电上限测试
all_voltage(battery_n,Cs[pro]); //充电上限电压发送
ok_ng(Ct_x[pro]); //充电下限延时测试
sb_id_l(); //是否OK
}
if(enb) //过充上限,上限延时测试
{ lcd_write_char_cd("ss"); //充电上限测试
ok_ng(Ct_s[pro]-Ct_x[pro]); //充电下限延时测试
sb_id_h(); //是否OK
}
if(enb) //过充电时只有绿灯是亮的
{ lcd_write_char_cd("L"); //充电led显示
ADCON0=0b10001101; //AD通道选择2
ad_test(); //过充电红灯灭
if(adres>500) enb=1;else enb=0; //大于2V
if(enb)
{ ADCON0=0b10000001; //AD通道选择0
ad_test(); //过充电黄灯灭
if(adres>500) enb=1;else enb=0; //大于2V
}
if(enb)
{ ADCON0=0b10001001; //AD通道选择1
ad_test(); //过充电绿灯亮
if(adres<260) enb=1;else enb=0; //小于1.3V
}
}
if(enb) //过充恢复上限
{ lcd_write_char_cd("rs"); //充电恢复上限测试
all_voltage(battery_n,Crs[pro]); //充电恢复上限电压发送
ng_ok(Ct_s[pro]); //充电恢复上限延时测试
sb_id_h(); //是否OK
}
if(enb) //过充恢复下限
{ lcd_write_char_cd("rx"); //充电恢复下限测试
all_voltage(battery_n,Crx[pro]); //充电恢复下限电压发送
ng_ok(Ct_s[pro]); //充电恢复下限延时测试
sb_id_l(); //是否OK.
}
}
if(enb)
{ lcd_write_char_no("Not DC in CH"); //充电恢复下限测试
cd_send(dc,on);
dc_id(); //放电状态识别
if(sb==1) enb=1; else enb=0; //是否OK
}
if(enb) {cd_send(ch,of); delay_ms(1000);} //充电模拟关闭
//==================过放电测试======================//
if(enb)
{ ch_s=0;
dc_s=1;
delay_ms(20);
cd_send(dc,on+D_I[pro]); //放电模拟打开
all_voltage(b_all,3600); //标准电压发送
lcd_write_char_no("dcharge"); //放电下限显示
delay_ms(500);
sound(10);
dc_id(); //放电状态识别
sb_id_l(); //是否OK
}
//------------------过放电测试----------------------//
for(battery_n=1;battery_n<=test_s;battery_n++)
{
//---------------
if(enb) //过放上限测试
{ cd_send(dc,on+D_I[pro]); //放电模拟打开
delay_ms(50); //延时50ms
cd_send(dc,on+D_I[pro]); //放电模拟打开
lcd_write_char_cd("s"); //放电上限显示
all_voltage(battery_n,Ds[pro]); //放电上限测试
ok_ng(Dt_s[pro]); //放电上限延时测试
sb_id_l(); //是否OK
}
if(enb) //这时黄灯是亮的
{ lcd_write_char_cd("L"); //放电LED测试
ADCON0=0b10000001; //AD通道选择0
ad_test(); //AD测量子程序
if(adres<60) enb=1;else enb=0; //大于3V
}
if(enb) //过放下限,下限延时测试,不能保护
{ lcd_write_char_cd("xx"); //放电下限测试
all_voltage(battery_n,Dx[pro]); //充电下限电压发送
ok_ng(Dt_x[pro]); //充电下限延时测试
sb_id_l(); //是否OK
}
if(enb) //过放下限,上限延时测试,要能保护
{ lcd_write_char_cd("xs"); //放电上限测试
ok_ng(Dt_s[pro]-Dt_x[pro]); //放电下限延时测试
sb_id_h(); //是否OK
}
if(enb) //这时黄灯是灭的
{ lcd_write_char_cd("Lc"); //放电LED测试
ADCON0=0b10000001; //AD通道选择0
ad_test(); //AD测量子程序
if(adres>500) enb=1;else enb=0; //大于3V
}
if(enb) //过放电状态,断开负载不恢复
{ lcd_write_char_cd("nr");
SW3=0; //负载断开
cd_send(dc,of+D_I[pro]); //放电模拟关闭
delay_ms(400); //延时200ms
SW3=1; //放电关闭
cd_send(dc,on+D_I[pro]); //放电模拟打开
delay_ms(50);
dc_id(); //放电状态识别
sb_id_h(); //高是OK
}
if(enb) //过放恢复上限,不恢复
{ lcd_write_char_cd("rs"); //放电恢复下限测试
all_voltage(battery_n,Drs[pro]); //放电恢复下限电压发送
delay_ms(Df_t[pro]); //固定延时等负载恢复
dc_id(); //放电状态识别
sb_id_h(); //高是OK
}
if(enb) //断开开关恢复
{ lcd_write_char_cd("NLr"); //放电恢复下限测试
SW3=0;
cd_send(dc,of+D_I[pro]); //放电模拟关闭
delay_ms(600);
SW3=1;
cd_send(dc,on+D_I[pro]); //放电模拟打开
delay_ms(100);
cd_send(dc,on+D_I[pro]); //放电模拟打开
delay_ms(500);
dc_id();
sb_id_l();
}
if(enb) cd_send(dc,of); //放电模拟关闭
}
//------------------黄灯低压指示------------------//
if(enb)
{ all_voltage(b_all,3600); //正常电压发送
delay_ms(1000); //延时1S
lcd_write_char_no("low vol"); //低压显示
all_voltage(b_all,3450); //低压显示上限电压发送
delay_ms(1000);
ADCON0=0b10000001; //AD通道选择0
ad_test(); //AD测量子程序
if(adres>500) enb=1;else enb=0; //大于3V,黄灯不能亮
if(enb)
{ all_voltage(b_all,3350); //低压显示下限电压发送
delay_ms(600);
ADCON0=0b10000001; //AD通道选择0
ad_test(); //AD测量子程序
if(adres<60) enb=1;else enb=0; //小于300mv,黄灯要亮
}
}
//==================测试结果========================//
INTCON=0b0; //测试计时停止
//------------------PASS----------------------------//
if(enb)
{ lcd_write_curs(0xcc); //光标定位
lcd_write_char("PASS"); //PASS
sound(200);
delay_ms(200);
sound(200);
key();
}
//------------------FAIL----------------------------//
if(!enb)
{ lcd_write_curs(0xcc); //光标定位
lcd_write_char("FAIL"); //FAIL
//JBC=1;
key();
JBC=0;
}
//==================主程序结束======================//
}
} |