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

📄 jzht.c

📁 利用高速da通过查表法进行正弦波,方波,三角波产生的stc89c51程序和波形码表生成的c程序
💻 C
字号:
#include <reg52.H>  //77E58库函数
#include <absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sfr T2MOD =0xc9;
#define COM XBYTE[0x6000]   //8279命令口
#define DAT XBYTE[0x4000]   //8279数据口
#define DAA 0x01
#define DBB 0x02
#define DCC 0x04
#define DDD 0x08
#define DEE 0x10
#define DFF 0x20
#define DGG 0x40
unsigned char code table[]=
      {DAA+DBB+DCC+DDD+DEE+DFF,//0
		DBB+DCC,//1
		DAA+DBB+DDD+DEE+DGG,//2
		DAA+DBB+DCC+DDD+DGG,//3
		DFF+DGG+DBB+DCC,//4
		DAA+DFF+DGG+DCC+DDD,//5
		DAA+DFF+DEE+DDD+DCC+DGG,//6
		DAA+DBB+DCC+DFF,//7
		DAA+DBB+DCC+DDD+DEE+DFF+DGG,//8
		DAA+DBB+DCC+DDD+DFF+DGG,//9
		DAA+DBB+DCC+DEE+DFF+DGG,//A
		DCC+DDD+DEE+DFF+DGG,//B
		DAA+DDD+DEE+DFF,//C
		DBB+DCC+DDD+DEE+DGG,//D
		DAA+DDD+DEE+DFF+DGG,//E
		DAA+DEE+DFF+DGG,//F
		DAA+DBB+DEE+DFF+DGG,//16
		0x00,//17
		DBB+DCC+DDD,//18
		DDD};//19
