- * AD9850.c *
- * AD9850的驅動程序C文件 *
- * Copyright (c)2009---MJC *
- * Free to Copy and Modify. *
- * Author:Worrior *
- * Date:2009-9-1 *
- ************************************************************/
- #include<intrins.h>
- #include "AD9850I.h"
- #include "lcd12864.h"
- //unsigned char freq[8]; //液晶顯示8種步進頻率值
- unsigned char freq[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
- /********************
- **函數:AD9850Reset
- **功能:AD9850的復位函數
- **作者:Worrior
- **日期:2009-9-1
- ********************/
- void AD9850Reset(void)
- {
- AD9850WCLK = 1;
- AD9850FQUD = 1;
- // AD9850ReSet = 0;
- // AD9850ReSet = 1;//復位腳置高電平(10個AD9850的時鐘周期)
- // _nop_();_nop_();_nop_();_nop_();_nop_();
- // _nop_();_nop_();_nop_();_nop_();_nop_();//延時,其實不用這么長
- // AD9850ReSet = 0;//復位完成,再拉低
- }
- /*步進按鍵函數*/
- void f10Mhz(void) //10Mhz步進
- {
- freq[0]=freq[0]+1;
- if(freq[0]>=10)
- {
- freq[0]=0;
- }
- display_led();
- }
- void f1Mhz(void) //1Mhz步進
- {
- freq[1]=freq[1]+1;
- if(freq[1]>=10)
- {
- freq[1]=0;
- }
- display_led();
- }
- void f100Khz(void) //100Khz步進
- {
- freq[2]=freq[2]+1;
- if(freq[2]>=10)
- {
- freq[2]=0;
- }
- display_led();
- }
- void f10Khz(void) //10Khz步進
- {
- freq[3]=freq[3]+1;
- if(freq[3]>=10)
- {
- freq[3]=0;
- }
- display_led();
- }
- void f1Khz(void) //1Khz步進
- {
- freq[4]=freq[4]+1;
- if(freq[4]>=10)
- {
- freq[4]=0;
- }
- display_led();
- }
- void f100Hz(void) //100hz步進
- {
- freq[5]=freq[5]+1;
- if(freq[5]>=10)
- {
- freq[5]=0;
- }
- display_led();
- }
- void f10Hz(void) //10hz步進
- {
- freq[6]=freq[6]+1;
- if(freq[6]>=10)
- {
- freq[6]=0;
- }
- display_led();
- }
- void f1Hz(void) //1hz步進
- {
- freq[7]=freq[7]+1;
- if(freq[7]>=10)
- {
- freq[7]=0;
- }
- display_led();
- }
- /***計算控制字************/
- /***入口:頻率數組指針***出口,控制字值*****/
- unsigned long jisuan(unsigned char data *fno)//*fno-0>freq[0...7]
- {
- unsigned long dds_no ;
- dds_no=
- (*(fno+7))*FF0+
- (*(fno+6))*FF1+
- (*(fno+5))*FF2+
- (*(fno+4))*FF3+
- (*(fno+3))*FF4+
- (*(fno+2))*FF5+
- (*(fno+1))*FF6+
- (*fno)*FF7 ;
- return(dds_no);
- }
- /********************
- **函數:AD9850SetFre
- **功能:AD9850設定頻率控制字函數
- **參數:Fre,float型,要設定的頻率,單位Hz
- **作者:Worrior
- **日期:2009-9-1
- ********************/
- void AD9850ISetFre()
- {
- unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
- unsigned char part1,part2,part3,part4;
- FTW=jisuan(freq);
- // if(FTW > 30000000)
- // FTW = 30000000;
- // FTW = (unsigned long) (Fre * AD9850_125M);//計算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
- /*以下將32位頻率控制字分解*/
- part1 = (unsigned char) (FTW>>24);//取32~25位
- part2 = (unsigned char) (FTW>>16);//取24~17位
- part3 = (unsigned char) (FTW>>8); //取16~9位
- part4 = (unsigned char) (FTW); //取8~1位
- /*以上將32位頻率控制字分解*/
- AD9850FQUD = 1;
- AD9850WCLK = 1;
- AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part1;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part2;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part3;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part4;
- AD9850WCLK = 0;//AD9850WCLK上升沿送數據
- _nop_();
- AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區的40位數據送入DDS Core
- }
- /********************
- **函數:AD9850SetFre
- **功能:AD9850設定頻率控制字函數
- **參數:Fre,float型,要設定的頻率,單位Hz
- **作者:Worrior
- **日期:2009-9-1
- ********************/
- void AD9850IISetFre(float Fre)
- {
- unsigned long FTW = 0;//要寫入的32位頻率控制字(AD9850一次需要寫入40位控制字)
- unsigned char part1,part2,part3,part4;
- if(Fre > 30000000)
- Fre = 30000000;
- FTW = (unsigned long) (Fre * 34.3597384);//計算頻率控制字(公式:FTW=(2^32/fosc)*Fre)
- /*以下將32位頻率控制字分解*/
- part1 = (unsigned char) (FTW>>24);//取32~25位
- part2 = (unsigned char) (FTW>>16);//取24~17位
- part3 = (unsigned char) (FTW>>8); //取16~9位
- part4 = (unsigned char) (FTW); //取8~1位
- /*以上將32位頻率控制字分解*/
- AD9850FQUD = 1;
- AD9850WCLK = 1;
- AD9850DATAPORT = 0x00;//寄存器最高的八位只送0x00
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part1;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part2;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part3;
- AD9850WCLK = 0;//WCLK上升沿送數據
- _nop_();
- AD9850WCLK = 1;
- AD9850DATAPORT = part4;
- AD9850WCLK = 0;//AD9850WCLK上升沿送數據
- _nop_();
- AD9850FQUD = 0;//AD9850FQUD上升沿將AD9850緩沖區的40位數據送入DDS Core
- }
[color=rgb(51, 102, 153) !important]復制代碼
主程序:
- #include <reg52.h>
- #include "AD9850I.h"
- #include "hs0038.h"
- #include "lcd12864.h"
- void main()
- {
- hs0038_init(); //HS0038初始化,使用了外部中斷0///定時器1
- lcd12864_init();
- AD9850Reset();
- while(1)
- {
- Get_Ircode_And_Dis();
- switch (ircode[2])
- { /**************模式選擇****************/
- case 0x07:xuanzekey();break;
- case 0x15:quedingkey();break;
- case 0x09:fanhuikey();break;
- /*************頻率調整區***************/
- case 0x0c:if(flag1==1) {f10Mhz();}; break;
- case 0x18:if(flag1==1) {f1Mhz(); };break;
- case 0x5e:if(flag1==1) {f100Khz();};break;
- case 0x08:if(flag1==1) {f10Khz(); };break;
- case 0x1c:if(flag1==1) {f1Khz(); } ;break;
- case 0x5a:if(flag1==1) {f100Hz();} ;break;
- case 0x42:if(flag1==1) {f10Hz(); } ;break;
- case 0x52:if(flag1==1) {f1Hz(); } ;break;
- /***************頻率確認***************/
- case 0x4a: if(flag1==1)
- {
- pce1=0;
- pce2=1;
- pce3=1;
- AD9850ISetFre();
- };
- break;
- /***************AM調制*********************/
- case 0x16: pce1=1; //片選AD9850 I 實驗板U1
- pce2=0; //片選AD9850 I 實驗板U2
- pce3=1;
- AD9850IISetFre(1000.0);break;
- case 0x44:if(flag2==1)
- {
- pce1=1;
- pce2=1;
- pce3=0;
- pwr=0;
- AM_mastepdown();
- };
- break;
- case 0x40: if(flag2==1)
- {
- pce1=1;
- pce2=1;
- pce3=0;
- pwr=0;
- AM_mastepup();
- };
- break;
- /***************FM調制*********************/
- case 0x19:AD9850IISetFre(5000.0);break;
- default:break;
- }
- ircode[2]=0; //注意一定要把ircode[2]清零。。。。。
- // AD9850SetFre();
- }
- }
|