找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2640|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機AD9851遠(yuǎn)程幅頻特性制作 附測試程序與資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:498094 發(fā)表于 2021-9-27 03:22 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本設(shè)計為一遠(yuǎn)程幅頻特性測試的系統(tǒng),在硬件上,采用單片機控制 AD9851信號發(fā)生模塊,完成波幅,步進(jìn),輸出頻率的設(shè)置,通過高速 A/D 轉(zhuǎn)換實時將輸出波幅顯示到液晶顯示屏上。各個模塊是相互獨立的,保證了模塊能夠穩(wěn)定輸出頻率為 1MHz-40MHz 峰值可調(diào)的信號波。利用適用于中頻放大的 AD8367 芯片,對
波形進(jìn)行無明顯失真的放大。此外還利用頻率檢測模塊以及有效值檢波模塊,兩者能夠在 1-500M 的范圍內(nèi)提供出良好的數(shù)據(jù)供軟件部分?jǐn)M合成幅頻特性曲線。
所研究關(guān)鍵技術(shù)的嵌入式系統(tǒng),具有高精度、高可靠性和低功耗等優(yōu)點,主要從傳感器數(shù)據(jù)采集、無線網(wǎng)絡(luò)設(shè)計功能入手,利用嵌入式系統(tǒng)的控制優(yōu)勢,實現(xiàn)整個系統(tǒng)的智能控制和監(jiān)測。本設(shè)計遠(yuǎn)程幅頻特性測試系統(tǒng)將硬件平臺采集的各種重要參數(shù)顯示在 PC 機終端,讓用戶更加直觀清晰的觀測到幅頻特性的改變。

制作出來的實物圖如下:



