基于单片机的电压电流表设计

dc84e22edd6b449a956cb4af84347f42.png

e9914c2d589243abb597145860a487bb.png

#include "stc15.h"
#include "delay.h"
#include "timer.h"
#include "TM7707.h"
#include "LCD1602.h"
#include "eeprom.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"

#if (defined USE_TM7707)
#define TM_ADC_TO_VOLGATE	1.49056e-4 //
#define TM_ADC_TO_CURRENT	2.98023e-4
#elif (defined USE_TM7705)
#define TM_ADC_TO_VOLGATE	3.81469e-2
#define TM_ADC_TO_CURRENT	3.81469e-2
#endif
#define TM_VOLGATE_RATIO	25
#define TM_REAL_VOLGATE		(TM_ADC_TO_VOLGATE*TM_VOLGATE_RATIO)
#define TM_REAL_CURRENT		(TM_ADC_TO_CURRENT)


static void System_Config(void);
static void ChoiceMode(void);
static unsigned char KeyScan(void);


unsigned char code releaseKey[15] = "Release key    ";
unsigned char code input0A[15] = "Input 0.000A   ";
unsigned char code input5V[15] = "Input 5.000V   ";
unsigned char code input3A[15] = "Input 3.000A   ";
unsigned char code calibFinish[15] = "Finish         ";
unsigned char code V_UP[2] = "V+";
unsigned char code V_DOWN[2] = "V-";
unsigned char code I_UP[2] = "A+";
unsigned char code I_DOWN[2] = "A-";

xdata float v_ratio=1.0f;
xdata float i_ratio=1.0f;
xdata long volgate=0;
xdata long current=0, i_offset=0;
xdata long power=0;
xdata long ohm=0;
xdata long AH=0;
xdata unsigned int timer_cnt=0;
xdata unsigned char dis_cnt=0;
xdata unsigned char sec=0;
xdata unsigned char min=0;
xdata unsigned char hour=0;
unsigned long sec_sum=0;
float ah_sec=0;
float ah_sum=0;
xdata unsigned char mode_flag=1;

xdata long mTemp=0;

bit isDisFlag=1;
bit isDisAhStop=1;
bit isUpdataAH = 0;

/***************************************************
 *
 *
 *
 */
void main(void)
{
	unsigned char keyCode=0;
	
	System_Config();
	LCD1602_Config();
	Timer_Config();
	TM770x_Config();
	EA = 1;
	ChoiceMode();
	EA = 0;
	mode_flag = IapReadByte(EEPROM_MODE_ADDR);
	IapReadData(EEPROM_V_RATIO_ADDR, (long*)&volgate);
	IapReadData(EEPROM_I_RATIO_ADDR, (long*)&current);
	IapReadData(EEPROM_I_ZERO_ADDR, (long*)&i_offset);
	EA = 1;
	v_ratio = volgate*1e-5;
	i_ratio = current*1e-5;
	if(mode_flag!=2 && mode_flag!=1)
	{
		mode_flag = 1;
		IapSaveData(EEPROM_MODE_ADDR, (unsigned char*)&mode_flag, 1);
	}
	
	volgate = 0;
	current = 0;
	AH = 0;

	LCD1602_Write(LCD_WR_CMD, 0x01);
	delay_ms(10);
	
//	volgate = 123456;
//	DisplayNumber(0,0, volgate, 0xFF);
//	DisplayTimer(hour,min,sec);
//	while(1);
//	mode_flag = 1;
	
	for(;;)
	{
		keyCode = KeyScan();
		if(keyCode==0)
		{
			if(mode_flag==2)
			{
				hour = 0;
				min = 0;
				sec = 0;
				AH = 0;
				ah_sum = 0;
				sec_sum = 0;
				isDisAhStop = 1;
			}
		}
		else if(keyCode!=0xFF)
		{
			if(mode_flag==2)
			{
				isDisAhStop = ~isDisAhStop;
			}
		}
		
		if(isDisFlag)
		{
			isDisFlag = 0;
			if(P36 && (mode_flag==1))
			{
				DisplayNumber(0,0, volgate, DIS_V);
				DisplayNumber(0,1, power, 	DIS_W);
				DisplayNumber(9,0, current, DIS_A);
				DisplayNumber(9,1, ohm, 	DIS_R);
			}
			else if(mode_flag==2)
			{
				if(isDisAhStop==0 && isUpdataAH)
				{
					isUpdataAH = 0;
					ah_sec = 2.77778e-4*current;
					ah_sum += ah_sec;
				}
				AH = (long)ah_sum;
				DisplayNumber(0,0, volgate, DIS_V);
				DisplayNumber(0,1, current, DIS_A);
				DisplayNumber(8, 0, AH, DIS_AH);
				DisplayTimer(hour,min,sec);
			}
			
			GetVolgate();
			mTemp = (long)(raw_adcV*TM_REAL_VOLGATE*v_ratio);
			if(mTemp>=20000)
			{
				volgate =  (long)(0.9976f*mTemp + 40);
			}
			else
			{
				volgate = mTemp;
			}
			GetCurrent();
//			current = (long)((raw_adcI*TM_REAL_CURRENT-i_offset)*i_ratio-i_offset);
			if(raw_adcI>=i_offset)
			{ current = (long)((raw_adcI-i_offset)*TM_REAL_CURRENT*i_ratio); }
			else { current = 0; }
			
			if(volgate<0) { volgate = 0; }

 

c3cdaa4f50874d0ca92d920656689f8c.png

ade6d82737d14d5c8ff13c61b51a12c5.png

资料借鉴于此纷传

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值