找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6237|回复: 7
打印 上一主题 下一主题
收起左侧

AD9854原理图与单片机驱动程序设计

[复制链接]
跳转到指定楼层
楼主

AD9854原理图如下(pdf文档清晰版请下载附件):


AD9854单片机源程序如下:
  1. //=====================================================================
  2. //                    AD9854 驱动程序设计
  3. //AD9854.c
  4. //说明:10MHZ 有源晶振
  5. //=====================================================================
  6. #include <reg52.h>
  7. #include <lcd1602.h>       
  8. #include <intrins.h>   

  9. sfr P4 = 0xC0;        //1111,1111 端口4

  10. sbit KEY1 = P3^5;
  11. sbit KEY2 = P3^4;
  12. sbit KEY3 = P3^3;
  13. sbit KEY4 = P3^2;

  14. unsigned char FreqWord[6];                                 //6个字节频率控制字

  15. /*
  16.       CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ
  17.       Freq_mult_unsigned long和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型
  18. */

  19. #define      CLK_Set            20
  20. const unsigned long  Freq_mult_ulong  = 1407375;
  21. const double Freq_mult_doulle = 1407374.88355328;


  22. //**************************修改硬件时要修改的部分********************************

  23. #define AD9854_DataBus P2
  24. #define AD9854_AdrBus  P0

  25. sbit AD9854_RST    = P3^6;   //AD9854复位端口
  26. sbit AD9854_UDCLK  = P3^7;   //AD9854更新时钟
  27. sbit AD9854_WR     = P4^1;   //AD9854写使能,低有效
  28. sbit AD9854_RD     = P4^2;   //AD9854读使能,低有效
  29. sbit AD9854_FDATA  = P4^3;   //AD9854 FSK,PSK控制
  30. sbit AD9854_OSK    = P4^4;   //AD9854 OSK控制端

  31. unsigned char flag = 1;
  32. unsigned int fc = 1000;
  33. unsigned long LFerq = 750;
  34. unsigned long HFerq = 1250;


  35. void AD9854_WR_Byte(unsigned char addr,unsigned char dat);          
  36. void AD9854_Init(void);                                                  
  37. void Freq_convert(long Freq);                           
  38. void AD9854_InitFSK(void);                               
  39. void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2);                                                                 
  40. //void delay (unsigned int us);

  41. void UpDisplay()
  42. {
  43.         unsigned char disbuf[5];
  44.         LCD_Write_String(0, 0, "BaseFerq       M");
  45.         LCD_Write_String(0, 1, "Now Ferq       M");
  46.         disbuf[0] = fc / 1000 + '0';
  47.         disbuf[1] = '.';
  48.         disbuf[2] = fc % 1000 / 100 + '0';
  49.         disbuf[3] = fc % 100 / 10 + '0';
  50.         disbuf[4] = fc % 10 + '0';
  51.         disbuf[5] = 0;
  52.         LCD_Write_String(9, 0, disbuf);

  53.         disbuf[0] = HFerq / 1000 + '0';
  54.         disbuf[1] = '.';
  55.         disbuf[2] = HFerq % 1000 / 100 + '0';
  56.         disbuf[3] = HFerq % 100 / 10 + '0';
  57.         disbuf[4] = HFerq % 10 + '0';
  58.         disbuf[5] = 0;
  59.         LCD_Write_String(9, 1, disbuf);
  60. }
  61. void DownDisplay()
  62. {
  63.         unsigned char disbuf[5];
  64.         LCD_Write_String(0, 0, "BaseFerq       M");
  65.         LCD_Write_String(0, 1, "Now Ferq       M");
  66.         disbuf[0] = fc / 1000 + '0';
  67.         disbuf[1] = '.';
  68.         disbuf[2] = fc % 1000 / 100 + '0';
  69.         disbuf[3] = fc % 100 / 10 + '0';
  70.         disbuf[4] = fc % 10 + '0';
  71.         disbuf[5] = 0;
  72.         LCD_Write_String(9, 0, disbuf);

  73.         disbuf[0] = LFerq / 1000 + '0';
  74.         disbuf[1] = '.';
  75.         disbuf[2] = LFerq % 1000 / 100 + '0';
  76.         disbuf[3] = LFerq % 100 / 10 + '0';
  77.         disbuf[4] = LFerq % 10 + '0';
  78.         disbuf[5] = 0;
  79.         LCD_Write_String(9, 1, disbuf);
  80. }
  81. void AD9854_SetSine(unsigned long Freq,unsigned int Shape)
  82. {
  83.         unsigned char count;
  84.         unsigned char Adress;

  85.         Adress = 0x04;                        //选择频率控制字地址的初值

  86.         Freq_convert(Freq);                           //频率转换

  87.         for(count=6;count>0;)                  //写入6字节的频率控制字  
  88.     {
  89.                 AD9854_WR_Byte(Adress++,FreqWord[--count]);
  90.     }
  91.        
  92.         AD9854_WR_Byte(0x21,Shape>>8);          //设置I通道幅度
  93.         AD9854_WR_Byte(0x22,(unsigned char)(Shape&0xff));
  94.        
  95.         AD9854_WR_Byte(0x23,Shape>>8);          //设置Q通道幅度
  96.         AD9854_WR_Byte(0x24,(unsigned char)(Shape&0xff));

  97.         AD9854_UDCLK=1;                    //更新AD9854输出
  98.     AD9854_UDCLK=0;
  99. }
  100. void main()
  101. {
  102.         LCD_Init();
  103.         LCD_Clear();
  104.         /*LCD_Write_String(0,0,"BaseFerq 0.875 M");
  105.         LCD_Write_String(0,1,"Now Ferq 1.125 M");*/
  106.         UpDisplay();
  107.         AD9854_Init();
  108.         AD9854_SetSine(HFerq * 1000,4000);
  109. //        AD9854_SetSine(1000000,4000);
  110. //        while(1);
  111. //        AD9854_InitFSK();
  112. //       
  113. //        AD9854_SetFSK(HFerq * 1000, LFerq * 1000);
  114.        
  115. //        AD9854_SetFSK(1000000,1000000);
  116. //        AD9854_FDATA = 1;
  117. //        while(1);
  118.         while(1)
  119.         {   
  120.                 if(!KEY1)
  121.                 {
  122.                         if (flag == 1)
  123.                         {
  124.                                 AD9854_SetSine(0,0);
  125.                                 //AD9854_InitFSK();
  126.                                 flag = 0;
  127.                         }
  128.                         else
  129.                         {
  130. //                                AD9854_InitFSK();
  131. //                                AD9854_SetFSK(HFerq * 1000, LFerq * 1000);
  132.                                 AD9854_SetSine(HFerq * 1000,4000);
  133.                                 flag = 1;
  134.                         }
  135.                        
  136.                         while (!KEY1);
  137.                 }
  138.                 if (flag == 1)
  139.                 {
  140.                         if (!KEY2)
  141.                         {
  142.                                 AD9854_SetSine(0,0);
  143.                                 fc += 100;
  144.                                 if (fc == 7900)        fc = 7800;
  145.                                 LFerq = fc * 3 / 4;
  146.                                 HFerq = fc * 5 / 4;
  147.                                 UpDisplay();
  148.                                 AD9854_SetSine(HFerq * 1000,4000);
  149. //                                AD9854_InitFSK();
  150. //                                AD9854_SetFSK(HFerq * 1000, LFerq * 1000);
  151.                                
  152.                                 while (!KEY2);
  153.                         }
  154.                         if (!KEY3)
  155.                         {
  156.                                 AD9854_SetSine(0,0);
  157.                                 fc -= 100;
  158.                                 if (fc == 300)        fc = 400;
  159.                                 LFerq = fc * 3 / 4;
  160.                                 HFerq = fc * 5 / 4;
  161.                                 UpDisplay();
  162.                                 AD9854_SetSine(HFerq * 1000,4000);
  163. //                                AD9854_InitFSK();
  164. //                                AD9854_SetFSK(HFerq * 1000, LFerq * 1000);
  165.                                 while (!KEY3);
  166.                         }
  167.                         if (!KEY4)
  168.                         {
  169.                                 //AD9854_FDATA = 1;
  170.                                 AD9854_SetSine(LFerq * 1000,4000);
  171.                                 DownDisplay();
  172.                                 while (!KEY4);
  173.                                 AD9854_SetSine(HFerq * 1000,4000);
  174.                                 //AD9854_FDATA = 0;
  175.                                 UpDisplay();
  176.                         }
  177.                 }

  178.         }
  179. }

  180. //====================================================================================
  181. //函数名称:void AD9854_WR_Byte(unsigned char addr,unsigned char dat)
  182. //函数功能:AD9854并行口写入数据
  183. //入口参数:addr     6位地址
  184. //         dat      写入的数据
  185. //出口参数:无
  186. //====================================================================================
  187. void AD9854_WR_Byte(unsigned char addr,unsigned char dat)
  188. {
  189.         AD9854_AdrBus  = (addr&0x3f) | (AD9854_AdrBus&0xc0);
  190.         AD9854_DataBus = dat;
  191.         AD9854_WR      = 0;
  192.         AD9854_WR      = 1;       
  193. }

  194. //====================================================================================
  195. //函数名称:void AD9854_Init(void)
  196. //函数功能:AD9854初始化
  197. //入口参数:无
  198. //出口参数:无
  199. //====================================================================================
  200. void AD9854_Init(void)
  201. {
  202.         AD9854_WR=1;//将读、写控制端口设为无效
  203.     AD9854_RD=1;
  204.     AD9854_UDCLK=0;
  205.     AD9854_RST=1;                 //复位AD9854
  206.     AD9854_RST=0;

  207.         AD9854_WR_Byte(0x1d,0x10);                   //关闭比较器
  208.         AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频            
  209.         AD9854_WR_Byte(0x1f,0x00);           //设置系统为模式0,由外部更新
  210.         AD9854_WR_Byte(0x20,0x60);           //设置为可调节幅度,取消插值补偿

  211.         AD9854_UDCLK=1;               //更新AD9854输出
  212.     AD9854_UDCLK=0;
  213. }

  214. //====================================================================================
  215. //函数名称:void Freq_convert(long Freq)
  216. //函数功能:正弦信号频率数据转换
  217. //入口参数:Freq   需要转换的频率,取值从0~SYSCLK/2
  218. //出口参数:无   但是影响全局变量FreqWord[6]的值
  219. //说明:   该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
  220. //         得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK
  221. //         为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6]
  222. //====================================================================================
  223. void Freq_convert(long Freq)   
  224. {
  225.     unsigned long FreqBuf;
  226.     unsigned long Temp=Freq_mult_ulong;                  

  227.         unsigned char Array_Freq[4];                             //将输入频率因子分为四个字节
  228.         Array_Freq[0]=(unsigned char)Freq;
  229.         Array_Freq[1]=(unsigned char)(Freq>>8);
  230.         Array_Freq[2]=(unsigned char)(Freq>>16);
  231.         Array_Freq[3]=(unsigned char)(Freq>>24);

  232.         FreqBuf=Temp*Array_Freq[0];                  
  233.     FreqWord[0]=FreqBuf;   
  234.     FreqBuf>>=8;

  235.     FreqBuf+=(Temp*Array_Freq[1]);
  236.     FreqWord[1]=FreqBuf;
  237.     FreqBuf>>=8;

  238.     FreqBuf+=(Temp*Array_Freq[2]);
  239.     FreqWord[2]=FreqBuf;
  240.     FreqBuf>>=8;

  241.         FreqBuf+=(Temp*Array_Freq[3]);
  242.     FreqWord[3]=FreqBuf;
  243.     FreqBuf>>=8;

  244.     FreqWord[4]=FreqBuf;
  245.     FreqWord[5]=FreqBuf>>8;                       
  246. }  

  247. //====================================================================================
  248. //函数名称:void AD9854_InitFSK(void)
  249. //函数功能:AD9854的FSK初始化
  250. //入口参数:无
  251. //出口参数:无
  252. //====================================================================================
  253. void AD9854_InitFSK(void)
  254. {
  255.         AD9854_WR=1;                        //将读、写控制端口设为无效
  256.     AD9854_RD=1;
  257.     AD9854_UDCLK=0;
  258.     AD9854_RST=1;                        //复位AD9854
  259.     AD9854_RST=0;       

  260.         AD9854_WR_Byte(0x1d,0x10);               //关闭比较器
  261.         AD9854_WR_Byte(0x1e,CLK_Set);           //设置系统时钟倍频
  262.         AD9854_WR_Byte(0x1f,0x02);               //设置系统为模式1,由外部更新
  263.         AD9854_WR_Byte(0x20,0x60);              //设置为可调节幅度,取消插值补偿

  264.         AD9854_UDCLK=1;                  //更新AD9854输出
  265.     AD9854_UDCLK=0;
  266. }

  267. //====================================================================================
  268. //函数名称:void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2)
  269. //函数功能:AD9854的FSK设置
  270. //入口参数:Freq1   FSK频率1   
  271. //         Freq2   FSK频率2
  272. //出口参数:无
  273. //====================================================================================
  274. void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2)
  275. {
  276.     unsigned char count=6;
  277.         unsigned char Adress1,Adress2;

  278.         const unsigned int Shape=4000;              //幅度设置. 为12 Bit,取值范围为(0~4095)
  279.        
  280.         Adress1=0x04;                                 //选择频率控制字1地址的初值
  281.         Adress2=0x0a;                                 //选择频率控制字2地址的初值
  282.        
  283. ……………………

  284. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
63535281AD9854-msk-for-stm32.zip (125.05 KB, 下载次数: 123)


评分

参与人数 2黑币 +9 收起 理由
1213866 + 5 赞一个!
soonc + 4 赞一个!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:366880 发表于 2018-7-11 11:11 | 只看该作者
很有用
回复

使用道具 举报

板凳
ID:462267 发表于 2019-1-9 13:57 | 只看该作者
垃圾东西,舍不得把原理图源文件发出来,
回复

使用道具 举报

地板
ID:480731 发表于 2019-3-5 08:39 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

5#
ID:505967 发表于 2019-4-6 21:41 | 只看该作者
很好用
回复

使用道具 举报

6#
ID:586674 发表于 2019-7-21 08:54 | 只看该作者
感谢分享,收藏
回复

使用道具 举报

7#
ID:882054 发表于 2021-3-18 10:15 | 只看该作者
很好啊,学习到了
回复

使用道具 举报

8#
ID:189724 发表于 2022-9-13 10:04 | 只看该作者
有些不太清楚,需要下载附件看看,谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表