單片機源程序如下:
  1. #include "AD9851.H"
  2. #include "stdio.h"
  3. #include "nokia_5110.h"
  4. //***************************************************//
  5. //函數(shù)1:           ad9851_reset()                    //
  6. //函數(shù)2:           ad9851_reset_serial()             //
  7. //函數(shù)3:           ad9851_wr_parrel(unsigned char w0,double frequence)//
  8. //函數(shù)4:           ad9851_wr_serial(unsigned char w0,double frequence)//
  9. //版本:              V1.1                            //
  10. //***************************************************//
  11. //                  子程序說明                       //
  12. //***************************************************//
  13. //函數(shù)1:  ad9851_reset()
  14. //        復(fù)位ad9851,之后為并口寫入模式        
  15. //函數(shù)2:  ad9851_reset_serial()
  16. //        復(fù)位ad9851,之后為串口寫入模式
  17. //函數(shù)3:  ad9851_wr_parrel(unsigned char w0,double frequence)
  18. //        并口寫ad9851數(shù)據(jù),w0為ad9851中w0的數(shù)據(jù),frequence
  19. //        為寫入的頻率       
  20. //函數(shù)4:  ad9851_wr_serial(unsigned char w0,double frequence)
  21. //        串口寫ad9851數(shù)據(jù),w0為ad9851中w0的數(shù)據(jù),frequence
  22. //        為寫入的頻率       
  23. //需定義的位:
  24. //ad9851_w_clk    ;
  25. //ad9851_fq_up    ;
  26. //ad9851_rest     ;
  27. //ad9851_bit_data ;
  28. //例:
  29. //sbit ad9851_w_clk    =P2^2;
  30. //sbit ad9851_fq_up    =P2^1;
  31. //sbit ad9851_rest     =P2^0;
  32. //sbit ad9851_bit_data =P1^7;
  33. //***************************************************//
  34. //                 寫數(shù)據(jù)說明                        //
  35. //***************************************************//
  36. //寫數(shù)據(jù)例:
  37. //       ad9851_reset()
  38. //       wr_lcd02_data(unsigned char x)
  39. //       ad9851_wr_parrel(0x01,1000)
  40. //       ad9851_wr_serial(0x01,1000)
  41. //***************************************************//
  42. //---------------------------------------------------//
  43. //并行寫1000Hz程序
  44. //        ad9851_reset();
  45. //        ad9851_wr_parrel(0x01,100000);
  46. //0X01為開六備頻
  47. //ad9851_wr_parrel(0x00,1000);
  48. //0X00為不開六備頻
  49. //---------------------------------------------------//
  50. //---------------------------------------------------//
  51. //串行寫1000Hz程序
  52. //ad9851_reset_serial();
  53. //ad9851_wr_serial(0x01,1000);
  54. //0X01為開六備頻
  55. //ad9851_wr_serial(0x00,1000);
  56. //0X00為不開六備頻
  57. //---------------------------------------------------//
  58. //---------------------------------------------------//
  59. //                   程序                            //
  60. //---------------------------------------------------//
  61. ////
  62. ////sbit ad9851_w_clk    =P2^2;  //P2.2口接AD9851的w_clk腳/PIN7
  63. ////sbit ad9851_fq_up    =P2^1;  //P2.1口接AD9851的fq_up腳/PIN8
  64. ////sbit ad9851_rest     =P2^0;  //P2.0口接AD9851的rest腳/PIN12
  65. ////sbit ad9851_bit_data =P1^7;  //P1.7口接AD9851的D7腳/PIN25
  66. //////P1為8位數(shù)據(jù)口
  67. //***************************************************//
  68. //              ad9851復(fù)位(并口模式)                 //
  69. //---------------------------------------------------//
  70. void ad9851_reset()
  71. {
  72.         ad9851_w_clk=0;
  73.         ad9851_fq_up=0;
  74.         //rest信號
  75.         ad9851_rest=0;
  76.         ad9851_rest=1;
  77.         ad9851_rest=0;
  78. }
  79. //***************************************************//
  80. //              ad9851復(fù)位(并口模式)                 //
  81. //---------------------------------------------------//
  82. void ad9851_reset_serial()
  83. {
  84.         ad9851_w_clk=0;
  85.         ad9851_fq_up=0;
  86.         //rest信號
  87.         ad9851_rest=0;
  88.         ad9851_rest=1;
  89.         ad9851_rest=0;
  90.         //w_clk信號
  91.         ad9851_w_clk=0;
  92.         ad9851_w_clk=1;
  93.         ad9851_w_clk=0;
  94.         //fq_up信號
  95.         ad9851_fq_up=0;
  96.         ad9851_fq_up=1;
  97.         ad9851_fq_up=0;
  98. }
  99. //***************************************************//
  100. //          向ad9851中寫命令與數(shù)據(jù)(并口)             //
  101. //---------------------------------------------------//
  102. void ad9851_wr_parrelnums(unsigned char w0,double frequence)
  103. {
  104.         u8 i;
  105.         for(i = 0; i < 5; i++)
  106.                 ad9851_wr_parrel(w0, frequence);
  107. }
  108. void ad9851_wr_parrel(unsigned char w0,double frequence)
  109. {
  110.         unsigned char w;
  111.         long int y;
  112.         double x;
  113.         //計算頻率的HEX值
  114.         x=4294967295/180;//適合180M晶振/180為最終時鐘頻率(或30M六倍頻)
  115.         //如果時鐘頻率不為180MHZ,修改該處的頻率值,單位MHz !。
  116.         frequence=frequence/1000000;
  117.         frequence=frequence*x;
  118.         y=frequence;
  119.         //寫w0數(shù)據(jù)
  120.         w=w0;   
  121.         P1=w;      //w0
  122.         ad9851_w_clk=1;
  123.         ad9851_w_clk=0;
  124.         //寫w1數(shù)據(jù)
  125.         w=(y>>24);
  126.         P1=w;      //w1
  127.         ad9851_w_clk=1;
  128.         ad9851_w_clk=0;
  129.         //寫w2數(shù)據(jù)
  130.         w=(y>>16);
  131.         P1=w;      //w2
  132.         ad9851_w_clk=1;
  133.         ad9851_w_clk=0;
  134.         //寫w3數(shù)據(jù)
  135.         w=(y>>8);
  136.         P1=w;      //w3
  137.         ad9851_w_clk=1;
  138.         ad9851_w_clk=0;
  139.         //寫w4數(shù)據(jù)
  140.         w=(y>>=0);
  141.         P1=w;      //w4
  142.         ad9851_w_clk=1;
  143.         ad9851_w_clk=0;
  144.         //移入始能
  145.         ad9851_fq_up=1;
  146.         ad9851_fq_up=0;
  147. }
  148. //***************************************************//
  149. //          向ad9851中寫命令與數(shù)據(jù)(串口)             //
  150. //---------------------------------------------------//
  151. void ad9851_wr_serial(unsigned char w0,double frequence)
  152. {
  153.         u8 diss[30];
  154.         static adenter = 0;
  155.         unsigned char i,w;
  156.         long int y;
  157.         double x;
  158.         sprintf(diss, "SADEnter:%d", (int)adenter++);
  159.         LCD_write_english_string(10,3,diss);
  160.         //計算頻率的HEX值
  161.         x=4294967295/180;//適合180M晶振/180為最終時鐘頻率(或30M六倍頻)
  162.         //如果時鐘頻率不為180MHZ,修改該處的頻率值,單位MHz  !!
  163.         frequence=frequence/1000000;
  164.         frequence=frequence*x;
  165.         y=frequence;
  166.         //寫w4數(shù)據(jù)
  167.         w=(y>>=0);
  168.         for(i=0;i<8;i++)
  169.         {
  170.                 ad9851_bit_data=(w>>i)&0x01;
  171.                 ad9851_w_clk=1;
  172.                 ad9851_w_clk=0;
  173.         }
  174.         //寫w3數(shù)據(jù)
  175.         w=(y>>8);
  176.         for(i=0;i<8;i++)
  177.         {
  178.                 ad9851_bit_data=(w>>i)&0x01;
  179.                 ad9851_w_clk=1;
  180.                 ad9851_w_clk=0;
  181.         }
  182.         //寫w2數(shù)據(jù)
  183.         w=(y>>16);
  184.         for(i=0;i<8;i++)
  185.         {
  186.                 ad9851_bit_data=(w>>i)&0x01;
  187.                 ad9851_w_clk=1;
  188.                 ad9851_w_clk=0;
  189.         }
  190.         //寫w1數(shù)據(jù)
  191.         w=(y>>24);
  192.         for(i=0;i<8;i++)
  193.         {
  194.                 ad9851_bit_data=(w>>i)&0x01;
  195.                 ad9851_w_clk=1;
  196.                 ad9851_w_clk=0;
  197.         }
  198.         //寫w0數(shù)據(jù)
  199.         w=w0;   
  200.         for(i=0;i<8;i++)
  201.         {
  202.                 ad9851_bit_data=(w>>i)&0x01;
  203.                 ad9851_w_clk=1;
  204.                 ad9851_w_clk=0;
  205.         }
  206.         //移入始能
  207.         ad9851_fq_up=1;
  208.         ad9851_fq_up=0;
  209. }
復(fù)制代碼
  1. #include "STC12C5A60S2.H"
  2. #include "key.h"
  3. #include "stdio.h"
  4. #include "DDS9851.H"
  5. #include "USART.H"
  6. #include "nokia_5110.h"

  7. u8 Task_ID = 0;
  8. u8 OLD_Task_ID = 0;
  9. u8 i, RUN;
  10. u8 enter = 0;
  11. u8 dis[30];
  12. int k1 = 0, k2 = 0, k3 = 0, k4 = 0;
  13. u32 Fre = 100000;
  14. double pinlv;
  15. void init(void)
  16. {
  17. ////        IT0=1;
  18. ////        EX0 = 1;
  19. ////        IT1=1;
  20. ////        EX1 = 1;
  21. ////        EA = 1;
  22.         P0=0x00;
  23.         P1=0x00;
  24.         P2=0x00;
  25.         P3=0xff;
  26. }
  27. char disbuf[20];
  28. void main()
  29. {
  30.         init();
  31.         LCD_init();
  32.         UsartInit();
  33.         LCD_write_english_string(10,2,"AD9851XX");
  34.         Key_Init();
  35.         ad9851_wr_parrel(0x01, (double)Fre);        //0X00為不開六備頻 0X01為開六備頻
  36.         LCD_clear();
  37.         LCD_write_english_string(24,2,"AD9851");
  38.         LCD_Show_CEStr(10,0,"康威電子");
  39.         LCD_write_english_string(3,4,"000,100,000Hz");
  40.         LCD_write_english_string(10,3,"Point");
  41.         while(1)
  42.         {
  43.                 KeyRead();
  44.                 OLD_Task_ID = Task_ID;
  45.                 switch(Keycode)
  46.                 {
  47.                         case E_K_L: Task_ID++; Task_ID %= 3;break;
  48.                 }
  49.                 if(Task_ID != OLD_Task_ID)
  50.                 {
  51.                         LCD_clear();
  52.                         LCD_Show_CEStr(10,0,"電子");
  53.                         switch(Task_ID)
  54.                         {
  55.                                 case 0: LCD_write_english_string(24,3,"Point");break;
  56.                                 case 1: LCD_write_english_string(24,2,"Sweep");break;
  57.                                 case 2: LCD_write_english_string(24,2,"Step");changefre(&f_step, Keycode, dis);break;
  58.                         }       
  59.                 }
  60.                 if((Keycode != 0) && (Keycode != D_K_L))
  61.                         Sweeper_state = 0;
  62.                 switch(Task_ID)
  63.                 {
  64.                         case 0:
  65.                                 if(Keycode != 0)
  66.                                 {
  67.                                         pinlv = changefre(&Fre, Keycode, dis);
  68.                                         LCD_write_english_string(3,4,dis);
  69.                                         ad9851_wr_parrel(0x01, pinlv);
  70.                                 }
  71.                         break;
  72.                         case 1:
  73.                                 sweep_freq();
  74. ……………………

  75. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

代碼與資料下載: AD9851-Nokia5110資料包-驅(qū)動 PDF-V7.0.7z (3.64 MB, 下載次數(shù): 38)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1531 發(fā)表于 2021-9-27 08:05 | 只看該作者
這東西的應(yīng)用場景是什么?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

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

快速回復(fù) 返回頂部 返回列表