?? fsk.c
字號(hào):
#include <c8051f060.h>
#include <intrins.h>
#include "func.h"
typedef unsigned int uint;
typedef unsigned char uchar;
sbit FSYNC = P0^7; //片選
sbit SDATA = P0^5; //串行數(shù)據(jù)
sbit SCLK = P0^4; //串行時(shí)鐘
/*-----------------------------------------------------------------------------
AD9833數(shù)據(jù)傳輸格式:
對(duì)于單個(gè)16位數(shù)據(jù)來(lái)說(shuō),高位在前,低位在后。
對(duì)于頻率寄存器和相位寄存器來(lái)說(shuō),先是控制字,再是數(shù)據(jù)低字節(jié),最后是數(shù)據(jù)高字節(jié)。
-----------------------------------------------------------------------------*/
//定義AD9833的時(shí)鐘
#define FMCLK 10000000 //AD9833的主晶振為10MHz
void PORT_init (void);
void sysclk_init(void);
void T0_init(void);
void Delay(unsigned char times);
void Delay_1ms(unsigned int time);
void Write_word(unsigned int datas);
void init_ad9833(void);
void output0(unsigned long freq_value0);
void output1(unsigned long freq_value1);
void lfm(void);
void Delay(unsigned char times)
{
unsigned int i;
for(i=0;i<times;i++)_nop_();
}
void Delay_1ms(uint time) //延時(shí)1ms程序
{ uint i,j;
for(i=0;i<time;i++)
{for(j=0;j<2640;j++); //延時(shí)1ms,
}
}
void sysclk_init(void)
{
int n;
WDTCN=0xDE;
WDTCN=0xAD;
SFRPAGE = 0x0f;
OSCXCN=0x67; //配置為外部石英晶振模式
for (n=0;n<256;n++); //等待1ms
while ((OSCXCN&0x80)==0); //查詢外部時(shí)鐘是否穩(wěn)定,若穩(wěn)定,切換到外部時(shí)鐘
CLKSEL=0x01; //選用外部晶振
}
void PORT_init (void)
{
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04;
XBR1 = 0x00;
XBR2 = 0x40; //交叉開(kāi)關(guān)使能,:UART1的TX和RX不能連到兩個(gè)端口引腳。
P0MDOUT|= 0xff;
P1MDOUT|= 0xff;
P2MDOUT|= 0xff;
P3MDOUT|= 0xff;
P4MDOUT|= 0xff; // 所有的 EMIF管腳都配置成推挽方式
P5MDOUT|= 0xff;
P6MDOUT|= 0xff;
P7MDOUT|= 0xff;
}
void T0_init(void) //定時(shí)器初始化,用來(lái)測(cè)定延時(shí)的時(shí)間
{
SFRPAGE =0x00;
TMOD=0X21; //方式1 65536
CKCON=0X18;
TF0=0;
TH0=0X00; //定時(shí)器0高字節(jié)
TL0=0X00; //定時(shí)器0低字節(jié)
IE|=0X02; //IE是中斷允許寄存器 ,允許定時(shí)器0中斷
IP|=0X02; //IP是中斷優(yōu)先級(jí)寄存器 ,定時(shí)器0中斷為高優(yōu)先級(jí)
}
void T0_ISR() interrupt 1
{ uint ch;
TF0=0; //該位可以用軟件清0,但當(dāng)CPU 轉(zhuǎn)向定時(shí)器0中斷服務(wù)程序時(shí)該位被自動(dòng)清0。
ch++;
}
//-----------------------------------------------------------------------
//Write_word : 寫(xiě)16位數(shù)據(jù)到I/O接口,軟件模擬片選,時(shí)鐘信號(hào)。
//
//輸入?yún)?shù): datas: 數(shù)據(jù)(16位)
//-----------------------------------------------------------------------
void Write_word(unsigned int datas)
{
unsigned char i;
//unsigned int datas_l,datas_h;
// datas_l=datas&0x00FF;
// datas_h=datas>>8;
SCLK =1;
FSYNC=1;
Delay(100) ;
FSYNC=0; //片選有效
for(i=0;i<16;i++)
{
SDATA=datas&0x8000;
SCLK=0; //時(shí)鐘信號(hào)下降沿?cái)?shù)據(jù)送入I/O口。
Delay(50) ;
SCLK=1;
datas=datas<<1; //16位數(shù)據(jù)從高位到低位送入
}
Delay(50) ;
FSYNC=1;
SCLK=0;
Delay(10) ;
}
void init_ad9833(void)
{
Write_word(0x2100); //28位連續(xù),選擇頻率0,相位0,RESET=1 ; 配置控制寄存器
Write_word(0x4000); //寫(xiě)頻率0寄存器的低字節(jié)LSB
Write_word(0x4000); //寫(xiě)頻率0寄存器的高字節(jié)MSB
Write_word(0x2900); //28位連續(xù),選擇頻率1,相位0,RESET=1
Write_word(0x8000); //寫(xiě)頻率1寄存器的低字節(jié)LSB
Write_word(0x8000); //寫(xiě)頻率1寄存器的高字節(jié)MSB
Write_word(0x2000); //28位連續(xù),選擇頻率0,相位0,RESET=0
}
void output0(unsigned long freq_value0)
{
unsigned long dds,M;
unsigned int dds_l,dds_ll,dds_h,dds_hh;
M=268435456;
// dds=freq_value0*M/FMCLK;
dds=freq_value0*26.8435456 ; //dds是頻率控制字
dds_h=dds>>14; // 高字節(jié)
dds_hh =dds_h | 0x4000; // 寫(xiě)到頻率0寄存器
dds_l=dds & 0x7FFF; //低字節(jié)
dds_ll= dds_l | 0x4000; // 寫(xiě)到頻率0寄存器
Write_word(0x2000); //28位連續(xù),選擇頻率0,相位0,RESET=0 控制字
Write_word(dds_ll); //數(shù)據(jù)低字節(jié)
Write_word(dds_hh); //數(shù)據(jù)高字節(jié)
}
void output1(unsigned long freq_value1)
{
unsigned long dds,M;
unsigned int dds_l,dds_ll,dds_h,dds_hh;
M=268435456;
// dds=freq_value0*M/FMCLK;
dds=freq_value1*26.8435456 ; //dds是頻率控制字 268435456/ FMCLK
dds_h=dds>>14; // 高字節(jié)
dds_hh =dds_h | 0x8000; // 寫(xiě)到頻率1寄存器
dds_l=dds & 0x3FFF; //低字節(jié)
dds_ll= dds_l | 0x8000; // 寫(xiě)到頻率1寄存器
Write_word(0x2800); //28位連續(xù),選擇頻率1,相位0,RESET=0,控制字
Write_word(dds_ll); //數(shù)據(jù)低字節(jié)
Write_word(dds_hh); //數(shù)據(jù)高字節(jié)
}
void lfm(void) //線性調(diào)頻信號(hào)
{ unsigned int j;
for(j=6800;j<=7300;j++)
{ output0(j);
Delay_1ms(1) ; //延時(shí)1ms
}
}
void main(void)
{ uint i;
sysclk_init();
PORT_init ();
init_ad9833();
while(1)
{ //輸出七位巴克碼1110010 ,每個(gè)碼元是100ms.
output1(7230);
Delay_1ms(300) ; // 延時(shí)300ms
output0(6830);
Delay_1ms(200) ; //延時(shí)200ms
output1(7230);
Delay_1ms(100) ; //延時(shí)100ms
output0(6830);
Delay_1ms(100) ; //延時(shí)100ms
//輸出線性調(diào)頻信號(hào)
lfm();
//輸出16位信息碼1010101010101010
for(i=0;i<8;i++)
{
output1(7230); //延時(shí)100ms
Delay_1ms(100) ;
output0(6830); //延時(shí)100ms
Delay_1ms(100) ;
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -