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

📄 aaa.c.bak

📁 用51单片机编译成的频率计的源程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
		CAPCOML2 = (W_Ton & 0x00FF);
		CAPCOMH2 = (W_Ton >> 8);	
	}											 //66

////////////////////////////////////////////

//下一个采样点
	
	
 	P_flag = ~P_flag;		//奇偶点变换

	K++;					//下一个采样点值

	Tm++;
	U_angle = K*180/N;
	V_angle = U_angle + 120;
	W_angle = U_angle + 240;




	if (P_flag == 0)
	{
//		U_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
//		V_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
//		W_Toff =k1* ((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
		U_Toff =((Half_Ts * (0xffff - M*(sin_angle(U_angle))))>>16);
		V_Toff =((Half_Ts * (0xffff - M*(sin_angle(V_angle))))>>16);
		W_Toff =((Half_Ts * (0xffff - M*(sin_angle(W_angle))))>>16);
	}
	else
	{
		U_Ton =((Half_Ts * (0xffff + M*(sin_angle(U_angle))))>>16);
		V_Ton =((Half_Ts * (0xffff + M*(sin_angle(V_angle))))>>16);
		W_Ton =((Half_Ts * (0xffff + M*(sin_angle(W_angle))))>>16);

	
	}

//	if (P_flag == 0)
//	{
//		U_Toff = (417 * (0x400000 - M*(sin_angle(U_angle))))>>22;
//		V_Toff = (417 * (0x400000 - M*(sin_angle(V_angle))))>>22;
//		W_Toff = (417 * (0x400000 - M*(sin_angle(W_angle))))>>22;
//	}
//	else
//	{
//		U_Ton = (417 * (0x400000 + M*(sin_angle(U_angle))))>>22;
//		V_Ton = (417 * (0x400000 + M*(sin_angle(V_angle))))>>22;
//		W_Ton = (417 * (0x400000 + M*(sin_angle(W_angle))))>>22;
//	
//	
//	}
//	aa=0;

	
	if ( K==2*N )
	{ K=0;

//	  P_flag = 0;
	 }

	 
}
  
/****************************************************************************
*死区指令延时,应实测,要考虑中断影响
* 10个temp 延时约6us
****************************************************************************/
void delay1()					  
{								  
	char temp;					 

	EA=0;					
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;
	temp = 0;

	EA=1;

}
/***************************************************************************
*定时器0初始化
***************************************************************************/
void timer0_init (void)
{
 	EA = 0;					/* disable interrupts */

  	TR0 = 0;				/* stop timer 0 */
  	TMOD &= 0xF0;			/* clear timer 0 mode bits - bottom 4 bits */
  	TMOD |= 0x01;			/* put timer 0 into 16-bit no prescale */

    timer0_value = 0x10000-Ts;		//采样周期=1/2载波周期	
  	TL0 = (timer0_value & 0x00FF);
  	TH0 = (timer0_value >> 8);

 // 	PT0 = 1;				/* set high priority interrupt for timer 0 */
 	PT0 = 0;
  	ET0 = 1;				/* enable timer 0 interrupt */
  	TR0 = 1;				/* start timer 0 */
  	EA = 1;					/* enable interrupts */
}



/***************************************************************************
*PCA中断服务程序
***************************************************************************/
static void PCA_isr (void) interrupt PCA_VECTOR using 1 

{
	unsigned char PCA_status;


	PCA_status = PCASTA;			//读PCA中断状态


	if ( PCA_status & 0x01)			//TCM0中断,U相
	{

		if (P_flag==0)
		{
			P4_3 = 1;				//偶数采样中断到,关V4 延时 开V1
			delay1();
			P4_0 = 0;
		}
		else 
		{
			P4_0 = 1;				//奇数采样中断到,关V1 延时 开V4
			delay1();
			P4_3 = 0;
		}
	PCASTA &= 0xFE;

	}
	
	if ( PCA_status & 0x02)			//TCM1中断,V相
	{

		if (P_flag==0)
		{
			P4_5 = 1;				//偶数采样中断到,关V6 延时 开V3
			delay1();
			P4_2 = 0;
		}
		else 
		{
			P4_2 = 1;				//奇数采样中断到,关V3 延时 开V6
			delay1();
			P4_5 = 0;
		}
	PCASTA &= 0xFD;
	}

	if ( PCA_status & 0x04)			//TCM2中断,W相
	{

		if (P_flag==0)
		{
			P4_4 = 1;				//偶数采样中断到,关V5 延时 开V2
			delay1();
			P4_1 = 0;
		}
		else 
		{
			P4_1 = 1;				//奇数采样中断到,关V2 延时 开V5
			delay1();
			P4_4 = 0;
		}
	PCASTA &= 0xFB;
	}

	
//	PCASTA &= 0x00;					 //清PCA中断状态

}

//PCA0初始化
void PCA_init()
{

	unsigned int PCA0;
	//0.1 Configure pins as PCA function
//	P4SFS0=0xff;
//	P4SFS1=0;

	//0.2 initialize PCA0 counter
	PCACL0=PCACH0=0;
	PCACL1=PCACH1=0;

	//1.2 select PCA0CLK as PCA0 clock source
	//PCA0时钟为fosc,timer0_isr中Toff,Ton计数值*12 再写入比较寄存器
//	CCON2=0x10;				
	CCON2=0x12;	   //fosc/4

	//Stop PCA0 counter
	PCACON0=0x00;

	//3. Set TCM0 operationg mode,16bit soft timer , enable softimer interrupt
//	TCMMODE0=0x48;
	TCMMODE0=0xC8;
	TCMMODE1=0xC8;
		
	TCMMODE2=0xC8;		


	CAPCOML0 = (PCA0 & 0x00FF);
	CAPCOMH0 = (PCA0 >> 8);


	// 开PCA中断
	IEA |= 0x20;
	IPA |= 0X20;	  // set high priority interrupt for PCA0 
	
	 //5. Start PCA0 counter
	 PCACON0|=0x40;

}


/******************************************************************************
*                       uint getVA(channel)
*功能描述:读取输出电压,电流值
*参    数:channel,选择读取通道
*****************************************************/


void getVA (uchar channel)
{ 
  code uchar str_v[] = {"The V and A is:"};
  //uchar temp1;
   uint temp;
   unsigned long int value;
   uchar vv[3];
  	
  
 // ADC_EnableAll();
  
  ADC_Init(channel);

  
  clrlcd();
   printchar(1,1,'v');
  printstr(0,0,str_v);  
  printchar(2,1,0x3a);
  printchar(4,1,0x2e) ;	   //"."
  printchar(7,1,'V') ;

  value = ADC_Read(channel); 

  temp = value*150;	          //或者88.temp = (value*2.5/1023)*1000*k
 // temp1 = value % 51;
 // if(temp1 >= 26)temp++;
  
  vv[3] = temp%10;			 //小数点后第3位 
  vv[2] = (temp/10)%10;		 //小数点后第2位 
  vv[1] = temp/100;     //小数点后第1位 
 
  
 // clrlcd();
 // printchar(1,1,'v');
 // printchar(2,1,0x3a);
  printchar(3,1,vv[0]+48);	
   printchar(4,1,vv[1]+48);
  printchar(5,1,0x2e) ;	   //"."
 ;
  printchar(6,1,vv[2]+48);
  //printchar(7,1,vv[3]+48);
  //printchar(8,1,'V') ;

  printchar(10,1,'I') ;
  printchar(11,1,0x3a) ;	   //":"
  printchar(15,1,'A') ;	   //"."
  //keyv=getkey();}while(keyv == 0x0e);
}

/**************************************************************
*           getPf()
*进入算功率,读频率程序
***************************************************************/
void  getPf  (void)
{ code uchar str_pf[] = {"The f and P is:"};
  clrlcd();
  printstr(0,0,str_pf);

  printchar(1,1,'f');
  printchar(2,1,0x3a);	      //":"
  printchar(3,1,pinlv[0]+48);
  printchar(4,1,pinlv[1]+48);
  printchar(5,1,pinlv[2]+48);
  printchar(6,1,'H');
  printchar(7,1,'z');
  printchar(9,1,'P');
  printchar(10,1,0x3a);		   //":"
  printchar(14,1,'W');


}


/***********************************************************
*        void dat_get (void)
         *进入输入频率程序

***********************************************************/
void dat_get (void)
{
   void pwmwork(void ); 
   
 code uchar hz[]={"Hz"};
 code uchar putf[] = {"Please Input f:"};
   uchar i;
 clrlcd();
 printstr(0,0,putf);
 printchar(4,1,102);   // "f"
 printchar(5,1,58);    // ":"
 do{keyv=getkey();}while(keyv==0x0e);     //有数字键按下则开始输入频率
 for(i=0;i<3;i++)
 {
 
	  do{ 
	       pinlv[i] = keyv;
	       printchar(6+i,1,keyv+48);
		   
		   keyv=getkey();
	     }while(keyv!=0x0e);
	  if(i<=1)	 	
	   {
	    do{keyv=getkey();}while((keyv == 0x0e));	// && (i != 0x02)
		}
   }
   
   printstr(9,1,hz);


   delay1ms(500);

     pwmwork();                 //开始PWM

   
}

/*********************************************************************
*           m_get()
*输入调制度
*********************************************************************/
/* void m_get(void )
 {
   xdata uchar i,j=2;
// code uchar ok[]={"OK"};
 code uchar putm[] = {"Please Input M:"};
 
 clrlcd();
 printstr(0,0,putm);
 printchar(4,1,77);   // "M"
 printchar(5,1,58);    // ":"
 do{keyv=getkey();}while(keyv==0x0e);     //有数字键按下则开始输入频率
 for(i=0;i<3;i++)
 {
 
	  do{ 
	       mm[i] = keyv;
	       printchar(6+i,1,keyv+48);
		   
		   keyv=getkey();
	     }while(keyv!=0x0e);
	  
	  if(i<=1)	 	
	   {
	    do{keyv=getkey();}while((keyv == 0x0e));	// && (i != 0x02)
		}
   }
   
   printstr(14,1,OK);


   delay1ms(300);

    pwmwork();                        //开始PWM
 
 }	*/
