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

📄 wave.c

📁 基于C8051F202的波形产生器源代码 可以产生出很好的正弦波型
💻 C
字号:
#include <c8051f020.h>
#include <setjmp.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int 
#define ulong unsigned long

char xdata SIN_TABLE[256] = {
   0x00, 0x03, 0x06, 0x09, 0x0c, 0x0f, 0x12, 0x15,
   0x18, 0x1c, 0x1f, 0x22, 0x25, 0x28, 0x2b, 0x2e,
   0x30, 0x33, 0x36, 0x39, 0x3c, 0x3f, 0x41, 0x44,
   0x47, 0x49, 0x4c, 0x4e, 0x51, 0x53, 0x55, 0x58,
   0x5a, 0x5c, 0x5e, 0x60, 0x62, 0x64, 0x66, 0x68,
   0x6a, 0x6c, 0x6d, 0x6f, 0x70, 0x72, 0x73, 0x75,
   0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7c,
   0x7d, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f,
   0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e,
   0x7d, 0x7c, 0x7c, 0x7b, 0x7a, 0x79, 0x78, 0x77,
   0x76, 0x75, 0x73, 0x72, 0x70, 0x6f, 0x6d, 0x6c,
   0x6a, 0x68, 0x66, 0x64, 0x62, 0x60, 0x5e, 0x5c,
   0x5a, 0x58, 0x55, 0x53, 0x51, 0x4e, 0x4c, 0x49,
   0x47, 0x44, 0x41, 0x3f, 0x3c, 0x39, 0x36, 0x33,
   0x30, 0x2e, 0x2b, 0x28, 0x25, 0x22, 0x1f, 0x1c,
   0x18, 0x15, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03,
   0x00, 0xfd, 0xfa, 0xf7, 0xf4, 0xf1, 0xee, 0xeb,
   0xe8, 0xe4, 0xe1, 0xde, 0xdb, 0xd8, 0xd5, 0xd2,
   0xd0, 0xcd, 0xca, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc,
   0xb9, 0xb7, 0xb4, 0xb2, 0xaf, 0xad, 0xab, 0xa8,
   0xa6, 0xa4, 0xa2, 0xa0, 0x9e, 0x9c, 0x9a, 0x98,
   0x96, 0x94, 0x93, 0x91, 0x90, 0x8e, 0x8d, 0x8b,
   0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 0x84, 0x84,
   0x83, 0x82, 0x82, 0x81, 0x81, 0x81, 0x81, 0x81,
   0x80, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, 0x82,
   0x83, 0x84, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89,
   0x8a, 0x8b, 0x8d, 0x8e, 0x90, 0x91, 0x93, 0x94,
   0x96, 0x98, 0x9a, 0x9c, 0x9e, 0xa0, 0xa2, 0xa4,
   0xa6, 0xa8, 0xab, 0xad, 0xaf, 0xb2, 0xb4, 0xb7,
   0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xca, 0xcd,
   0xd0, 0xd2, 0xd5, 0xd8, 0xdb, 0xde, 0xe1, 0xe4,
   0xe8, 0xeb, 0xee, 0xf1, 0xf4, 0xf7, 0xfa, 0xfd
};
char xdata SAN_TABLE[256] = {
   0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
   0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
   0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
   0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
   0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
   0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
   0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
   0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
   0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
   0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
   0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
   0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
   0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
   0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
   0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
   0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
   0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
   0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
   0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
   0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
   0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
   0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
   0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
   0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
   0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
   0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
   0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
   0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
   0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
   0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
   0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
   0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
};

uchar code dis1_1[] = {"   Welcome!    "};
uchar code dis1_2[] = {"  1 Wave 2 Con  "};
uchar code dis2_1[] = {" 1 Sin  2 San  "};
uchar code dis2_2[] = {"  3 Fang 4 Bak "};
uchar code dis3_1[] = {" 1 Frc  2 Vpp  "};
uchar code dis3_2[] = {"  3 Von  4 Bak "};
uchar code dis3_3[] = {" 1 Frc  2 Vpp  "};
uchar code dis3_4[] = {"  3 More 4 Bak "};
uchar code dis4_1[] = {" 1 X2   2 X1/2 "};
uchar code dis4_2[] = {"  3      4 Bak "};
uchar code dis4_3[] = {" 1 +10% 2 -10% "};
uchar code dis4_4[] = {"  3      4 Bak "};
uchar code dis4_5[] = {" 1 +10m 2 -10m "};
uchar code dis4_6[] = {"  3      4 Bak "};
uchar code dis4_7[] = {" 1 Von  2 I/F  "};
uchar code dis4_8[] = {"  3      4 Bak "};
uchar code dis5_1[] = {" 1 +1%  2 -1%  "};
uchar code dis5_2[] = {"  3      4 Bak "};
sbit	key1=P2^0;
sbit	key2=P2^1;
sbit	key3=P2^2;
sbit	key4=P2^3;
sfr16 DAC0 = 0xd2;
sfr16 DAC1 = 0xd5;
uchar WAV;
uchar MU;
uchar MU3;
uchar MU4;
uchar MU5;
uchar NOW_1[14];
uchar NOW_2[14];
ulong CLK = 22114800;
ulong F;
float  VPP;
uchar VON;
uchar VC;
uchar IF=50;
uchar CK;
uchar KEY1;
ulong x;
jmp_buf env;

