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

📄 dds.c

📁 通过按键产生不同的波形
💻 C
字号:
 #include "reg52.h" 
#define uchar unsigned char
#define uint unsigned int

unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴极0~9对应16进制数
//=============正弦波数据==================== 
uchar code sin_tab[256]= 
{ 
0x80, 0x83, 0x86, 0x89, 0x8c, 0x8f, 0x92, 0x95, 0x98, 0x9c, 0x9f, 0xa2, 0xa5, 0xa8, 0xab, 0xae, 
0xb0, 0xb3, 0xb6, 0xb9, 0xbc, 0xbf, 0xc1, 0xc4, 0xc7, 0xc9, 0xcc, 0xce, 0xd1, 0xd3, 0xd5, 0xd8, 
0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe4, 0xe6, 0xe8, 0xea, 0xec, 0xed, 0xef, 0xf0, 0xf2, 0xf3, 0xf4, 
0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfd, 0xfc, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8, 0xf7, 
0xf6, 0xf5, 0xf3, 0xf2, 0xf0, 0xef, 0xed, 0xec, 0xea, 0xe8, 0xe6, 0xe4, 0xe3, 0xe1, 0xde, 0xdc, 
0xda, 0xd8, 0xd6, 0xd3, 0xd1, 0xce, 0xcc, 0xc9, 0xc7, 0xc4, 0xc1, 0xbf, 0xbc, 0xb9, 0xb6, 0xb4, 
0xb1, 0xae, 0xab, 0xa8, 0xa5, 0xa2, 0x9f, 0x9c, 0x99, 0x96, 0x92, 0x8f, 0x8c, 0x89, 0x86, 0x83, 
0x80, 0x7d, 0x79, 0x76, 0x73, 0x70, 0x6d, 0x6a, 0x67, 0x64, 0x61, 0x5e, 0x5b, 0x58, 0x55, 0x52, 
0x4f, 0x4c, 0x49, 0x46, 0x43, 0x41, 0x3e, 0x3b, 0x39, 0x36, 0x33, 0x31, 0x2e, 0x2c, 0x2a, 0x27, 
0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x14, 0x12, 0x10, 0xf,  0xd,  0xc,  0xb , 
0x9,  0x8,  0x7,  0x6,  0x5,  0x4,  0x3,  0x3,  0x2,  0x1,  0x1,  0x0,  0x0,  0x0,  0x0,  0x0 , 
0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x1,  0x1,  0x2,  0x3,  0x3,  0x4,  0x5,  0x6,  0x7,  0x8 , 
0x9,  0xa,  0xc,  0xd,  0xe,  0x10, 0x12, 0x13, 0x15, 0x17, 0x18, 0x1a, 0x1c, 0x1e, 0x20, 0x23, 
0x25, 0x27, 0x29, 0x2c, 0x2e, 0x30, 0x33, 0x35, 0x38, 0x3b, 0x3d, 0x40, 0x43, 0x46, 0x48, 0x4b, 
0x4e, 0x51, 0x54, 0x57, 0x5a, 0x5d, 0x60, 0x63, 0x66, 0x69, 0x6c, 0x6f, 0x73, 0x76, 0x79, 0x7c, 
}; 
//三角波信号数据表
uchar code thr_tab[32]=
{
 0x00,0x0f,0x1f,0x2f,0x3f,0x4f,0x5f,0x6f,0x7f,0x8f,0x9f,0xaf,0xbf,0xcf,0xdf,0xef,
 0xff,0xef,0xdf,0xcf,0xbf,0xaf,0x9f,0x8f,0x7f,0x6f,0x5f,0x4f,0x3f,0x2f,0x1f,0x0f
};
//-------------------------------------------------------------------------------------------------------
//锯齿波信号数据表
uchar code jc_tab[33]=
{
 0x00,0x08,0x0f,0x18,0x1f,0x28,0x2f,0x38,0x3f,0x48,0x4f,0x58,0x5f,0x68,0x6f,0x78,
 0x7f,0x88,0x8f,0x98,0x9f,0xa8,0xaf,0xb8,0xbf,0xc8,0xcf,0xd8,0xdf,0xe8,0xef,0xf8,0xff
};
//数码管位选控制口定义
sbit LED4=P2^7;
sbit LED3=P2^6;
sbit LED2=P2^5;
sbit LED1=P2^4;
//按键口申明
sbit S1=P2^3;
sbit S2=P2^2;
sbit S3=P2^1;
unsigned char tabArry[4];	//保存显示数据
char flag=1;	//按键标志,当flag=1时表示没有按下,当flag=0时表示有按键按下
int keycount=0;	//按键计数
unsigned char waveth,wavetl;	//用于对定时器付值
unsigned int frecount=100;	//频率计数
unsigned int mbjs;	//码表计数,共采32个点
//毫秒延时程序
void delayms(int ms)
{
	uchar i;
    while(ms--)
	 {
	  	for(i=250;i>0;i--);
	 }
}

//键盘扫描
void keyscan()
{
	if(flag==1)
	{
		if(S3==0)	  	//用S3切换波形
		{	
			delayms(2);	//延时去抖
			if(S3==0)  	//按键计数,便于切换波形
			{
				flag=0;
				keycount++;
				if(keycount>=4) keycount=0;	   //四种波形计数4次
			}
		}		
	
		if(S2==0) 	//频率加1 处理
		{	
			delayms(2);
			if(S2==0)
			{
				flag=0;
				switch(keycount)
				{
					case 0:	 	//正弦波频率加1
						frecount++;
						if(frecount>1000) frecount=0;
						break;
					case 1:	  	//三角波频率加1
						frecount++;
						if(frecount>1000) frecount=0;
						break;
					case 2:		//锯齿波频率加1
						frecount++;
						if(frecount>1000) frecount=0;
						break;
					case 3:		//方波频率加1
						frecount++;
						if(frecount>1000) frecount=0;
						break;
				}
				waveth=(65536-57603/frecount)/256; //重新计算初值
				wavetl=(65536-57603/frecount)%256;		
			}
		}
		if(S1==0)	//频率减1 处理
		{	
			delayms(2);
			if(S1==0)
			{
				flag=0;
				switch(keycount)
				{
					case 0:		//正弦波频率减1
						frecount--;
						if(frecount<0) frecount=999;
						break;
					case 1:		//三角波频率减1
						frecount--;
						if(frecount<0) frecount=999;
						break;
					case 2:	 	//锯齿波频率减1
						frecount--;
						if(frecount<0) frecount=999;
						break;
					case 3:	 	//方波频率减1
						frecount--;
						if(frecount<0) frecount=999;
						break;
				}
				waveth=(65536-57603/frecount)/256; 	//重新计算初值
				wavetl=(65536-57603/frecount)%256; 					
			}
		}

	}	
	if(S1!=0 && S2!=0 && S3!=0) flag=1;	  //判断按键是否弹起
	
}
//数据分位
void change(char wavetype,unsigned int frequency)
{
	tabArry[0]=wavetype;	   	//显示字母,表示波形类型
	tabArry[1]=frequency%1000/100; 	//百位
	tabArry[2]=frequency%100/10;  	//十位
	tabArry[3]=frequency%10;		//个位
}
//显示函数
void display()
{

	switch(keycount)
	{
		case 0:	 			//显示A和正弦波的频率
			change(0x0a,frecount);
			break;
		case 1:				//显示b和三角波的频率
			change(0x0b,frecount);
			break;
		case 2:				//显示C和锯齿波的频率
			change(0x0c,frecount);
			break;
		case 3:				//显示d和方波的频率
			change(0x0d,frecount);
			break;
	}
	
	P0 = table[tabArry[0]];		//送最高位段码
	LED1=0;						//打开对应的位选控制口
	delayms(2);					//显示延时
	LED1=1;						//关闭对应的位选控制后显示下一位

	P0 = table[tabArry[1]];
	LED2=0;
	delayms(2);
	LED2=1;

	P0 = table[tabArry[2]];
	LED3=0;
	delayms(2);
	LED3=1;

	P0 = table[tabArry[3]];
	LED4=0;
	delayms(2);
	LED4=1;	
}
void Timerinit()
{
	TMOD=0x01; 	//定时器0方式1

	//定时器初值计算公式:X=65536-(T/T0)=65536-(f0/f/32)
	TH0=waveth=(65536-57603/frecount)/256;	 //定时器初值  22.1184MHz
	TL0=wavetl=(65536-57603/frecount)%256;
	EA=1;		//开总中断
	ET0=1;		//开定时器0中断
	TR0=1;		//定时器0开始计数
}
//主函数 
void main()
{
	Timerinit();	//定时器初始化
	while(1)
	{
		keyscan(); 	//扫描按键
		display();	//显示程序
	}	
}

void Timer0() interrupt 1
{
	TH0=waveth;	  //重新赋初值
	TL0=wavetl;
	if (keycount==0)  //输出正弦波
	{
		P1 = sin_tab[mbjs];
		mbjs+=8;		//256点,每隔8点输出一个数据
		if(mbjs>=256)
		{
			mbjs=0;
		}
	} 
	else if(keycount==1) //输出三角波
	{
		P1 = thr_tab[mbjs];
		mbjs++;
		if(mbjs>=32)
		{
			mbjs=0;
		}
	}
	else if(keycount==2) //输出锯齿波
	{
		P1 = jc_tab[mbjs];
		mbjs++;
		if(mbjs>=32)
		{
			mbjs=0;
		}
	} 
	else if(keycount==3)	//输出方波
	{
		mbjs++;
		if(mbjs>=32)
		{
			mbjs=0;
		}
		else if(mbjs<16) P1=0xff;
		else P1=0x00;

	}
}

⌨️ 快捷键说明

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