unsigned char data cont0[16]={0x00,0x02,0x04,0x07,0x09,
0x0b,0x0c,0x0e,0x01,0x03,0x05,0x06,0x0a,16,0x0d,17};//键表
uchar data keynum;//按键数值和临时单元
uchar display_table[8];
uchar disp_statu=8;//=0 设定频率 =1 设定幅值 8 显示频率 2 显示幅值
uchar wave_kind=0;
uchar wave_aa=10;//默认幅值为1V
uchar wave_add;//波形起始地址
unsigned long disp_temp1;
unsigned long wave_ff=100;//默认频率为100
//uchar wave_fw=0;//默认步进为10Hz
void dispz(void);//点亮所有八位数据
void delay_1s(void);
void service_int0(void) interrupt 0
{
  	unsigned char j;
	union uuu
	{
		unsigned long lword;
		unsigned char byte[4];
	} set_f;

  	j=DAT;
  	keynum=cont0[j];
	j=keynum;
	if(j==4)//选择方波
	{
 				display_table[0]=0x0f;
	         display_table[1]=0x0f;
	         display_table[2]=19;
	         display_table[3]=17;
	         display_table[4]=17;
	         display_table[5]=17;
	         display_table[6]=17;
	         display_table[7]=17;
	         dispz();
				wave_kind=1;
					wave_ff=100;
				disp_statu=0;
	}
	else if(j==0)//选择正弦波
  	{
	         display_table[0]=5;
	         display_table[1]=0x0f;
	         display_table[2]=19;
	         display_table[3]=17;
	         display_table[4]=17;
	         display_table[5]=17;
	         display_table[6]=17;
	         display_table[7]=17;
	         dispz();
				wave_kind=0;
					wave_ff=100;
				disp_statu=0;
	}
  	else if(j==9)//选择三角波
	{
	         display_table[0]=0x0a;
	         display_table[1]=0x0f;
	         display_table[2]=19;
	         display_table[3]=17;
	         display_table[4]=17;
	         display_table[5]=17;
	         display_table[6]=17;
	         display_table[7]=17;
	         dispz();
				wave_kind=2;
					wave_ff=100;
				disp_statu=0;
	}
  	else if(j==12)//选择锯齿波
	{
	         display_table[0]=18;
	         display_table[1]=0x0f;
	         display_table[2]=19;
	         display_table[3]=17;
	         display_table[4]=17;
	         display_table[5]=17;
	         display_table[6]=17;
	         display_table[7]=17;
	         dispz();
					wave_ff=100;
				wave_kind=3;
				disp_statu=0;
	}
  	else if(j==1)//设定频率
	{
		   disp_statu=0;
			switch(wave_kind)
			{
				case 0://显示正弦频率
				display_table[1]=0x0f;
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
		         dispz();
				break;
				case 1://显示方波
				display_table[1]=0x0f;
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
		         dispz();
				break;
				case 2://显示三角波
				display_table[1]=0x0f;
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
		         dispz();
				break;
				case 3://显示锯齿波
				display_table[1]=0x0f;
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
		         dispz();
				break;
			}
	}
  	else if(j==2)//增加频率值
	{
			if(disp_statu==0)//容许调整频率
			{
				if((wave_ff>=100)&&(wave_ff<1000))
				{
					wave_ff=wave_ff+10;
			  	}
				else if((wave_ff>=1000)&&(wave_ff<999999))
				{
					wave_ff=wave_ff+1000;
			  	}
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
   			dispz();
			}
	}
  	else if(j==3)//频率值加10000
	{
			if(disp_statu==0)//容许调整频率
			{
				if((wave_ff>=1000)&&(wave_ff<999999))
				{
					wave_ff=wave_ff+10000;
			  	}
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
   			dispz();
			}
	}
	else if(j==5)//显示幅值
	{
				disp_statu=1;
				wave_aa=10;
				switch(wave_kind)
				{
					case 0://显示正弦频率
			         display_table[0]=5;
			         display_table[1]=0x0a;
			         display_table[2]=19;
			         display_table[3]=17;
			         display_table[4]=17;
			         display_table[5]=17;
			         display_table[6]=1;
			         display_table[7]=0;
			         dispz();
					break;
					case 1://显示方波
			         display_table[0]=0x0f;
			         display_table[1]=0x0a;
			         display_table[2]=19;
			         display_table[3]=17;
			         display_table[4]=17;
			         display_table[5]=17;
			         display_table[6]=1;
			         display_table[7]=0;
			         dispz();
					break;
					case 2://显示三角波
			         display_table[0]=0x0a;
			         display_table[1]=0x0a;
			         display_table[2]=19;
			         display_table[3]=17;
			         display_table[4]=17;
			         display_table[5]=17;
			         display_table[6]=1;
			         display_table[7]=0;
			         dispz();
					break;
					case 3://显示锯齿波
			         display_table[0]=18;
			         display_table[1]=0x0a;
			         display_table[2]=19;
			         display_table[3]=17;
			         display_table[4]=17;
			         display_table[5]=17;
			         display_table[6]=1;
			         display_table[7]=0;
			         dispz();
					break;
				}
	}
  	else if(j==6)//频率值减
	{
			if(disp_statu==0)//容许调整频率
			{
				if((wave_ff>100)&&(wave_ff<2000))
				{
					wave_ff=wave_ff-10;
			  	}
				else if((wave_ff>=2000)&&(wave_ff<999999))
				{
					wave_ff=wave_ff-1000;
			  	}
				display_table[2]=wave_ff/100000;
				disp_temp1=wave_ff%100000;
				display_table[3]=disp_temp1/10000;
				disp_temp1=disp_temp1%10000;
				display_table[4]=disp_temp1/1000;
				disp_temp1=disp_temp1%1000;
				display_table[5]=disp_temp1/100;
				disp_temp1=disp_temp1%100;
				display_table[6]=disp_temp1/10;
				disp_temp1=disp_temp1%10;
				display_table[7]=disp_temp1;
   			dispz();
			}
	}
	else if(j==10)	//确认键
	{
		if(wave_kind==0)//设定正弦波
		{
			wave_add=0;
			wave_add=wave_add+wave_aa;
			if(wave_add&&0x01)
			{
				INT1=1;
			}
			else
			{
				INT1=0;
			}
			P1=wave_add;//选择地址

		}
		if(wave_kind==1)//设定方波
		{
			wave_add=0x40;
			wave_add=wave_add+wave_aa;
			if(wave_add&0x01)
			{
				INT1=1;
			}
			else
			{
				INT1=0;
			}
			P1=wave_add;//选择地址
		}
		if(wave_kind==2)//设定三角波4
		{
			wave_add=0x80;
			wave_add=wave_add+wave_aa;
			if(wave_add&0x01)
			{
				INT1=1;
			}
			else
			{
				INT1=0;
			}
			P1=wave_add;//选择地址
		}
		if(wave_kind==3)//设定锯齿波600~790h
		{
			wave_add=0xc0;
			wave_add=wave_add+wave_aa;
			if(wave_add&0x01)
			{
				INT1=1;
			}
			else
			{
				INT1=0;
			}
			P1=wave_add;//选择地址
		}
		//插入频率设定程序	 
		//根据wave_ff频率数值,计算定时器2的装入值
		set_f.lword=1500000/wave_ff;
		set_f.lword=65536-set_f.lword;
		TR2=0;
		RCAP2H=set_f.byte[2];
		RCAP2L=set_f.byte[3];
		TR2=1;
		disp_statu=8;
	}
  	else if(j==11)//幅值加0.1V
	{
			if(disp_statu==1)//容许调整幅值
			{
				if((wave_aa>=10)&&(wave_aa<50))
				{
					wave_aa=wave_aa+1;
			  	}
				display_table[6]=wave_aa/10;
				display_table[7]=wave_aa%10;
   			dispz();
			}
	}
  	else if(j==14)//幅值减0.1V
	{
			if(disp_statu==1)//容许调整幅值
			{
				if((wave_aa>10)&&(wave_aa<=50))
				{
					wave_aa=wave_aa-1;
			  	}
				display_table[6]=wave_aa/10;
				display_table[7]=wave_aa%10;
   			dispz();
			}
	}
  	else
	{
   }
}
void delay_1s(void)  //1秒延时子程
{
	unsigned int idata i,j;
	   for(i=0;i<150;i++)
	   {
	   	for(j=0;j<900;j++)
	      {
	      }
	   }
}
void dispz(void)//显示函数
{
   COM=0x87;
   DAT=table[display_table[7]];
   COM=0x86;
   DAT=table[display_table[6]];
   COM=0x85;
   DAT=table[display_table[5]];
   COM=0x84;
   DAT=table[display_table[4]];
   COM=0x83;
   DAT=table[display_table[3]];
   COM=0x82;
   DAT=table[display_table[2]]|0x08;
   COM=0x81;
   DAT=table[display_table[1]];
   COM=0x80;
   DAT=table[display_table[0]];
}
void main(void)
{
	unsigned int temp;
		for(temp=0;temp<20000;temp++)
		{}
	   COM=0x00;
    	COM=0x3f;//键盘显示方式,时钟分频
		EX0=1;
		IT0=1;
		T2CON=0;
		T2MOD=2;
		TR2=0;
		RCAP2H=0xff;
		RCAP2L=0x00;
		TR2=1;
	   EA=1;
	   display_table[0]=8;
	   display_table[1]=8;
	   display_table[2]=8;
	   display_table[3]=8;
	   display_table[4]=8;
	   display_table[5]=8;
	   display_table[6]=8;
	   display_table[7]=8;
	   dispz();
		wave_kind=0;
		wave_ff=100;
		wave_aa=10;
		disp_statu=8;
		for(;;)
	   {
				if(disp_statu==8)//显示频率
				{
					if(wave_kind==0)
					{
						display_table[0]=5;
					}
					else if(wave_kind==1)
					{
						display_table[0]=0x0f;
					}
					else if(wave_kind==2)
					{
						display_table[0]=0x0a;
					}
					else if(wave_kind==3)
					{
						display_table[0]=18;
					}
					display_table[1]=0x0f;
					display_table[2]=wave_ff/100000;
					disp_temp1=wave_ff%100000;
					display_table[3]=disp_temp1/10000;
					disp_temp1=disp_temp1%10000;
					display_table[4]=disp_temp1/1000;
					disp_temp1=disp_temp1%1000;
					display_table[5]=disp_temp1/100;
					disp_temp1=disp_temp1%100;
					display_table[6]=disp_temp1/10;
					disp_temp1=disp_temp1%10;
					display_table[7]=disp_temp1;
	   			dispz();
 	   			delay_1s();
					if(disp_statu==8)
					{disp_statu=2;}
				}
				else if(disp_statu==2)//显示幅值
				{
					if(wave_kind==0)
					{
						display_table[0]=5;
					}
					else if(wave_kind==1)
					{
						display_table[0]=0x0f;
					}
					else if(wave_kind==2)
					{
						display_table[0]=0x0a;
					}
					else if(wave_kind==3)
					{
						display_table[0]=18;
					}
					display_table[1]=0x0a;
					display_table[2]=19;
					display_table[3]=17;
					display_table[4]=17;
					display_table[5]=17;
					display_table[6]=wave_aa/10;
					display_table[7]=wave_aa%10;
	   			dispz();
		     	   delay_1s();
					if(disp_statu==2)
					{disp_statu=8;}
				}
				else
				{
		     	   delay_1s();
				}

	   }
}

⌨️ 快捷键说明

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