void ckey();
void key();
void LCD_Getready();
void LCD_Show();
void LCD_Data();
void keyuse();
void Wave();
/*延迟程序*/
void delay(int ms)
{
    while(ms--)
	{
      uchar i;
	  for(i=0;i<250;i++)  
	   {
	    _nop_();			   
		_nop_();
		_nop_();
		_nop_();
	   }
	}
}
/*主程序*/
void main()
{   
	XBR0     = 0x00;                       // 没有选择数字外设
    XBR2     = 0x40;
    WDTCN = 0xde;
    WDTCN = 0xad;			  //关闭看门狗
	MU=1;
	KEY1=0;
	MU3 = 0;
	MU4 = 0;
	MU5 = 0;
	F   = 10000;
	VPP = 1;
	VON = 0;
	WAV = 1;	
	LCD_Data();
	LCD_Show();
  while(1)
   {
    setjmp(env);
	ckey();
	if(CK==1)
	{key();
	keyuse();
	LCD_Data();
	LCD_Show();
	}
	}
}


/*KEY 检测是否又键按下*/
void ckey()
{
    P2 = 0xff;
	if(P2!=0xff)
	CK=1;
	else
	CK=0;
}
/*KEY 返回按键值*/
void key()
{ 
	P2 = 0xff;
	if(key1==0)
	{
	    delay(10);
		P2 = 0xff;
		if(key1==0)
		KEY1=1;
	}
	if(key2==0)
	{
	    delay(10);
		P2 = 0xff;
		if(key2==0)
		KEY1=2;
	}
	if(key3==0)
	{
	    delay(10);
		P2 = 0xff;
		if(key3==0)
		KEY1=3;
	}
	if(key4==0)
	{
	    delay(10);
		P2 = 0xff;
		if(key4==0)
		KEY1=4;
	}

}
/*KEY 改变后对参数的改变*/
void keyuse()
{
   if(MU==1)
    {if(KEY1==1)
	    Wave();
	 if(KEY1==2)
	    MU=2; 
	}
   else if(MU==2)
    {if(KEY1==1)
	    {WAV=1;
		 MU=3;
		 MU3=1;
		}
     else if(KEY1==2)  
		{WAV=2;
		 MU=3;
		 MU3=2;
		}
     else if(KEY1==3)  
		{WAV=3;
		 MU=3;
		 MU3=3;
		}
     else if(KEY1==4)  
		 MU=1;
	 }
   else if(MU==3)
     {
	  if(KEY1==1)
	    {
	     MU=4;
	     MU4=1;
		}
	  if(KEY1==2)
	    {
		 MU=4;
	     MU4=2;
		}
	  if(KEY1==3)
	    {if(MU3==3)
		   	{
			 MU=4;
			 MU4=4;
			}
		 else
		    {
			 MU=4;
			 MU4=3;
			}
		 }
	  if(KEY1==4)
	    MU=2;
	 }
   else if(MU==4)
     {
	  if(MU4==1)
	   {if(KEY1==1)
		  F=2*F;
		else if(KEY1==2)
		  F=F/2;
		else if(KEY1==4)
		  MU=3;
	   }
	  else if(MU4==2)
	   {if(KEY1==1)
		  VPP=11*VPP/10;
		else if(KEY1==2)
		  VPP=9*VPP/10;
		else if(KEY1==4)
		  MU=3;
	   }
	  else if(MU4==3)
	   {if(MU3==3)
		  {if(KEY1==1)
		     {
			  MU=5;
			  MU5=1;
			 }
	       	 else if(KEY1==2)
		     {
			  MU=5;
			  MU5=1;
			 }
		     else if(KEY1==4)
		     MU=3;
	       }
		else
		   {if(KEY1==1)
		     VON=VON+10;
	       	 else if(KEY1==2)
		     VON=VON-10;
		     else if(KEY1==4)
		     MU=3;
	       }		  
	   }
	  }
	 else if(MU==5)
	  {if(MU5==1)
	   	  {if(KEY1==1)
		     VON=VON+10;
	       	 else if(KEY1==2)
		     VON=VON-10;
		     else if(KEY1==4)
		     MU=4;
	       }
	   else if(MU5==2)
	      {if(KEY1==1)
		     IF=IF+1;
	       	 else if(KEY1==2)
		     IF=IF-1;
		     else if(KEY1==4)
		     MU=3;
	       }
	  }
	  KEY1=0;
}
/*LCD 初始化*/


