⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 measure_capacity.c

📁 基于51的单片机设计的电容计的完整源代码
💻 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 + -