(分享资料)17年电赛 远程幅频特性测试装置 (H题)基础部分-- 用ADS9834做频率输出-资源有点少 补充补充
单片机源程序如下:
AD9834.h文件:
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- #define AD_9834_DIR P3DIR
- #define FSYNC_H P3OUT |= BIT0//输入数据的帧同步信号,为低时载入新的字节
- #define FSYNC_L P3OUT &= ~BIT0
- #define SCLK_H P3OUT |= BIT1//串行时钟输入,每个下降沿写入一位数据
- #define SCLK_L P3OUT &= ~BIT1
- #define SDATA_H P3OUT |= BIT2//数据串口输入端
- #define SDATA_L P3OUT &= ~BIT2
- long freq=1000000;
- long kuandu;
- long zhongxin;
- /**************初始化**************************/
- void AD_9834_init()
- {
- AD_9834_DIR |= BIT0 + BIT1 +BIT2;//设置为输出
- FSYNC_H;
- SCLK_H;
- SDATA_H;
- }
- /*********向9834写入16位频率数据***********************/
- void write_AD9834(uint dat)
- {
- uchar i;
- FSYNC_H;
- SCLK_H;
- _NOP();
- _NOP();
- FSYNC_L; //FSYNC拉低时,SCLK必须为高
- for(i=0;i<16;i++)//16位数据写入
- {
- SCLK_H; //先置高为下降沿做准备
- if(dat & 0x8000)
- {
- SDATA_H;//写入
- }
- else
- {
- SDATA_L;//不写入
- }
- SCLK_L; //下降沿向dds写入数据
- dat <<= 1;
- }
- _NOP();
- FSYNC_H; //传输完数据置高
- }
- /***********正弦波频率设置******************/
- //寄存器为28位,所以分高14位低14位写入
- void AD_9834_output(ulong freq)
- {
- ulong dds;
- uint dds_l,dds_h;
- //dds = (long)(freq * 1.7895697666); //150M晶振 **** 2^28/150M=1.7895697666
- //ΔPhase=f×2^28/fMCLK 一共28位所以2的28次方
- // dds = (long)(freq * 2.147483648); //125m晶振
- dds = (long)(freq * 2.68435456); //100m晶振
- // dds = (long)(freq * 3.579139413); //75M晶振;
- //dds = (long)(freq * 11.184810); //24m晶振
- dds_l =(uint)(dds & 0x3fff); //取出数据的低十四位(LSB)11 1111 1111 1111
- dds = dds >>14; //将MSB的高十四位移到低十四位
- dds_h = (uint)(dds &0x3fff); //取出MSB的十四位数据
- /*****16位码的前两位规定频率寄存器的字节写入,在两个连续的写操作是一样的*********************/
- dds_l = dds_l | 0x4000; //对十四位的LSB/MSB加上两位的地址(01),所以变成
- dds_h = dds_h | 0x4000; //了是十六位的数据(地址01是频率寄器0,10是频率寄存器1)
- write_AD9834(dds_l); //写入低14位
- write_AD9834(dds_h); //写入高14位
- }
复制代码
- #include<msp430F5438A.h>
- #include"TX2.h"
- #include"AD9834.h"
- #include"12864.h"
- #include"key.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- //void display(void);
- void main(void)
- {
- WDTCTL = WDTPW + WDTHOLD;
- P9DIR |= 0x0f; //P9方向寄存器
- P8DIR |= 0xff; //P9输出寄存器
- LCD_init(); //液晶初始化
- LCD_display();
- keyscan1_init();
- initclock();
- AD_9834_init();
- write_AD9834(0x2100);//控制寄存器
- write_AD9834(0x2038);//这里很关键!!
- /*9834的控制寄存器是16位 0x2000(01 0000 0000 0000)表示bit13为1
- 即允许一个完整字节在两个连续的写操作写入频率寄存器。第一次写操作包括
- 14LSBs的频率字节,下一个写操作包括14MSBs*/
- AD_9834_output(freq);
-
-
- while(1)
- {
- KEY_Fun();
- if(flag_key==1)
- {
-
- freq += 1000000;
- delay_ms(1000);
- AD_9834_output(freq);//把频率写入频率寄存器
- if(freq>40000000)
- for(;freq>1000000;)
- {
- freq -= 1000000;
- delay_ms(1000);
- AD_9834_output(freq);//把频率写入频率寄存器
- }
-
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
17年电赛 远程幅频特性测试装置 (H题)基础部分.rar
(36.85 KB, 下载次数: 99)
|