void LCD_Getready()
{  
   P2 = 0X80;
   for(x=0;x<1000;x++);
   //P7 = 0x30;				/*一行显示*/
   P3 = 0x38;				/*两行显示*/
   P2 = 0X00;//0x08;
   P2 = 0X80;//0x09; 
   for(x=0;x<1000;x++);
   P3 = 0x0e;
   P2 = 0x00;
   P2 = 0x80;
   for(x=0;x<1000;x++);
   P3=  0x06;
   P2 = 0x00;
   P2 = 0x80;
   for(x=0;x<5000;x++);
   P3 = 0x01;
   P2 = 0x00;
   P2 = 0x80; 
   for(x=0;x<5000;x++);
}
/*LCD输出*/
void LCD_Show()
{
   uchar  *showpr;
   uint   i,data1;
   LCD_Getready();
   P2  = 0xA0;                              //准备送数据
        showpr = &NOW_1;                 	    //取地址
	    for(i=14;i>0;i--)                   //显示第一行字符
	    { 
		    data1 = *showpr;			    	//读出数据				
		    P3 = data1; 				    	//写数据到端口
			P2 = 0x20;
	        P2 = 0xA0;						//控制LCD	
	        showpr++;
			delay(10);
		}

		   P2 = 0X80;
		   P3 = 0xc0;
		   P2 = 0x00;		
   		   P2 = 0x80;         	   
		                        //取地址		
        showpr = &NOW_2; 
        for(i=0;i<14;i++)     				//显示第二行字符
		{
		    data1 = *showpr;			    	//读出数据						    	
			P3 = data1; 				    	//写数据到端口
			P2 = 0xa0;
	        P2 = 0x20;						//控制LCD
	        showpr++;
			delay(10);
		}
}
/*LCD 取出显示数据*/
void LCD_Data()
{
  uchar  i;
  uchar   *datapr;
  
  if(MU==1)							  //第一层菜单显示
    {datapr = &NOW_1;
	 for(i=0;i<14;i++)
	   { *datapr = dis1_1[i];
	     datapr++;
		} 
	 datapr = &NOW_2;
	 for(i=0;i<14;i++)
	   { *datapr = dis1_2[i];
	     datapr++;
		}  
	 }
  else if(MU==2)					  //第二层菜单显示
    {datapr = &NOW_1;
	 for(i=0;i<14;i++)
	   { *datapr = dis2_1[i];
	     datapr++;
		} 
	 datapr = &NOW_2;
	 for(i=0;i<14;i++)
	   { *datapr = dis2_2[i];
	     datapr++;
		}  
	 }
  else if(MU==3)					  //第三层菜单显示
    {if(MU3==1||MU3==2)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis3_1[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis3_2[i];
	         datapr++;
		   }
		 }   
     else if(MU3==3)	    
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis3_3[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis3_4[i];
	         datapr++;
		   }
		 }	            
     }
  else if(MU==4)					   //第四层菜单显示
    {if(MU4==1)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_1[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_2[i];
	         datapr++;
		   }
		 } 
	 else if(MU4==2)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_3[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_4[i];
	         datapr++;
		   }
		 } 
	 else if(MU4==3)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_5[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_6[i];
	         datapr++;
		   }
		 }
	 else if(MU4==4)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_7[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_8[i];
	         datapr++;
		   }
		 }
    }
  else if(MU==5)					    //第五层菜单显示
    {if(MU5==1)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_5[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis4_6[i];
	         datapr++;
		   }
		}
	  if(MU5==2)
	    {datapr = &NOW_1;
	     for(i=0;i<14;i++)
	       { *datapr = dis5_1[i];
	         datapr++;
		   } 
	     datapr = &NOW_2;
	     for(i=0;i<14;i++)
	       { *datapr = dis5_2[i];
	         datapr++;
		   }
		}
	} 		    
} 
/*波形产生*/
void Wave()
{  char *pri,data1;
   float e,f,i,vpp;
   f=CLK/(256*F);
   vpp=VPP;
   
   if(WAV==1)
    { 
	 pri = &SIN_TABLE;
	 while(1)
	 {
	 for(i=0;i<=256;i++)
	  {
	   data1=*pri;
	   data1=vpp*data1;
	   data1=data1+VON;
       DAC0=data1;
	   pri++;
	   for(i=0;i<=f;i++)
	   {ckey();
	    if(CK==1)
		longjmp(env,1);
		}
       }
      }
     }
    else if(WAV==2)
    {
	 while(1)
	 { 
	 pri = &SAN_TABLE;
	 for(i=0;i<=256;i++)
	  {
	   data1=*pri;
	   data1=vpp*data1;
	   data1=data1+VON;
       DAC0=data1;
	   pri++;
	   for(i=0;i<=f;i++)
	   {ckey();
	    if(CK==1)
		longjmp(env,1);}
       }
      }
     }
    else if(WAV==3)
	{e=256*IF/100;
	while(1)
	{
	 for(i=0;i<256;i++)
	 {for(i=0;i<=f;i++)
	  {ckey();
	    if(CK==1)
		longjmp(env,1);}
	  if(i<=e)
	  {
	   data1=0xff;
	   data1=vpp*data1;
	   data1=data1+VON;
	   DAC0=data1;
      }
	  else
	  {
	   data1=0;
	   data1=data1-VON;
	   DAC0=data1;
	  }
     }
	}
   }
  }

⌨️ 快捷键说明

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