/**********************************************************
 *key_deal
  键盘处理

***********************************************************/
 void key_deal(void)
{
  code uchar str_d0 [] ={"A:Input Fre:"};
  code uchar str_d1 [] ={"B:Get V and A:"};
  code uchar str_d2 [] ={"C:Get f and P:"};
  code uchar str1[] =   {"Please Choose:"};
 // code uchar str_m[] =  {"D:Input the M:"};
//  do{ keyv=getkey(); }while(keyv != 0x0e);// 开始	
      clrlcd();
      printstr(0,0,str1);                 //Please input 	  
  do{keyv=getkey();} while(keyv==0x0e); 
 
    switch (keyv=getkey())
         {			   
	       case 0x0a:{ 
		                clrlcd();
						printstr(0,0,str1);
		                printstr(0,1,str_d0);			     //输入频率
						do{keyv=getkey();}while(keyv==0x0a);
						
						if(keyv==0x0e)
						  {
						    printstr(14,1,OK);
						    delay1ms(500);
						    dat_get() ;
						  }  break;					 //输入频率值
				 	 }  
	 

			  
		   case 0x0b:{ 
		                clrlcd();
					    printstr(0,0,str1);
		             			                             //得到电压和电流
			            printstr(0,1,str_d1);
					    delay1ms(15);
					    do{keyv=getkey();}while(keyv==0x0b);
					    if(keyv==0x0e) 					      //确认键	
					      {
					        printstr(14,1,OK);
						    delay1ms(700);
						    getVA (0);
					
					       }  
                        break;					 
				 
					 } 
					  
		   case 0x0c:{  
		                clrlcd();
						printstr(0,0,str1);                    //算得功率,再次输入频率
		   						
			            printstr(0,1,str_d2);
						delay1ms(15);
						do{keyv=getkey();}while(keyv==0x0c);
						if(keyv==0x0e) 
						{
						 printstr(14,1,OK);
						 delay1ms(500);
						 getPf();
						}
					    break;
				
				      } 
	/*	case 0x0d:	 {	
		                clrlcd();
						printstr(0,0,str1);      
						printstr(0,1,str_m);	 //"Input the M:"
	                    do{keyv=getkey();}while(keyv==0x0d);
						if(keyv==0x0e)
						  {
						    printstr(14,1,OK);
						    delay1ms(500);
						    m_get() ;			   //输入调制度
						  }  break;		
		             }	   */
	       default: break;
	     }



}

/****************************************************
       **********主程序*************
*****************************************************/
void main (void)
{  
   code uchar str0[] = {"Welcome!"};
   code uchar str1[] = {"Please opt step:"};
   
    POWK = 1;					//电源关
	
	POWZ = 1;

   PSD33_reg.CONTROL_A = 0;		  //MCU I/O模式
   PSD33_reg.DIRECTION_A =0xff;   //输出模式 	  
   init_lcd();
   ADC_EnableAll();
   printstr(4,0,str0);            //"Welcom!"
   printstr(0,1,str1);            //"Please opt step:"
   delay1ms(10);
   do{ keyv=getkey(); }while(keyv != 0x0e);
   key_deal();
}


void pwmwork(void)
{	
    
    unsigned char  ADC_channel;
	unsigned long ADC_result;
	uchar f;
	int du,err1,err2,uad;
    
//	POWK = 0;					//电源关
	
//	POWZ = 0;

	CCON0=0x10;
	ADC_Init (0) ;

	Ts = 1667;					//采样周期,晶振40M,则载波为1/(Ts*T)
	Half_Ts =  833*3;				//半采样周期
//	k1=120;

	K_M = 256;					//调制系数放大倍数
	K_F = 256;					//输入频率放大倍数
//	K_sin = 256;				//sin表放大倍数
//	K_coe =	K_M * K_sin;			//总放大倍数,K_M * K_sin;

	F_min = 100;				//最小频率 


	
	f = pinlv[0]*100 + pinlv[1]*10 + pinlv[0] ;

   
    F = K_F * f;

//	M = mm[0]*100 + mm[1]*10 + mm[2];
	M = 160;
	N = (K_F*1000)/F ;							// N = 1000/f;载波为1K

	POWK = 0;
	delay1ms(1000);

	POWZ = 0;                                                                                                                                      



	ST = 0;                          //脉冲芯片使能

	if ( F > F_min)
	{ 

	   	first();
		timer0_init(); 
		PCA_init();
	}
 

//主循环,一个采样周期后,读取AD的给定频率值重新计算调制度M和载波比N

//如果计算时间不够的话,可以另设M2,N2变量,在定时器中断程序中判断K=2*N时,
//将主循环中的计算值M2,N2赋给M,N进行计算

	while(1)
	 {
	   if(Tm==240)
	     {
		   Tm = 0;
		   uad =  ADC_Read(0 );
	       err1 = u36 - uad;
	       du =(err1 - err2)/4;
		   M = M + du;
		   err2 = err1;
	    }
	  keyv = getkey();
	  while(keyv!=0x0e)key_deal();
	  
	}

 }

⌨️ 快捷键说明

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