📄 dds_f005.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 + -