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

📄 dds_main.c

📁 8051控制的DDS信号发生器AD8950(KEIL C)
💻 C
字号:
#include <absacc.h>
#include <AT89x051.H>
#include <INTRINS.H>

#include "DDS.h"

//晶体为12MHZ
uchar    mucTime5ms;
uchar    mucTime100ms;
uchar    mucTime1s;
//uchar    mucTime60s;

uchar    muc1msDelay;
uchar    muc100msDelay;
uchar    muc1sDelay;
uchar    muc60sDelay;

uchar	mucFlashBit;
ulong	mulFreq;
uchar     mucInputNumber[MAX_INPUT_NUMBERS];
bit		mbDispUpdateFlag;
bit		mbFreqUpdateFlag;

//12MHz晶振
//i  delay time/us
//1  5
//2  7
//3  9
void delay_3add_2i_us(unsigned char i)
{
	while(--i);
}
//i  delay time/us
//0  6+4
//1  12
//2  18
/*
void delay_6us(unsigned char i)
{
for(; i != 0; i--);
}
*/

//定时器0中断延时n*1ms,最大值为256ms
void delay_ms(uchar n)
{
 	for(muc1msDelay=0;muc1msDelay<n;);
}
//定时器0延时n*100ms,最大值为25600ms=25.6s
void delay_100ms(uchar n)
{
 	for(muc100msDelay=0;muc100msDelay<n;);
}
/*
//定时器0延时n*1s,最大值为256s=约4.27分钟
void delay_1s(uchar n)
{
 	for(muc1sDelay=0;muc1sDelay<n;);
}
*/
void init_device(void)
{
	//晶体为12MHZ
	//定时器0工作在方式1,作为16位定时器
	TMOD=0x01;
    	TL0=-(5000%256);//5ms中断一次
    	TH0=-(5000/256);
    	TR0=1;		//启动定时器0
    	ET0=1;     	//允许定时器0中断
	EA=1;
	mucTime5ms=0;            //5毫秒计数器
	mucTime100ms=0;          //100毫秒计数器
	mucTime1s=0;             //秒计数器
}
//晶体为11.0592MHZ
void time0(void) interrupt 1 using 1
{
	//TL0=0x00;	//定时器0时常数为50mS
    	//TH0=0x4C;
    	TL0=-(4608%256);//5ms中断一次
    	TH0=-(4608/256);
	mucTime5ms++;
	muc1msDelay+=5;
	if(mucTime5ms>=20)
	{
		mucTime5ms=0;
		mucTime100ms++;
		muc100msDelay++;
		if(mucTime100ms>=10)
		{
			mucTime100ms=0;
			//mucTime1s++;
			muc1sDelay++;
			/*if(mucTime1s>=60)
			{
				mucTime1s=0;
				mucTime60s++;
			}*/
		}
	}
}
/*
void write_freq(void)
{
	uchar i;
	ulong ulDDSWord;
	ulong ulTemp;
	uchar ucTemp;
	ulDDSWord=(float)mulFreq*65536/DDS_CLK_IN*65536;
	DDS_UPDATE=0;
	for(i=0;i<32;i++)
	{
		DDS_CLK=0;
		ulTemp=ulDDSWord>>i;
		ucTemp=(uchar)(ulTemp&0x1);
		if(ulTemp)	DDS_DATA=1;
		else 		DDS_DATA=0;
		DDS_CLK=1;
	}
	for(i=0;i<8;i++)
	{
		DDS_CLK=0;
		DDS_DATA=0;
		DDS_CLK=1;
	}
	DDS_UPDATE=1;
	DDS_CLK=0;
	DDS_UPDATE=0;
}
*/

void DDS_set_freq (void)
{
	unsigned char byte_temp;
	unsigned long freq_word =0x0505AAFF ;//频率控制字
	float    fTemp;
	fTemp=mulFreq;
	fTemp=fTemp*65536/DDS_CLK_IN*65536;
	freq_word =fTemp;
	//freq_word =(float)mulFreq*65536/DDS_CLK_IN*65536;

	_nop_(); _nop_(); _nop_(); _nop_();
	DDS_UPDATE = 0;
	_nop_(); _nop_(); _nop_(); _nop_();
	DDS_CLK = 0;
	_nop_(); _nop_(); _nop_(); _nop_();

	for ( byte_temp = 0; byte_temp < 32; byte_temp++ )
	{
		freq_word = freq_word >> 1;
		DDS_DATA = CY;
		DDS_CLK = 1;
		_nop_(); _nop_(); _nop_(); _nop_(); //实际应用应在延迟
		DDS_CLK = 0;
	}
	for ( byte_temp = 0; byte_temp < 8; byte_temp++ )
	{
		DDS_DATA = 0;
		DDS_CLK = 1;
		_nop_(); _nop_(); _nop_(); _nop_();
		DDS_CLK = 0;
	}

	DDS_UPDATE = 1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DDS_UPDATE = 0;
}

void init_dds(void)
{
	DDS_RESET=0;
	delay_3add_2i_us(2);
	DDS_RESET=1;
	delay_3add_2i_us(2);
	DDS_RESET=0;

	DDS_DATA=0;
	DDS_CLK=0;
	DDS_UPDATE=0;
	DDS_UPDATE=1;
	DDS_UPDATE=0;

	DDS_CLK=1;
	DDS_CLK=0;
	DDS_UPDATE=1;
	DDS_UPDATE=0;

	mulFreq=0;
	DDS_set_freq();
}


void write_disp_command(uint uiWord)
{
	uchar i;
	//uchar ucTemp;
	DISP_LOAD=0;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	for(i=0;i<12;i++)
	{
		DISP_CLK=0;
		uiWord=uiWord>>1;
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
		DISP_DATA=CY;
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
		DISP_CLK=1;//上升沿写入数据
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();		
	}
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DISP_LOAD=1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DISP_CLK=0;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DISP_DATA=0;
}

void disp_Led(uchar ucLedNo,uchar ucDispNumberBCD)
{
	uint uiDispCode;
	uiDispCode=ucLedNo+8;
	uiDispCode<<=8;
	uiDispCode+=ucDispNumberBCD;
	write_disp_command(uiDispCode);
}
void init_disp(void)
{
	//使能串行接口
	DISP_DATA=1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
	DISP_DATA=0;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();	
	DISP_DATA=1;
	//芯片内部复位
	write_disp_command(0x201);
	//只启用显示驱动
	write_disp_command(0x401);
	//设定显示参数:BCD
	write_disp_command(0x58A);
	//下面写数码管对应数据
	disp_Led(7,8);
	disp_Led(6,8);
	disp_Led(5,8);
	disp_Led(4,8);
	disp_Led(3,8);
	disp_Led(2,8);
	disp_Led(1,8);
	disp_Led(0,8);
}
void flash_led(uchar ucLedNo)
{
	uint uiDispCode;
	uiDispCode=6;
	uiDispCode<<=8;
	if(ucLedNo<8)	uiDispCode+=(1<<ucLedNo);
	write_disp_command(uiDispCode);
}
void value_to_bcd(void)
{
	uchar i;
	ulong ulFreq;
	ulFreq=mulFreq;
	for(i=0;i<MAX_INPUT_NUMBERS;i++)
	{
		mucInputNumber[MAX_INPUT_NUMBERS-1-i]=ulFreq%10;
		ulFreq/=10;
	}
}
void disp_freq(void)
{
	value_to_bcd();
	disp_Led(7,mucInputNumber[7]);
	disp_Led(6,mucInputNumber[6]);
	disp_Led(5,mucInputNumber[5]);
	disp_Led(4,mucInputNumber[4]);
	disp_Led(3,mucInputNumber[3]);
	disp_Led(2,mucInputNumber[2]);
	disp_Led(1,mucInputNumber[1]);
	disp_Led(0,mucInputNumber[0]);
}
void get_freq(void)
{
	uchar i;
	ulong ulFreq;
	ulFreq=0;
	for(i=0;i<MAX_INPUT_NUMBERS;i++)
	{
		ulFreq*=10;
		ulFreq+=mucInputNumber[i];
	}
	mulFreq=ulFreq;
}
void number_add(void)
{
	uchar ucTemp;
	mbFreqUpdateFlag=TRUE;
	mbDispUpdateFlag=TRUE;
	ucTemp=mucInputNumber[mucFlashBit];
	if(ucTemp==9)	ucTemp=0;
	else			ucTemp++;
     if(mucFlashBit==0 &&  ucTemp>2)  ucTemp=0;
	mucInputNumber[mucFlashBit]=ucTemp;
	get_freq();
}
void number_dec(void)
{
	uchar ucTemp;
	mbFreqUpdateFlag=TRUE;
	mbDispUpdateFlag=TRUE;
	ucTemp=mucInputNumber[mucFlashBit];
	if(ucTemp==0)
     {
     	if(mucFlashBit==0)  ucTemp=2;
          else                ucTemp=9;
     }
	else			ucTemp--;
	mucInputNumber[mucFlashBit]=ucTemp;
	get_freq();
}

uchar key_scan(void)
{
	uchar ucKey;
	//按键接在P3.2,P3.3,P3.4,P3.5
	P3=0x3c;
	ucKey=P3&0x3c;
	if(ucKey!=0x3c)
	{
		delay_ms(20);
		ucKey=P3&0x3c;
	}
	if(ucKey==0x3c)	ucKey=KEY_NULL;
	return ucKey;
}
void key_process(uchar ucKey)
{
	mbDispUpdateFlag=FALSE;
	mbFreqUpdateFlag=FALSE;
	switch(ucKey)
	{
		case KEY_LEFT:
			if(mucFlashBit==MAX_INPUT_NUMBERS)	mucFlashBit=0;
			else 						mucFlashBit++;
			flash_led(mucFlashBit);
			//mbDispUpdateFlag=TRUE;
			break;
		case KEY_RIGHT:
			if(mucFlashBit==0)	mucFlashBit=MAX_INPUT_NUMBERS;
			else 			mucFlashBit--;
			flash_led(mucFlashBit);
			//mbDispUpdateFlag=TRUE;
			break;
		case KEY_UP:
			if(mucFlashBit!=MAX_INPUT_NUMBERS)		number_add();
			break;
		case KEY_DOWN:
			if(mucFlashBit!=MAX_INPUT_NUMBERS)		number_dec();
			break;
	}
	if(mbDispUpdateFlag==TRUE)	disp_freq();
	if(mbFreqUpdateFlag==TRUE)
	{
		//write_freq();
		DDS_set_freq();
	}
	delay_100ms(3);
}

void main(void)
{
	uchar  ucKey;
	//SP=0x60;
	init_device();
	delay_100ms(20);
	init_dds();
	init_disp();
	mulFreq=5000000;//20KHz
	value_to_bcd();
	mucFlashBit=3;
	//flash_led(mucFlashBit);
	disp_freq();
	//write_freq();
	DDS_set_freq();
	while(1)
	{
		ucKey=key_scan();
		if(ucKey!=KEY_NULL)	key_process(ucKey);
	}
}


/*1
void main(void)
{
	init_device();
	delay_100ms(20);
	while(1)
	{
		//P3_0=1;P3_1=1;P3_2=1;P3_3=1;P3_4=1;P3_5=1;P3_7=1;
		//P3_0=0;P3_1=0;P3_2=0;P3_3=0;P3_4=0;P3_5=0;P3_7=0;
		P1_0=1;P1_1=1;P1_2=1;P1_3=1;P1_4=1;P1_5=1;P1_6=1;P1_7=1;
		P1_0=0;P1_1=0;P1_2=0;P1_3=0;P1_4=0;P1_5=0;P1_6=0;P1_7=0;
		//P1=1;
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
		//P3=0;
		//P1=0;
		_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
		//delay_ms(2);
	}
}
*/

⌨️ 快捷键说明

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