📄 fsk.c
字号:
#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; //串行数据
sbit SCLK = P0^4; //串行时钟
/*-----------------------------------------------------------------------------
AD9833数据传输格式:
对于单个16位数据来说,高位在前,低位在后。
对于频率寄存器和相位寄存器来说,先是控制字,再是数据低字节,最后是数据高字节。
-----------------------------------------------------------------------------*/
//定义AD9833的时钟
#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) //延时1ms程序
{ uint i,j;
for(i=0;i<time;i++)
{for(j=0;j<2640;j++); //延时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); //查询外部时钟是否稳定,若稳定,切换到外部时钟
CLKSEL=0x01; //选用外部晶振
}
void PORT_init (void)
{
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04;
XBR1 = 0x00;
XBR2 = 0x40; //交叉开关使能,:UART1的TX和RX不能连到两个端口引脚。
P0MDOUT|= 0xff;
P1MDOUT|= 0xff;
P2MDOUT|= 0xff;
P3MDOUT|= 0xff;
P4MDOUT|= 0xff; // 所有的 EMIF管脚都配置成推挽方式
P5MDOUT|= 0xff;
P6MDOUT|= 0xff;
P7MDOUT|= 0xff;
}
void T0_init(void) //定时器初始化,用来测定延时的时间
{
SFRPAGE =0x00;
TMOD=0X21; //方式1 65536
CKCON=0X18;
TF0=0;
TH0=0X00; //定时器0高字节
TL0=0X00; //定时器0低字节
IE|=0X02; //IE是中断允许寄存器 ,允许定时器0中断
IP|=0X02; //IP是中断优先级寄存器 ,定时器0中断为高优先级
}
void T0_ISR() interrupt 1
{ uint ch;
TF0=0; //该位可以用软件清0,但当CPU 转向定时器0中断服务程序时该位被自动清0。
ch++;
}
//-----------------------------------------------------------------------
//Write_word : 写16位数据到I/O接口,软件模拟片选,时钟信号。
//
//输入参数: datas: 数据(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; //时钟信号下降沿数据送入I/O口。
Delay(50) ;
SCLK=1;
datas=datas<<1; //16位数据从高位到低位送入
}
Delay(50) ;
FSYNC=1;
SCLK=0;
Delay(10) ;
}
void init_ad9833(void)
{
Write_word(0x2100); //28位连续,选择频率0,相位0,RESET=1 ; 配置控制寄存器
Write_word(0x4000); //写频率0寄存器的低字节LSB
Write_word(0x4000); //写频率0寄存器的高字节MSB
Write_word(0x2900); //28位连续,选择频率1,相位0,RESET=1
Write_word(0x8000); //写频率1寄存器的低字节LSB
Write_word(0x8000); //写频率1寄存器的高字节MSB
Write_word(0x2000); //28位连续,选择频率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; // 高字节
dds_hh =dds_h | 0x4000; // 写到频率0寄存器
dds_l=dds & 0x7FFF; //低字节
dds_ll= dds_l | 0x4000; // 写到频率0寄存器
Write_word(0x2000); //28位连续,选择频率0,相位0,RESET=0 控制字
Write_word(dds_ll); //数据低字节
Write_word(dds_hh); //数据高字节
}
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; // 高字节
dds_hh =dds_h | 0x8000; // 写到频率1寄存器
dds_l=dds & 0x3FFF; //低字节
dds_ll= dds_l | 0x8000; // 写到频率1寄存器
Write_word(0x2800); //28位连续,选择频率1,相位0,RESET=0,控制字
Write_word(dds_ll); //数据低字节
Write_word(dds_hh); //数据高字节
}
void lfm(void) //线性调频信号
{ unsigned int j;
for(j=6800;j<=7300;j++)
{ output0(j);
Delay_1ms(1) ; //延时1ms
}
}
void main(void)
{ uint i;
sysclk_init();
PORT_init ();
init_ad9833();
while(1)
{ //输出七位巴克码1110010 ,每个码元是100ms.
output1(7230);
Delay_1ms(300) ; // 延时300ms
output0(6830);
Delay_1ms(200) ; //延时200ms
output1(7230);
Delay_1ms(100) ; //延时100ms
output0(6830);
Delay_1ms(100) ; //延时100ms
//输出线性调频信号
lfm();
//输出16位信息码1010101010101010
for(i=0;i<8;i++)
{
output1(7230); //延时100ms
Delay_1ms(100) ;
output0(6830); //延时100ms
Delay_1ms(100) ;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -