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

📄 7022b.c

📁 7022b 操作代码
💻 C
字号:
	#include <avr/io.h>
	#include <avr/iom128.h>
	#include <avr/delay.h>
	#include <7022b.h>
		
//	#define uchar unsigned char
//	#define uint  unsigned int
//	#define ulong unsigned long
	
	#define  CS_0 		 PORTB&=~_BV(PB0)
	#define  CS_1		 PORTB|=_BV(PB0)
	#define  SCLK_0 	 PORTB&=~_BV(PB1)
	#define  SCLK_1		 PORTB|=_BV(PB1)
	#define  DIN_0 		 PORTB&=~_BV(PB2)
	#define  DIN_1		 PORTB|=_BV(PB2) 
//	#define  DOUT_0 	 PORTB&=~_BV(PB3) 
//	#define  DOUT_1		 PORTB|=_BV(PB3) 

char buffer[150]={};
char ave_buffer[150]={};

void jisuan(char num);

int		Power_signal(long P_data)                    	//单项功率计算
	{	return((int)(P_data>>8));	}
long	Power_more(long P_data)                    	//多项功率计算
	{	return(P_data>>6);	}
int		effec_VI(long VI_data)                       	//电压电流有效值计算
	{	return((int)(VI_data>>13));}
char	Power_factor(long PF_data)                  	//功率因数计算
	{	return((char)(PF_data>>23));}
int		wire_freq(long WF_data)                       	//线频率计算
	{	return((int)(WF_data>>13));}
char	Tem_T(long T_data)                            	//温度计算
	{	return((char)(T_data&0x0000ff));}
char	P_D(long D_data) 								//功率方向,Bit0-3对应有功功率方向,
	{	return((char)(D_data&0x0000ff));}			//Bit4-7对应无功功率方向,0表示正,1表示负 
char	Phase_V(long PV_data)                         	//电压相序,1为次箜,0为正确
	{	if((PV_data>>3)&0x000001)	return(0x0f);     	//错误
		else						return(0x00); }   	//正确
char	Phase_I(long PI_data)                           //电流相序,1为错,0为正确
	{	if((PI_data>>4)&0x000001)	return(0xf0);     	//错误
		else						return(0x00); }   	//正确 




long	ReadSpi(char Com1)    	//SPI读操作
	{   char Y_N0,n1,m1;
		long Data1;
		CS_1;
		SCLK_0;
		CS_0;
		for(n1=8;n1>0;n1--)
		{
			SCLK_1;
			Y_N0=Com1&0x01;
			Com1=Com1>>1;
			if(Y_N0)	
				DIN_1;
			else   			    
				DIN_0;
			SCLK_0;
		}
		_delay_us(3);
		
		for(m1=24,Data1=0;m1>0;m1--)
		{
			SCLK_1;
			if(PORTB&0X08)
				Data1=Data1|0x800000;
			else
				Data1=Data1&0x7fffff;
			Data1=Data1>>1;
			SCLK_0;		
		}
		CS_1;
		return(Data1);
	}
	
void	WriteSpi(char Com2,long Data2)  //SPI写操作
	{	char Y_N1,n2,m2;
		long Y_N2;
		CS_1;
		SCLK_0;
		CS_0;
		for(n2=8;n2>0;n2--)
		{
			SCLK_1;
			Y_N1=Com2&0x01;
			Com2=Com2>>1;
			if(Y_N1)	
				DIN_1;
			else   			    
				DIN_0;
			SCLK_0;
		}
		for(m2=24;m2>0;m2--)
		{
			SCLK_1;
			Y_N2=Data2&0x000001;
			Data2=Data2>>1;
			if(Y_N2)	
				DIN_1;
			else   			    
				DIN_0;			
			SCLK_0;
		}
		CS_1;	
	}

	void  main(void)
	{   
		char i;
		DDRB=0xFB;                //11111011
		for(i=0;i<=2;i++)
		{
		switch(i)
			{
			case 0:
					WriteSpi(0x2F,0x000000); 
					jisuan(0);
					break;
			case 1:
					WriteSpi(0x2F,0x001228);
					WriteSpi(0x2D,0x007812);  //基波选择
					WriteSpi(0x3C,0x0055AA);
					jisuan(1);
					break;
			case 2:	
					WriteSpi(0x2F,0x001228);
					WriteSpi(0x2D,0x007812);  //谐波选择
					WriteSpi(0x3C,0x000000);
					jisuan(2);
					break;
			default:	;
			}
		}	
	}
	
	void jisuan(char num)
	{	int a1,a2,a3,a4,a5,b1,b2,b3,b4,b5,c1,c2,c3,c4,c5,d;
		long t1,t2,t3;
		char v1,i1;
		a1=Power_signal(ReadSpi(r_Pa));    //把A相有功功率值放入buffer中,第八位在前,高八位在后
		buffer[0+num*50]=(char)(a1&0x00ff);
		buffer[1+num*50]=(char)((a1&0xff00)>>8);
		
		b1=Power_signal(ReadSpi(r_Pb));
		buffer[2+num*50]=(char)(b1&0x00ff);
		buffer[3+num*50]=(char)((b1&0xff00)>>8);
		
		c1=Power_signal(ReadSpi(r_Pc));
		buffer[4+num*50]=(char)(c1&0x00ff);
		buffer[5+num*50]=(char)((c1&0xff00)>>8);
		
		t1=Power_more(ReadSpi(r_Pt));
		buffer[6+num*50]=(char)(t1&0x0000ff);
		buffer[7+num*50]=(char)((t1&0x00ff00)>>8);
		buffer[8+num*50]=(char)(((t1&0xff0000)>>8)>>8);
		
		
		a2=Power_signal(ReadSpi(r_Qa));    //把A相无功功率值放入buffer中,第八位在前,高八位在后
		buffer[9+num*50]=(char)(a2&0x00ff);
		buffer[10+num*50]=(char)((a2&0xff00)>>8);
		
		b2=Power_signal(ReadSpi(r_Qb));
		buffer[11+num*50]=(char)(b2&0x00ff);
		buffer[12+num*50]=(char)((b2&0xff00)>>8);
		
		c2=Power_signal(ReadSpi(r_Qc));
		buffer[13+num*50]=(char)(c2&0x00ff);
		buffer[14+num*50]=(char)((c2&0xff00)>>8);
		
		t2=Power_more(ReadSpi(r_Qt));
		buffer[15+num*50]=(char)(t2&0x0000ff);
		buffer[16+num*50]=(char)((t2&0x00ff00)>>8);
		buffer[17+num*50]=(char)(((t2&0xff0000)>>8)>>8);
				
		
		a3=Power_signal(ReadSpi(r_Sa));    //把A相视在功率值放入buffer中,第八位在前,高八位在后
		buffer[18+num*50]=(char)(a3&0x00ff);
		buffer[19+num*50]=(char)((a3&0xff00)>>8);
		
		b3=Power_signal(ReadSpi(r_Sb));
		buffer[20+num*50]=(char)(b3&0x00ff);
		buffer[21+num*50]=(char)((b3&0xff00)>>8);
		
		c3=Power_signal(ReadSpi(r_Sc));
		buffer[22+num*50]=(char)(c3&0x00ff);
		buffer[23+num*50]=(char)((c3&0xff00)>>8);
		
		t3=Power_more(ReadSpi(r_St));
		buffer[24+num*50]=(char)(t3&0x0000ff);
		buffer[25+num*50]=(char)((t3&0x00ff00)>>8);
		buffer[26+num*50]=(char)(((t3&0xff0000)>>8)>>8);

		
		a4=effec_VI(ReadSpi(r_URmsa));           			//把A相电压有效值送入buffer
		buffer[27+num*50]=(char)(a4&0x00ff);
		buffer[28+num*50]=(char)((a4&0xff00)>>8);
		
		b4=effec_VI(ReadSpi(r_URmsb));
		buffer[29+num*50]=(char)(b4&0x00ff);
		buffer[30+num*50]=(char)((b4&0xff00)>>8);
		
		c4=effec_VI(ReadSpi(r_URmsc));
		buffer[31+num*50]=(char)(c4&0x00ff);
		buffer[32+num*50]=(char)((c4&0xff00)>>8);
		
		
		a5=effec_VI(ReadSpi(r_IRmsa));            			//把A相电流有效值送入buffer
		buffer[33+num*50]=(char)(a5&0x00ff);
		buffer[34+num*50]=(char)((a5&0xff00)>>8);
		
		b5=effec_VI(ReadSpi(r_IRmsb));
		buffer[35+num*50]=(char)(b5&0x00ff);
		buffer[36+num*50]=(char)((b5&0xff00)>>8);
		
		c5=effec_VI(ReadSpi(r_IRmsc));
		buffer[37+num*50]=(char)(c5&0x00ff);
		buffer[38+num*50]=(char)((c5&0xff00)>>8);
		
		
		buffer[39+num*50]=Power_factor(ReadSpi(r_Pfa));  	//把A相功率因数送入buffer
		buffer[40+num*50]=Power_factor(ReadSpi(r_Pfb));
		buffer[41+num*50]=Power_factor(ReadSpi(r_Pfc));
		buffer[42+num*50]=Power_factor(ReadSpi(r_Pft));
		
		
		d=wire_freq(ReadSpi(r_Freq));             			//把线频率送入buffer
		buffer[43+num*50]=(char)(d&0x00ff);
		buffer[44+num*50]=(char)((d&0xff00)>>8);
		
		buffer[45+num*50]=Tem_T(ReadSpi(r_TempD));			//把温度值送入buffer
		buffer[46+num*50]=P_D(ReadSpi(r_PFlag));			//把功率方向送入buffer
		
		
		v1=Phase_V(ReadSpi(r_SFlag));    		//0x0f表示错误,0x00表示正确
		i1=Phase_I(ReadSpi(r_SFlag));    		//0xf0表示错误,0x00表示正确
		buffer[47+num*50]=v1|i1;				//高四位为电流,第四位为电压,
	}
	




⌨️ 快捷键说明

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