找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7075|回復(fù): 9
收起左側(cè)

STC8F2K16S2單片機(jī)AD9833波形發(fā)生器程序 輸出3種波形頻率相位

  [復(fù)制鏈接]
ID:572546 發(fā)表于 2019-8-7 11:04 | 顯示全部樓層 |閱讀模式
這是我編寫的基于國產(chǎn)51單片機(jī)芯片STC8F2K16S2的AD9833波形發(fā)生器驅(qū)動(dòng)程序,可以輸出不同頻率以及相位的波形,可以輸出正弦波,三角波以及方波,其中附帶AD9833的中文數(shù)據(jù)手冊(cè),不易獲得,請(qǐng)珍惜。

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>


  3. sbit f_sync = P3^5;
  4. sbit s_clk         = P3^2;
  5. sbit s_data = P3^3;


  6. #define DDS_SCLK_UP         s_clk=1
  7. #define DDS_SCLK_DOWN         s_clk=0

  8. #define DDS_SDATA_UP         s_data=1
  9. #define DDS_SDATA_DOWN         s_data=0

  10. #define DDS_FSYNC_UP         f_sync=1
  11. #define DDS_FSYNC_DOWN         f_sync=0

  12. //#define BITB 0x0800


  13. //AD9833輸入時(shí)鐘值
  14. unsigned long int MCLK=6000000;       
  15. unsigned char p=3.141592653589793;
  16. //寄存器配置數(shù)組
  17. unsigned int Config_Data[8];

  18. //頻率
  19. unsigned long int code freq[5]={7500,10000,20000,30000,40000};

  20. //函數(shù)聲明
  21. static void delay2us(unsigned char i);
  22. static void changeFreq(unsigned char key);
  23. static unsigned char getKeyValue();
  24. void writeDDS2Byte(unsigned int config);
  25. void waveGenerate(unsigned long int frequency,unsigned int phase,unsigned char signal_type);


  26. void main(void)
  27. {
  28. //        unsigned char key_temp,key;
  29. //        //用單片機(jī)P1口高5bit來選擇頻率
  30. //        key=getKeyValue();
  31. //        changeFreq(key);

  32. //        while(1)
  33. //        {
  34. //                key_temp=getKeyValue();
  35. //        if(key!=key_temp)
  36. //        {
  37. //                key = key_temp;
  38. //                changeFreq(key);       
  39. //        }
  40. //        }
  41.         waveGenerate(freq[4],2*p,0);
  42. }


  43. //static unsigned char getKeyValue()
  44. //{
  45. //        unsigned char cnt;
  46. //        unsigned char key_first,key_second;

  47. //        key_first =  P1&0xF8;
  48. //        for(cnt=0; cnt<100; --cnt );
  49. //        key_second = P1&0xF8;

  50. //        if( key_first == key_second )
  51. //        return key_second;
  52. //        else
  53. //        return 255;
  54. //}


  55. //static void changeFreq(unsigned char key)
  56. //{
  57. //        switch(key)
  58. //        {
  59. //        case 0xF0://s5
  60. //                waveGenerate(freq[4],0);
  61. //                P2 = 0x00;
  62. //        break;

  63. //        case 0xE8://s4
  64. //                waveGenerate(freq[3],0);
  65. //                P2 = 0x01;
  66. //        break;

  67. //        case 0xD8://s3
  68. //                waveGenerate(freq[2],0);
  69. //                P2 = 0x02;
  70. //        break;

  71. //        case 0xB8://s2        X3
  72. //                waveGenerate(freq[1],0);
  73. //                P2 = 0x03;
  74. //        break;

  75. //        case 0x78://s1  X4
  76. //                waveGenerate(freq[0],0);
  77. //                P2 = 0x04;
  78. //        break;

  79. //        default:
  80. //                waveGenerate(freq[0],0);
  81. //                P2 = 0x04;
  82. //        break;
  83. //        }
  84. //}

  85. /*******************************************************************
  86. *        功能:波形發(fā)生器
  87. *
  88. *        入口參數(shù):         frequency: 期望得到的信號(hào)頻率 (frequency<MCLK)
  89. *
  90. *                          phase:期望得到的相位
  91. *
  92. *             signal_type:0正弦波1(三角波),2(方波)   
  93. *
  94. *        默認(rèn)配置:         0相移,方波不分頻
  95. *******************************************************************/
  96. void waveGenerate(unsigned long int frequency,unsigned int phase,unsigned char signal_type)
  97. {
  98.         unsigned char k;
  99.         unsigned long int freq_temp;
  100.         unsigned int phase_temp;
  101.         if(frequency>MCLK)
  102.         frequency=MCLK;
  103.         switch(signal_type)
  104.         {
  105.                 case 0://正弦波
  106.                         Config_Data[0]=0x2108;//控制寄存器配置值,復(fù)位片內(nèi)其他寄存器,AD9833上電時(shí),期間應(yīng)復(fù)位,要使AD9833復(fù)位應(yīng)將reset位置1,即bit8置1,要通過Vout引腳提供正弦波輸出,應(yīng)將mode(D1)bit清0并將OPBITEN(D5)bit清0,當(dāng)DIV2=1時(shí)即bit3=1,DAC的MSB被直接送至Vout引腳
  107.                         Config_Data[7]=0x2008;//控制寄存器配置值,不復(fù)位片內(nèi)其他寄存器,要使AD9833退出復(fù)位,應(yīng)將該位清零,即bit8位清零,要通過Vout引腳提供正弦波輸出,應(yīng)將mode(D1)bit清0并將OPBITEN(D5)bit清0,當(dāng)DIV2=1時(shí)即bit3=1,DAC的MSB被直接送至Vout引腳
  108.                 break;
  109.                 case 1://三角波
  110.                         Config_Data[0]=0x210A;//控制寄存器配置值,復(fù)位片內(nèi)其他寄存器,AD9833上電時(shí),期間應(yīng)復(fù)位,要使AD9833復(fù)位應(yīng)將reset位置1,即bit8置1,要通過Vout引腳提供三角波輸出,應(yīng)將mode(D1)1,DIV2=1時(shí)即bit3=1,DAC的MSB被直接送至Vout引腳
  111.                         Config_Data[7]=0x200A;//控制寄存器配置值,不復(fù)位片內(nèi)其他寄存器,要使AD9833退出復(fù)位,應(yīng)將該位清零,即bit8位清零,要通過Vout引腳提供三角波輸出,應(yīng)將mode(D1)置1,DIV2=1時(shí)即bit3=1,DAC的MSB被直接送至Vout引腳
  112.                 break;
  113.                 case 2://方波,不分頻
  114.                         Config_Data[0]=0x2128;//控制寄存器配置值,復(fù)位片內(nèi)其他寄存器,AD9833上電時(shí),期間應(yīng)復(fù)位,要使AD9833復(fù)位應(yīng)將reset位置1,即bit8置1,當(dāng)OPBITEN(D5)置1,mode(D1)清0,DIV2=1時(shí)即bit3=1,Vout輸出DAC數(shù)據(jù)MSB
  115.                         Config_Data[7]=0x2028;//控制寄存器配置值,不復(fù)位片內(nèi)其他寄存器,要使AD9833退出復(fù)位,應(yīng)將該位清零,即bit8位清零,當(dāng)OPBITEN(D5)置1,mode(D1)清0,DIV2=1時(shí)即bit3=1,Vout輸出DAC數(shù)據(jù)MSB
  116.                         break;
  117.                 default://正弦波
  118.                         Config_Data[0]=0x2108;
  119.                         Config_Data[7]=0x2008;
  120.                 break;
  121.         }
  122.         //freq_temp=frequency*(2^28/MCLK),MCLK=6Mhz?,2^28/MCLK約等于44.739242666666669
  123.         //phase_temp=phase*(4096/2p),p=3.141592653589793
  124.         freq_temp=frequency*44.739242666666669; //載入所選頻率寄存器的值,此信號(hào)會(huì)經(jīng)過如下相位偏移處理,2?/4096*PHASEREG,PHASEREG是所選相位輸出頻率和參考時(shí)鐘頻率之間的關(guān)系,必須考慮所選輸出頻率和參考時(shí)鐘頻率之間的關(guān)系,以免產(chǎn)生不良的輸出異常
  125.         phase_temp=phase*651.898646904403295309;
  126.         Config_Data[1]=freq_temp&0x3fff;//先將bit15,bit14位清0,控制字寫入
  127.         Config_Data[3]=Config_Data[1];//先將bit15,bit14位清0,控制字寫入
  128.         Config_Data[2]=(freq_temp&0x0fffc000)>>14;//先將bit15,bit14位清0,控制字寫入
  129.         Config_Data[4]=Config_Data[2];//先將bit15,bit14位清0,控制字寫入
  130.         Config_Data[5]=phase_temp&0x1fff;
  131.         Config_Data[5]=Config_Data[6];


  132.         Config_Data[1]=Config_Data[1]|0x4000;//(頻率寄存器)FREQ0 14 LSBs,bit15=0,bit14=1,F(xiàn)REQ0寄存器寫入
  133.         Config_Data[2]=Config_Data[2]|0x4000;//(頻率寄存器)FREQ0 14 MSBs,bit15=0,bit14=1,F(xiàn)REQ0寄存器寫入
  134.         Config_Data[3]=Config_Data[3]|0x8000;//(頻率寄存器)FREQ1 14 LSBs,bit15=1,bit14=0,F(xiàn)REQ1寄存器寫入
  135.         Config_Data[4]=Config_Data[4]|0x8000;//(頻率寄存器)FREQ1 14 MSBs,bit15=1,bit14=0,F(xiàn)REQ1寄存器寫入
  136. //        Config_Data[5]=0xC000;//(相位寄存器)PHASE0
  137. //        Config_Data[6]=0xE000;//(相位寄存器)PHASE1
  138.         Config_Data[5]=Config_Data[5]|0xC000;//(相位寄存器)PHASE0,bit15=1,bit14=1,bit13=0,PHASE0寄存器寫入
  139.         Config_Data[6]=Config_Data[6]|0xE000;//(相位寄存器)PHASE1,bit15=1,bit14=1,bit13=1,PHASE1寄存器寫入
  140.         for(k=0;k<8;k++)
  141.         {
  142.                 writeDDS2Byte(Config_Data[k]);
  143.         }
  144. }

  145. /***********************************************************************************************
  146. *
  147. *        軟件模擬SPI
  148. *
  149. *        向AD9833寫入數(shù)據(jù)或控制信息時(shí),F(xiàn)SYNC應(yīng)處于低電平并保持低電平,直到數(shù)據(jù)的16個(gè)位均已寫入AD9833為止,F(xiàn)SYNC信號(hào)以幀方式傳輸要載入AD9833的16位信息
  150. *
  151. *        向AD9833發(fā)送數(shù)據(jù)時(shí),F(xiàn)SYNC被拉低,單片機(jī)以8位字節(jié)傳輸數(shù)據(jù),因此每個(gè)周期中只有8個(gè)SCLK下降沿,要向AD9833中載入剩余的8個(gè)位,F(xiàn)SYNC應(yīng)在第一批8個(gè)位傳輸完成后保持低電平,同時(shí)啟動(dòng)第二次寫操作來傳輸數(shù)
  152. *        據(jù)的第二個(gè)字節(jié),第二次寫操作結(jié)束后FSYNC被拉高,SCLK應(yīng)在兩次寫操作之間處于高電平空閑狀態(tài)
  153. *
  154. ************************************************************************************************/
  155. void writeDDS2Byte(unsigned int config)
  156. {
  157.         unsigned char i;
  158.         DDS_SCLK_DOWN;//拉低SCLK
  159.         _nop_();//延時(shí)
  160.         DDS_FSYNC_UP;//拉高FSYNC
  161.         _nop_();//延時(shí)
  162.         DDS_SCLK_UP;//拉高SCLK
  163.         delay2us(1);//延時(shí)1us
  164.         DDS_FSYNC_DOWN;//發(fā)送數(shù)據(jù)時(shí),F(xiàn)SYNC拉低
  165.         _nop_();
  166. ……………………

  167. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
0.png
所有資料51hei提供下載:
超聲波驅(qū)動(dòng).7z (10.66 MB, 下載次數(shù): 150)

回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2019-8-7 21:29 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:328014 發(fā)表于 2019-8-7 21:31 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:597288 發(fā)表于 2019-8-7 21:51 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

ID:621725 發(fā)表于 2019-10-10 14:38 | 顯示全部樓層
好資料,謝謝樓主!
回復(fù)

使用道具 舉報(bào)

ID:613800 發(fā)表于 2019-10-13 23:35 | 顯示全部樓層
寫的不錯(cuò),加油
回復(fù)

使用道具 舉報(bào)

ID:699435 發(fā)表于 2020-6-16 07:11 | 顯示全部樓層
樓主問您一下,AD9833的GND和VCC應(yīng)該和單片機(jī)的什么引腳連在一起
回復(fù)

使用道具 舉報(bào)

ID:789438 發(fā)表于 2020-6-25 13:06 | 顯示全部樓層

好資料,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:899487 發(fā)表于 2021-4-1 13:56 | 顯示全部樓層
想問下樓主AD轉(zhuǎn)換器和stc8f2k16s2單片機(jī)怎么連接驅(qū)動(dòng)的,還有驅(qū)動(dòng)程序是你寫的這個(gè)嘛
回復(fù)

使用道具 舉報(bào)

ID:602007 發(fā)表于 2025-5-16 19:25 | 顯示全部樓層
太好了,正需要啊
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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