📄 measure_capacity.c
字号:
/******************************************************************
本程序只供学习使用,未经作者许可,不得用于其它任何用途
我的邮箱:computer-lov@tom.com
欢迎访问我的blog: http://computer00.21ic.org
measure_capacity.c文件 电容测量
Created by Computer-lov
Date: 2004.11.12
Edit date:2006.3.2
Version V1.1
Copyright(C) Computer-lov 2004-2014
All rigths reserved
*******************************************************************/
#include "hardware.h"
#include "measure_capacity.h"
#include "main.h"
#include "LCD1602.H"
#include "system_initial.h"
#include "isr.h"
unsigned char capacity_scope=0,capacity_measure_end=0;
void Start_measure(void)
{
unsigned char i;
scope_select=SCOPE_STOP;
delayXms(10);
switch(capacity_scope)
{
case 1: i=SCOPE_1;break;
case 2: i=SCOPE_2;break;
case 3: i=SCOPE_3;break;
case 4: i=SCOPE_4;break;
case 5: i=SCOPE_5;break;
default :capacity_scope=1;break;
}
capacity_measure_end=0;
TVH0=0;
TH0=0;
TL0=0;
scope_select=i; //开始测量
TR0=1;
}
unsigned char Wait_for_end(void)
{
if(key)
{
if(key==KEY_MENU){scope_select=SCOPE_STOP;TR0=0;status=MAIN_MENU;Write_a_EEPROM_data(EEPROM_Addr,0x01,status);key=0;return 1;}
if(settings_value.mode==MANUAL_MODE)
{
if(key==KEY_ENTER)Write_a_EEPROM_data(EEPROM_Addr,0x03,capacity_scope);
if(key==KEY_UP){scope_select=SCOPE_STOP;TR0=0;if(capacity_scope<5){capacity_scope++;}key=0;return 2;}
if(key==KEY_DOWN){scope_select=SCOPE_STOP;TR0=0;if(capacity_scope>1){capacity_scope--;}key=0;return 3;}
}
key=0;
}
while(!capacity_measure_end)
{
if(key)
{
if(key==KEY_MENU){scope_select=SCOPE_STOP;TR0=0;status=MAIN_MENU;Write_a_EEPROM_data(EEPROM_Addr,0x01,status);key=0;return 1;}
if(settings_value.mode==MANUAL_MODE)
{
if(key==KEY_ENTER)Write_a_EEPROM_data(EEPROM_Addr,0x03,capacity_scope);
if(key==KEY_UP){scope_select=SCOPE_STOP;TR0=0;if(capacity_scope<5)capacity_scope++;key=0;return 2;}
if(key==KEY_DOWN){scope_select=SCOPE_STOP;TR0=0;if(capacity_scope>1)capacity_scope--;key=0;return 3;}
}
key=0;
}
if(TVH0>31)
{
scope_select=SCOPE_STOP;
TR0=0;
if((capacity_scope>=5)||(settings_value.mode==MANUAL_MODE))
{
LCD_set_position(40);
LCD_prints(" Overflow! ");
delayXms(500);
return 4;
}
else
{
capacity_scope=5;
return 5;
}
}
}
scope_select=SCOPE_STOP; //停止
return 0;
}
unsigned char Calculation()
{
unsigned char i;
unsigned char buffer_temp[6];
((unsigned char *)&result)[0]=0;
((unsigned char *)&result)[1]=TVH0;
((unsigned char *)&result)[2]=TH0;
((unsigned char *)&result)[3]=TL0;
switch(capacity_scope)
{
case 1:
{
if(result>=settings_value.zero_offset[0])result=result-settings_value.zero_offset[0];
else {result=result+2-settings_value.zero_offset[0];}
result=(result+1)/2;
if(result>=35000){result*=1.7;break;}
if((result>=22000)&&(result<35000)){result*=1.55;break;}
if((result>=13000)&&(result<22000)){result*=1.4;break;}
if((result>=12000)&&(result<13000)){result*=1.475;break;}
if((result>=11000)&&(result<12000)){result*=1.370;break;}
if((result>=10000)&&(result<11000)){result*=1.275;break;}
if((result>=8000)&&(result<9000)){result*=1.195;break;}
if((result>=7500)&&(result<8000)){result*=1.135;break;}
if((result>=7000)&&(result<7500)){result*=1.10;break;}
if((result>=6000)&&(result<7000)){result*=1.08;break;}
if((result>=4000)&&(result<6000)){result*=1.065;break;}
if((result>=2000)&&(result<4000)){result*=1.058;break;}
if((result>=1000)&&(result<2000)){result*=1.05;break;}
if((result>=800)&&(result<1000)){result*=1.043;break;} //修正,不同的电路板,可能要不同的值
if(result<800)break;
}
case 2: if(result>=settings_value.zero_offset[1])result=result-settings_value.zero_offset[1];
else result=result+1-settings_value.zero_offset[1];
result=(result+1)/2;
break;
case 3: result=result-settings_value.zero_offset[2];result=(result+1)/2;break;
case 4: result=result-settings_value.zero_offset[3];result=(result+1)/2;break;
case 5: result=result-settings_value.zero_offset[4];result=(result+1)/2;break;
default: result=0;break;
}
if(result&0xC0000000)
{
LCD_cls();
LCD_prints("Zero point error");
LCD_set_position(40);
LCD_prints("Please re_adjust");
delayXms(500);
// while(!key);
return 0xff;
}
if(result>999999)
{
if((capacity_scope==5)||(settings_value.mode==MANUAL_MODE))
{
LCD_set_position(40);
LCD_prints(" Overflow! ");
delayXms(500);
return 1;
}
}
if(settings_value.mode==AUTO_MODE)
{
if((result>1500)&&(capacity_scope<5)){capacity_scope++;return 2;}
if((result<100)&&(capacity_scope>1)){capacity_scope--;return 2;}
}
for(i=6;i>0;i--)
{
buffer_temp[i-1]=(result%10)+'0';
result/=10;
}
buffer[0]=' ';
buffer[1]=' ';
buffer[2]=' ';
switch(capacity_scope)
{
case 1: buffer[3]=' ';for(i=4;i<10;i++)buffer[i]=buffer_temp[i-4];buffer[10]='p';break;
case 2: for(i=3;i<7;i++)buffer[i]=buffer_temp[i-3];buffer[7]='.';buffer[8]=buffer_temp[4];buffer[9]=buffer_temp[5];buffer[10]='n';break;
case 3: for(i=3;i<8;i++)buffer[i]=buffer_temp[i-3];buffer[8]='.';buffer[9]=buffer_temp[5];buffer[10]='n';break;
case 4: for(i=3;i<6;i++)buffer[i]=buffer_temp[i-3];buffer[6]='.';for(i=7;i<10;i++)buffer[i]=buffer_temp[i-4];buffer[10]='u';break;
case 5: for(i=3;i<7;i++)buffer[i]=buffer_temp[i-3];buffer[7]='.';buffer[8]=buffer_temp[4];buffer[9]=buffer_temp[5];buffer[10]='u';break;
}
buffer[11]='F';
buffer[12]=' ';
buffer[13]=' ';
buffer[14]=' ';
buffer[15]=' ';
buffer[16]=0x00;
return 0;
}
code unsigned char TEXT_CAPACITY[]={"CAPACITY:"};
void Display_capacity(void)
{
LCD_cls();
LCD_prints(TEXT_CAPACITY);
LCD_set_position(40);
LCD_prints(buffer);
delayXms(500);
}
void Measure_capacity(void)
{
LCD_cls();
LCD_prints(TEXT_CAPACITY);
LCD_set_position(40);
// LCD_prints(" 0000.00uF ");
TMOD=0x11;
while(status==MEASURE_CAPACITY)
{
Start_measure();
if(Wait_for_end())continue;
if(Calculation())continue;
Display_capacity();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -