久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8031|回復: 7
收起左側

AD9854原理圖與單片機驅動程序設計

[復制鏈接]
ID:221591 發(fā)表于 2017-7-22 14:39 | 顯示全部樓層 |閱讀模式

AD9854原理圖如下(pdf文檔清晰版請下載附件):
0.png 0.png

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個字節(jié)頻率控制字

  15. /*
  16.       CLK_Set為時鐘倍頻設置,可設置4~20倍倍頻,但最大不能超過300MHZ
  17.       Freq_mult_unsigned long和Freq_mult_doulle均為2的48次方除以系統(tǒng)時鐘,一個為長整形,一個為雙精度型
  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字節(jié)的頻率控制字  
  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. //函數(shù)名稱:void AD9854_WR_Byte(unsigned char addr,unsigned char dat)
  182. //函數(shù)功能:AD9854并行口寫入數(shù)據(jù)
  183. //入口參數(shù):addr     6位地址
  184. //         dat      寫入的數(shù)據(jù)
  185. //出口參數(shù):無
  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. //函數(shù)名稱:void AD9854_Init(void)
  196. //函數(shù)功能:AD9854初始化
  197. //入口參數(shù):無
  198. //出口參數(shù):無
  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);           //設置系統(tǒng)時鐘倍頻            
  209.         AD9854_WR_Byte(0x1f,0x00);           //設置系統(tǒng)為模式0,由外部更新
  210.         AD9854_WR_Byte(0x20,0x60);           //設置為可調節(jié)幅度,取消插值補償

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

  214. //====================================================================================
  215. //函數(shù)名稱:void Freq_convert(long Freq)
  216. //函數(shù)功能:正弦信號頻率數(shù)據(jù)轉換
  217. //入口參數(shù):Freq   需要轉換的頻率,取值從0~SYSCLK/2
  218. //出口參數(shù):無   但是影響全局變量FreqWord[6]的值
  219. //說明:   該算法位多字節(jié)相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK
  220. //         得到該算法,其中N=48,Desired Output Frequency 為所需要的頻率,即Freq,SYSCLK
  221. //         為可編程的系統(tǒng)時鐘,F(xiàn)TW為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];                             //將輸入頻率因子分為四個字節(jié)
  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. //函數(shù)名稱:void AD9854_InitFSK(void)
  249. //函數(shù)功能:AD9854的FSK初始化
  250. //入口參數(shù):無
  251. //出口參數(shù):無
  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);           //設置系統(tǒng)時鐘倍頻
  262.         AD9854_WR_Byte(0x1f,0x02);               //設置系統(tǒng)為模式1,由外部更新
  263.         AD9854_WR_Byte(0x20,0x60);              //設置為可調節(jié)幅度,取消插值補償

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

  267. //====================================================================================
  268. //函數(shù)名稱:void AD9854_SetFSK(unsigned long Freq1,unsigned long Freq2)
  269. //函數(shù)功能:AD9854的FSK設置
  270. //入口參數(shù):Freq1   FSK頻率1   
  271. //         Freq2   FSK頻率2
  272. //出口參數(shù):無
  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, 下載次數(shù): 125)


評分

參與人數(shù) 2黑幣 +9 收起 理由
1213866 + 5 贊一個!
soonc + 4 贊一個!

查看全部評分

回復

使用道具 舉報

ID:366880 發(fā)表于 2018-7-11 11:11 | 顯示全部樓層
很有用
回復

使用道具 舉報

ID:462267 發(fā)表于 2019-1-9 13:57 | 顯示全部樓層
垃圾東西,舍不得把原理圖源文件發(fā)出來,
回復

使用道具 舉報

ID:480731 發(fā)表于 2019-3-5 08:39 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:505967 發(fā)表于 2019-4-6 21:41 | 顯示全部樓層
很好用
回復

使用道具 舉報

ID:586674 發(fā)表于 2019-7-21 08:54 | 顯示全部樓層
感謝分享,收藏
回復

使用道具 舉報

ID:882054 發(fā)表于 2021-3-18 10:15 | 顯示全部樓層
很好啊,學習到了
回復

使用道具 舉報

ID:189724 發(fā)表于 2022-9-13 10:04 | 顯示全部樓層
有些不太清楚,需要下載附件看看,謝謝分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: www.国产一区 | 欧美一二三 | 欧美日韩一区二区在线观看 | 中日字幕大片在线播放 | 9999精品视频 | 国产一级免费视频 | 亚洲精品美女 | 天天碰日日操 | 91免费高清 | 亚洲看片网站 | 欧美日本一区二区 | 欧美a在线| 国产成人综合一区二区三区 | 一级黄色片网址 | 国产亚洲成av人在线观看导航 | 日本福利在线观看 | 日韩成人在线视频 | 国内精品视频在线 | 免费成人高清在线视频 | 成人在线免费观看av | 日韩尤物视频 | 国产一区二区三区四区五区3d | 麻豆av在线| 欧美精品免费观看二区 | 成人精品一区 | 久久久精品一区 | 日韩精品在线播放 | 日韩av中文 | 国产乱码久久久久久一区二区 | 色婷婷综合久久久久中文一区二区 | 人人看人人爽 | 午夜视频网站 | 国产一级片精品 | 免费久久视频 | 久久成人久久 | 亚洲高清在线观看 | 国产精品1区 | 日韩成人专区 | 欧美乱操 | 91精品入口蜜桃 | 精品久久久久久亚洲精品 |