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

📄 main.c

📁 AVR单片机RS232通信接口应用设计
💻 C
字号:
//***************************************************************
// File Name : main.c
// Author    : Steaven
// Created   : 2008-07-26
// Modified  : 
// Revision  : V0.0
//***************************************************************

#include "includes.h"

//constant definition
#define cLineRatio 9333

//global variables definition
INT8U  bLine_Event       	= 0; //Line Calculation Event
INT8U  bLineCnt          	= 0; //Line Sampling Count
INT8U  bLineCntTemp      	= 0; //Line Sampling Count(temporary)
INT16S wLineVoltSample   	= 0; //Line Sampling Value
INT16S wLineVoltReal        = 0; //Line Instant Value
INT16S wLineVoltRMS         = 0; //Line RMS Value
INT16U wLinePeriod          = 0; //Line Period
INT16U wLinePeriodTemp      = 0; //Line Period(temporary)
INT16U wLineCaptureTime     = 0; //Line Capature Time
INT16U wLineCaptureTimeLast = 0; //Line Last Capature Time
INT32U dwLineVoltSum        = 0; //Line S-I Accumulation
INT32U dwLineVoltSumTemp    = 0; //Line S-I Accumulation(temporary)

//local function declaration
INT16U swRoot(INT32U dwNumber);

void main(void) 
{ 
	Hardware_Init();
	Init_UART();
	while(1)
	{
		if(bLine_Event == 1)
		{
			bLine_Event = 0;
			if(bLineCnt != 0)
			{
				wLineVoltRMS = swRoot(dwLineVoltSum/bLineCnt);
			}
		}
	}
} 

//***************************************************************
// Function    : wTimeCountr0_Interrupt                                
// Input       : none                                            
// Output      : none                                            
// Description : ATmega16 T/C0 ISR                               
//***************************************************************
#pragma interrupt_handler TimeCountr0_Interrupt:20                    
void TimeCountr0_Interrupt(void)                                      
{                                                                                                 
	INT16U temp1,temp2;
	
	//Clear wTimeCountr0 OCIF Flag                                     
	TIFR  |= 0x02;                                               
	TCNT0  = 0x00; 
	                                             
	//Read ADC Conversion
	temp1 = (INT16U)ADCL;
	temp2 = (INT16U)ADCH;
	wLineVoltSample = (temp2 << 8) | temp1;
	wLineVoltReal = (INT16S)(((INT32S)(wLineVoltSample - 512) * cLineRatio) >> 10); 
	if(wLineVoltReal < 0)
	{
		wLineVoltReal = -wLineVoltReal;
	}
	dwLineVoltSumTemp += (INT32S)wLineVoltReal * (INT32S)wLineVoltReal;
	bLineCntTemp++;
	/*
	if(bLineCntTemp >= 40)
	{
		dwLineVoltSum = dwLineVoltSumTemp;
		dwLineVoltSumTemp = 0;
		bLineCnt = bLineCntTemp;
		bLineCntTemp = 0;
		bLine_Event = 1;
	}
	*/
} 

//***************************************************************
// Function    : Timer1Capture_Interrupt                                
// Input       : none                                            
// Output      : none                                            
// Description : ATmega16 T/C1-Capature ISR                               
//***************************************************************
#pragma interrupt_handler Timer1Capture_Interrupt:6
void Timer1Capture_Interrupt(void)
{
	INT16U temp1,temp2;

	//Clear Interrupt Flag
	TIFR |= 0x20;
	//Calculate Line Period
	wLineCaptureTimeLast = wLineCaptureTime;
	wLineCaptureTime = ICR1;
	wLinePeriodTemp = wLineCaptureTime - wLineCaptureTimeLast;
	if((wLinePeriodTemp >= 14285) && (wLinePeriodTemp <= 25000))
	{
		wLinePeriod = wLinePeriodTemp;
	}
	//Acquire Line Volt Accumulation
	dwLineVoltSum = dwLineVoltSumTemp;
	dwLineVoltSumTemp = 0;
	bLineCnt = bLineCntTemp;
	bLineCntTemp = 0;
	bLine_Event = 1;
}

//***************************************************************
// Function    : swRoot                                
// Input       : dwNumber                                            
// Output      : Square Root of input                                            
// Description : Square Root Calculate                               
//***************************************************************
INT16U swRoot(INT32U dwNumber)
{
	INT8U ii;
    INT32U dwSquareRoot;
    
    if(dwNumber == 0)
    {
    	return (0);
    }
    if(dwNumber <= 4194304)
    {
    	dwSquareRoot = dwNumber / 1024 + 63;
    }
    else if(dwNumber <= 134217728)
    {
    	dwSquareRoot = dwNumber / 4096 + 255;
    }
    else
    {
    	dwSquareRoot = dwNumber / 16384 + 1023;
    }
    for (ii = 0;ii < 5;ii++)
	{
		dwSquareRoot = (dwSquareRoot + dwNumber / dwSquareRoot) / 2;
	}
    return((INT16U)dwSquareRoot);
}

//=========================END OF FILE=========================//
                    
                                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -