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

📄 dds_f005.c

📁 用F005单片机实现DDS功能
💻 C
字号:
//用F005单片机模拟DDS,作两相正弦波发生器
//利用51核作为相位累加器,T2溢出作为定时中断,每次中断相位累加器加一个值,取低10位作为正弦表地址
//查表输出两路DAC正弦波形
//定时时基周期1/11.0592 us,20us中断需要220个周期,
//FTW=(期望频率*2^N)/sysclk,其中N为相位累加器位数16(int型数据加法)
//FTW=1对应输出频率98.2hz
//分别用DAC0和DAC1输出不同相位波形,
//若DAC0为基准相位0,则DAC1输出相位=PHW ,
//PHW=1对应360/1024=0.35度
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------

#include <c8051f000.h>                 // SFR declarations
#include <math.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
//定义4 个键的键值

#define SYSCLK             11059200  // SYSCLK in Hz (16 MHz internal
                                       // oscillator)
                                      // the internal oscillator has a
                                       // tolerance of +/- 20%
uint FTW=1;		//FTW=1对应输出频率98.2hz
uint PHA=100; 	//PHW=1对应360/1024=0.35度
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------

sbit addr0	= P1^0;
sbit addr1	= P1^1;
sbit addr2	= P1^2;
sbit addr3	= P1^3;
sbit addr4	= P1^4;

sbit wr		= P1^6;
sbit re     = P1^5;
sbit rd     = P1^7;

sbit data0	= P2^0;
sbit data1	= P2^1;
sbit data2	= P2^2;
sbit data3	= P2^3;
sbit lcd_en = P3^0;

sbit test	= P0^0;

uint xdata sinecode[1024];
int n,m,l;

void OSCILLATOR_Init (void);           
void PORT_Init (void);
void sine(void);
void delay(int time_ms);
void Timer2_Init (void);               // Timer2 initialization routine
void T2_ISR(void);
void DAC0_1_Init(void);
int n,m,l;
int acc=0; 

//-----------------------------------------------------------------------------
// main() Routine
//-----------------------------------------------------------------------------

void main (void)
{
  
//   reset=0;
   WDTCN = 0xde;                       // Disable watchdog timer
   WDTCN = 0xad;
   OSCILLATOR_Init ();                 // Initialize Oscillator
   PORT_Init();                        // Initialize Port I/O
   sine();
   Timer2_Init();
   DAC0_1_Init();
	DAC0H=0xf0;
	DAC0H=0xe0;
	DAC0H=0xd0;
	DAC0H=0xc0;

    EA = 1; 
	
   while (1)
   {	  	
 

  }                         // end of while(1)
}   
void T2_ISR(void) interrupt  5
{  
	uint  temp;
	TF2=0;						//必须软件清零
	test ^= 1;				   	//测试中断频率,观察P0^0信号频率
   
	acc+=FTW;
	temp=sinecode[acc & 0xfff];//基准波形
	DAC0L=temp&0x00ff;
	temp>>=8;
	DAC0H=temp;

	temp=sinecode[(acc & 0xfff)+PHA];//基准波形
	DAC1L=temp&0x00ff;
	temp>>=8;
	DAC1H=temp;
    
  
}
//产生1024点数据,12位精度
void sine(void)
{
  uint data y;
  uint data i;
  for(i=0;i<1024;i++)
  {
    y=sin(3.1415*2*i/1024)*2048+2048;
	if(y>4095) y=4095;
	sinecode[i]=y;
  }
}                                  // end of main()
void DAC0_1_Init (void)
{
   
   REF0CN = 0x03;
   DAC0CN |= 0x80; 			//DAC0使能	
   DAC1CN |= 0x80;			//DAC1使能	
   
}
//-----------------------------------------------------------------------------
// Timer2_Init 允许T2中断,T2 16位重装载定时器,定时时基周期1/11.0592 us,20US=65536-110/2=0xff92
//-----------------------------------------------------------------------------

void Timer2_Init(void)				//P149
{
   CKCON = 0x20;                     // Timer2 uses SYSCLK  参考P151 CKCON

   T2CON=0x04;						 //Enable Timer2 in 16BITS Reload Mode
   TL2=0Xae;
   TH2=0Xfb;							//T2 定时55个时钟周期溢出,TH2放置重装载计数值

    RCAP2H=0Xff;
	RCAP2L=0X92;
   ET2 = 1;                         // Timer2 interrupt enabled
  
    
}



void OSCILLATOR_Init (void)//p104
{
	OSCXCN=0x67;							
	OSCICN = 0x08;      
   while ( (OSCXCN &= 0xff) ==0); 			//外部晶振没正常则等待
  	
	OSCXCN=0x67;					//配置为外部晶振,大于6M,如果77则为外部晶振的1/2		
	OSCICN = 0x08;                  // 选择外部晶振,禁止内部振荡器

 //	OSCICN |= 0x03;                     // Configure internal oscillator for
 //	OSCXCN=0xff;                        // its maximum frequency (24.5 Mhz)

}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
   PRT0CF  |= 0xff; 
   PRT1CF  |= 0xff;                     
   PRT2CF  |= 0xff;                     // P1,P2 is push-pull

                                 
   P1     |= 0xa0;                     // Set P1.7 latch to '1'(read CPLD when P1.7=0)
   XBR0    = 0x00;
   XBR1    = 0x00;
   XBR2    = 0x40;                     // Enable crossbar and enable
                                       // weak pull-ups
}

⌨️ 快捷键说明

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