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

📄 aaa.c

📁 用51单片机编译成的频率计的源程序
💻 C
📖 第 1 页 / 共 3 页
字号:
  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();
	  
	}

 }




/******************************************************************************
*                       ADC_Init(channel)
*功能描述:ADC初始化,选择模拟通道输入,初始化时钟,关闭ADC中断
*参    数:channel - uchar 选择ADC通道
*注    意:当ADC通道改变得时候,此子程序一定要被调用
*****************************************************************************/

void ADC_Init (unsigned char channel) 

/******************************************************************************
*                      uint  ADC_Read(channel)
*功能描述:读A/D转换后的数据
*参    数:channel,初始化程序中选择的通道
*返 回 值:ADC转换结果,12位
*注    意:该子程序调用前,ADC_Init()必须先被调用
*******************************************************************************/
unsigned int ADC_Read( unsigned char channel )

/******************************************************************************
*                       uint ADC_Get(channel)
*功能描述:直接得到AD转换值
*参    数:channel,选择读取通道
*返 回 值:uint ADC转换结果
*****************************************************/
unsigned  ADC_Get (uchar channel)

void  getVA  (unsigned char channel)





*返 回 值:uint ADC转换结果
*****************************************************/
uint ADC_Get (uchar channel)
{  uint i,j;
   ADC_EnableAll();
   ADC_Init(channel);
   for(j=250;j>0;j--); 
   i = ADC_Read(channel);
   return(i);
}

void getVA  (uchar channel)
{ 
  uchar str_v[] = {"The Voltage is:"};
  uint temp;
  uint value;
  uchar vv[3];
  uchar templ;
  value = ADC_Get(channel);
  value = value*100;
  temp = (float)(value/1023)*5;
  temp1 = value % 51;
  if(temp1 >= 26)temp++;
  
  vv[2] = temp%10;
  vv[1] = (temp/10%)10;     //小数点后1位 
  vv[0] = temp/100;         // 个位

  printstr(0,0,str_v);
  printchar(5,1,vv[0]);
  printchar(6,1,0x2e);
  printchar(7,1,vv[0]);
  printchar(8,1,vv[0]);
}

   */

⌨️ 快捷键说明

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