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

📄 common.c

📁 基于单片机的多费率电能表源程序
💻 C
字号:
#define COMMON_GLOBALS
#include "includes.h"

void DelayXms(INT16U time)
{
	unsigned char j,k;
	unsigned int i;
	for(i=0;i<time;i++)
	for(j=0;j<0x0e;j++)
	for(k=0;k<0x3a;k++);
	
}
void DelayXus(INT16U time)//延时
{
	INT16U i;
	for(i=0;i<time;i++);
}
INT8U AddCRC(INT8U *pnt,INT8U length)	//产生校验和
{
	INT8U crc=0;
	while(length--)
	{
		crc+=*pnt;
		pnt++;
	}	
	return crc;
}
INT8U CalculateXOR(INT8U *Pnt,INT8U Length)
{
	INT8U i,XOR;
	XOR=0;
	for(i=0;i<Length;i++)
	{
		XOR^=*Pnt;
		Pnt++;
	}
	return XOR;
}
INT8U CheckBCD(INT8U *Pnt,INT8U Lenth)
{
	INT8U i;
	for(i=0;i<Lenth;i++)
	{
		if(((*Pnt&0x0f)>0x09)||((*Pnt&0xf0)>0x90))
			return 0;
		
		Pnt++;
	}
	return 1;

}
void BcdToDigital(INT8U *Pnt1,INT8U *Pnt2,INT8U Length,INT8U Direction)
{
	INT8U i;
	if(Direction>0)
	{
		Pnt1=Pnt1+Length-1;
		for(i=0;i<Length;i++)
		{
			*Pnt2=*Pnt1&0x0f;
			Pnt2++;
			*Pnt2=*Pnt1>>4;
			Pnt2++;
			Pnt1--;
		}
	}
	else
	{
		for(i=0;i<Length;i++)
		{
			*Pnt2=*Pnt1&0x0f;
			Pnt2++;
			*Pnt2=*Pnt1>>4;
			Pnt2++;
			Pnt1++;
		}	
	}	
}
/*void DigitalToBcd(INT8U *Pnt1,INT8U *Pnt2,INT8U Cnt)
{
	INT8U i;
	for(i=0;i<Cnt;i++)
	{
		*Pnt2=*Pnt1&0x0f;
		Pnt1++;
		*Pnt2+=(*Pnt1<<4);
		Pnt1++;
		Pnt2++;	
	}	
}*/

/*INT8U IncBcd(INT8U *pnt,INT8U length)	
{
	INT8U i;
	INT8U sign;		
	for(i=0;i<length;i++)
	{
		*pnt=*pnt+1;
		if((*pnt&0x0f)>0x09)
			*pnt+=6;
		if((*pnt&0xf0)>0x90)
		{		
			*pnt+=0x60;
			sign=1;
			pnt++;
		}		
		else
		{
			sign=0;
			break;	
		}			
	}
	return sign;	
}*/
INT8U IncBcd(INT8U *Pnt,INT8U Length)	
{
	INT8U i;
	INT8U Sign=0;		
	for(i=0;i<Length;i++)
	{
		*Pnt=*Pnt+1;
		if((*Pnt&0x0f)>0x09)
		{
			*Pnt+=6;
			Sign++;
		}
		else
			return Sign;		
		if((*Pnt&0xf0)>0x90)
		{		
			*Pnt+=0x60;
			Sign++;
			Pnt++;
		}		
		else
			return Sign;			
	}
	return Sign;	
}
/*void INT32ToBcd(INT32U Data,INT8U *Pnt)
{
	Pnt+=3;
	*Pnt=Data/10000000L;
	*Pnt<<=4;
	Data=Data%10000000L;
	*Pnt+=Data/1000000L;
	Pnt--;
	Data=Data%1000000L;	
	*Pnt=Data/100000L;
	*Pnt<<=4;
	Data=Data%100000L;	
	*Pnt+=Data/10000L;
	Pnt--;
	Data=Data%10000L;	
	*Pnt=Data/1000L;
	*Pnt<<=4;
	Data=Data%1000L;	
	*Pnt+=Data/100L;
	Pnt--;
	Data=Data%100L;
	*Pnt=Data/10L;
	*Pnt<<=4;
	*Pnt+=Data%10L;	
}
INT32U BcdToINT32(INT8U *Pnt)
{	
	INT32U TempData;
	TempData=0;
	TempData+=*Pnt&0x0f;
	TempData+=(*Pnt>>4)*10;
	Pnt++;
	TempData+=(*Pnt&0x0f)*100;
	TempData+=(*Pnt>>4)*1000;
	Pnt++;
	TempData+=(*Pnt&0x0f)*10000;
	TempData+=(*Pnt>>4)*100000;
	Pnt++;
	TempData+=(*Pnt&0x0f)*1000000;
	TempData+=(*Pnt>>4)*10000000;
	return TempData;
}*/
/*本程序能输出2000.1.1~2099.12.31年之间的日期所对应的星期数*/
INT8U GetWeekDay(INT8U Month,INT8U Day, INT8U Year)
{
	INT16U DayNumber;
	INT8U Temp;
	Year=(Year>>4)*10+(Year&0x0f);
	Month=(Month>>4)*10+(Month&0x0f);
	Day=(Day>>4)*10+(Day&0x0f);
	if(Year)
	{
		DayNumber=365*(INT16U)Year;
		Temp=Year-1;
		Temp>>=2;
		DayNumber+=Temp+1;
	}
	else
		DayNumber=0;
	if(Year%4==0)
	{
		switch(Month)
		{
			case 1:
				break;
			case 2:
				DayNumber+=31;
				break;
			case 3:
				DayNumber+=60;
				break;
			case 4:
				DayNumber+=91;
				break;
			case 5:
				DayNumber+=121;
				break;
			case 6:
				DayNumber+=152;
				break;
			case 7:
				DayNumber+=182 ;
				break;
			case 8:
				DayNumber+=213;
				break;
			case 9:
				DayNumber+=244;
				break;
			case 10:
				DayNumber+=274;
				break;
			case 11:
				DayNumber+=305;
				break;
			case 12:
				DayNumber+=335;
				break;
			default :
				break;
		}
	}
	else
	{
		switch(Month)
		{
			case 1:
				break;
			case 2:
				DayNumber+=31;
				break;
			case 3:
				DayNumber+=59;
				break;
			case 4:
				DayNumber+=90;
				break;
			case 5:
				DayNumber+=120;
				break;
			case 6:
				DayNumber+=151;
				break;
			case 7:
				DayNumber+=181 ;
				break;
			case 8:
				DayNumber+=212;
				break;
			case 9:
				DayNumber+=243;
				break;
			case 10:
				DayNumber+=273;
				break;
			case 11:
				DayNumber+=304;
				break;
			case 12:
				DayNumber+=334;
				break;
			default :
				break;
		}
	}
	DayNumber+=Day;
	DayNumber+=5;
	DayNumber%=7;
	return DayNumber;
}
/*本程序能输出2000.1.1~2099.12.31年之间的任意日期离2000.1.1的天数*/
INT16U CalDayNumOfDate(INT8U Month,INT8U Day, INT8U Year)
{
	INT16U DayNumber;
	INT8U Temp;
	Year=(Year>>4)*10+(Year&0x0f);
	Month=(Month>>4)*10+(Month&0x0f);
	Day=(Day>>4)*10+(Day&0x0f);
	if(Year)
	{
		DayNumber=365*(INT16U)Year;
		Temp=Year-1;
		Temp>>=2;
		DayNumber+=Temp+1;
	}
	else
		DayNumber=0;
	if(Year%4==0)
	{
		switch(Month)
		{
			case 1:
				break;
			case 2:
				DayNumber+=31;
				break;
			case 3:
				DayNumber+=60;
				break;
			case 4:
				DayNumber+=91;
				break;
			case 5:
				DayNumber+=121;
				break;
			case 6:
				DayNumber+=152;
				break;
			case 7:
				DayNumber+=182 ;
				break;
			case 8:
				DayNumber+=213;
				break;
			case 9:
				DayNumber+=244;
				break;
			case 10:
				DayNumber+=274;
				break;
			case 11:
				DayNumber+=305;
				break;
			case 12:
				DayNumber+=335;
				break;
			default :
				break;
		}
	}
	else
	{
		switch(Month)
		{
			case 1:
				break;
			case 2:
				DayNumber+=31;
				break;
			case 3:
				DayNumber+=59;
				break;
			case 4:
				DayNumber+=90;
				break;
			case 5:
				DayNumber+=120;
				break;
			case 6:
				DayNumber+=151;
				break;
			case 7:
				DayNumber+=181 ;
				break;
			case 8:
				DayNumber+=212;
				break;
			case 9:
				DayNumber+=243;
				break;
			case 10:
				DayNumber+=273;
				break;
			case 11:
				DayNumber+=304;
				break;
			case 12:
				DayNumber+=334;
				break;
			default :
				break;
		}
	}
	DayNumber+=Day;	
	return DayNumber;
}
INT8U BcdAdd(INT8U *AddendPnt,INT8U *AugendPnt,INT8U *SumPnt,INT8U Length)
{
	INT8U i;
	INT8U Sign=0;
	INT8U TempVar;
	for(i=0;i<Length;i++)
	{
		//处理低位
		*SumPnt=Sign;
		*SumPnt+=(*AddendPnt&0x0f);	
		*SumPnt+=(*AugendPnt&0x0f);
		if(*SumPnt>0x09)
		{
			*SumPnt+=0x06;
			*SumPnt&=0x0f;			
			TempVar=1;
		}
		else
			TempVar=0;
		//处理高位
		TempVar+=(*AddendPnt>>4);
		TempVar+=(*AugendPnt>>4);
		if(TempVar>0x09)
		{
			TempVar+=0x06;
			Sign=1;
		}
		else
			Sign=0;	
		*SumPnt+=(TempVar<<4);
		SumPnt++;
		AddendPnt++;
		AugendPnt++;	
	}
	return Sign;
}
INT8U CheckDate(INT8U *Pnt)//年月日
{
	if(!CheckBCD(Pnt,3))
		return 0;	
	if(*Pnt>0x31)
		return 0;
	Pnt++;
	if(*Pnt>0x12)
		return 0;
	Pnt++;
	if(*Pnt>0x30)
		return 0;
	return 1;
}
INT8U CheckTime(INT8U *Pnt)//时分秒
{
	if(!CheckBCD(Pnt,3))
		return 0;
	if(*Pnt>0x59)
		return 0;
	Pnt++;
	if(*Pnt>0x59)
		return 0;
	Pnt++;
	if(*Pnt>0x23)
		return 0;
	return 1;
}

⌨️ 快捷键说明

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