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

QQ登錄

只需一步,快速開始

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

51單片機(jī)+12864做的簡易波形發(fā)生器 含源碼 已制作出實(shí)物(DAC0832+UA741運(yùn)放)

  [復(fù)制鏈接]
ID:150346 發(fā)表于 2017-4-24 15:05 | 顯示全部樓層 |閱讀模式
最近用51單片機(jī)+DAC0832+UA741運(yùn)放 做了個(gè)簡易的波形發(fā)生器
LCD12864 顯示 ,可以產(chǎn)生正弦波 三角波 方波 按鍵切換波形 調(diào)整頻率和步進(jìn)值(按鍵可長按)
有24C02掉電儲(chǔ)存設(shè)置的數(shù)據(jù)
頻率不高 10HZ~600HZ(頻率高了有點(diǎn)誤差)
由單片機(jī)定時(shí)器中斷產(chǎn)生數(shù)字信號(hào) DAC0832轉(zhuǎn)換 運(yùn)放調(diào)幅
能力有限 和大家分享一下~ ~

注意原理圖 DA轉(zhuǎn)換電路的芯片是DAC0832 畫圖的人寫錯(cuò)了!。
實(shí)物圖:

實(shí)物圖

實(shí)物圖


原理圖:

原理圖

原理圖


部分單片機(jī)源程序預(yù)覽:

  1. /****************************************************************************************************************/
  2. /*                                           簡易波形發(fā)生器 程序                                                */
  3. /*                                            編寫者 :FHX                                                      */
  4. /*                                  可輸出 正弦波 三角波 方波  按鍵控制波形、頻率、步進(jìn)值                       */
  5. /*                            由于是單片機(jī)定時(shí)器控制頻率   經(jīng)測(cè)試頻率只能在10HZ ~ 700HZ 之間                    */
  6. /*                            有掉電儲(chǔ)存功能 再次上電時(shí) 顯示掉電前設(shè)置好的波形 頻率 步進(jìn)值                      */               
  7. /****************************************************************************************************************/

  8. #include "lcd12864.h"
  9. #include "key.h"
  10. #include "24c02.h"
  11. #include "function.h"

  12. uchar T1RH = 0;                                //定時(shí)器1重載值高位
  13. uchar T1RL = 0;                                //定時(shí)器1重載值低位

  14. uchar T0RH = 0;                                //定時(shí)器0重載值高位
  15. uchar T0RL = 0;                                //定時(shí)器0重載值低位
  16. uchar mode = 0;

  17. extern uchar Wave_Index;                       //聲明 波形變量

  18. uchar code sin[32]={                                             //此數(shù)組內(nèi)的數(shù)據(jù)為,DA輸出對(duì)應(yīng)電壓值對(duì)應(yīng)的數(shù)字量,0是0V,255是5V
  19.         127, 152, 176, 198, 217, 233, 245, 252,
  20.   255, 252, 245, 233, 217, 198, 176, 152,
  21.   127, 102, 78, 56, 37, 21, 9, 2,
  22.   0, 2, 9, 21, 37, 56, 78, 102

  23. };                                          //正弦波取碼
  24. uchar code juxing[32]={                                                 //一個(gè)周期是采樣32個(gè)點(diǎn), 所以數(shù)組內(nèi)是32個(gè)數(shù)據(jù)
  25.         255,255,255,255,255,255,255,255,255,255,
  26.   255,255,255,255,255,255,0,0,0,0,0,0,0,0,
  27.         0,0,0,0,0,0,0,0
  28. };                                          //矩形波取碼

  29. uchar code sanjiao[32]={
  30.         0, 16, 32, 48, 64, 80, 96, 112,
  31.   128, 144, 160, 176, 192, 208, 224, 240,
  32.   255, 240, 224, 208, 192, 176, 160, 144,
  33.   128, 112, 96, 80, 64, 48, 32, 16

  34. };                                                //三角波取碼


  35. /*****************子函數(shù)聲明*****************/
  36. void Timer1Init(uint ms);
  37. void SetWaveRate(uint num_2);
  38. void Control_Key();
  39. void Refresh_Out();
  40. /*****************************************************************************/
  41. /*                                 主函數(shù)                                    */
  42. /*****************************************************************************/
  43. void main()
  44. {
  45.         Timer1Init(1);                          //初始化定時(shí)器1 定時(shí)1ms
  46.         LcdInit();                              //初始化12864
  47.         Init_Display();                         //顯示固定內(nèi)容
  48.         Init_OutPut();                          //初始化輸出數(shù)據(jù)和顯示

  49.         while(1)
  50.         {
  51.                 Refresh_Out();                        //更新輸出 mode=0:輸出波形 獨(dú)立按鍵關(guān)閉 mode!=0 :關(guān)閉波形輸出 可用獨(dú)立按鍵調(diào)整
  52.                 Control_Key();                        //控制獨(dú)立按鍵 調(diào)整模式mode
  53.                 KeyDrive();                      //調(diào)整波形、頻率及步進(jìn)值
  54.         }
  55. }

  56. /*****************************************************************************/
  57. /*                             按鍵控制函數(shù)                                  */
  58. /*               按鍵KEY_1 :用延時(shí)函數(shù)判斷按下 控制模式變換                  */
  59. /*****************************************************************************/
  60. void Control_Key()
  61. {
  62.         if(KEY_1==0)                            //按下按鍵1  mode+1
  63.         {
  64.                 DelayMs(2);
  65.                 if(KEY_1==0)
  66.                 {
  67.                         while(!KEY_1);
  68.                         mode++;                              
  69.                         if(mode > 3)mode = 1;
  70.                 }
  71.         }
  72. }

  73. /*****************************************************************************/
  74. /*                            更新輸出函數(shù)                                   */
  75. /*                      根據(jù)不同的模式變量 打開或關(guān)閉波形輸出                */
  76. /*****************************************************************************/
  77. void Refresh_Out()
  78. {
  79.                         if(mode == 0)                                    //不顯示箭頭   輸出波形 獨(dú)立按鍵關(guān)閉
  80.                   {
  81.                                 ET1=0;
  82.                           TR1=0;
  83.                           ET0=1;        
  84.               TR0=1;
  85.                     EA=1;
  86.                           Display_Arr(0);
  87.                   }
  88.                
  89.                   else if(mode == 1)                               //箭頭指向 "波形"   說明是在切換波形
  90.                   {
  91.                                 ET1=1;
  92.               TR1=1;
  93.                           ET0=0;        
  94.               TR0=0;
  95.                           EA=1;
  96.                           Display_Arr(1);
  97.                   }
  98.                
  99.                   else if(mode == 2)                               //箭頭指向 "頻率"   說明是在加減頻率
  100.                   {
  101.                                 ET1=1;
  102.                           TR1=1;
  103.                           ET0=0;        
  104.               TR0=0;
  105.                     EA=1;
  106.                           Display_Arr(2);
  107.                   }
  108.                
  109.                   else if(mode == 3)                               //箭頭指向 "步進(jìn)值" 說明在加減步進(jìn)值
  110.                   {
  111.                                 ET1=1;
  112.                           TR1=1;
  113.                           ET0=0;        
  114.               TR0=0;
  115.                     EA=1;
  116.                           Display_Arr(3);
  117.                   }
  118. }


  119. /*****************************************************************************/
  120. /*                             按鍵動(dòng)作函數(shù)                                  */
  121. /*          按鍵  KEY_2 ~ KEY_4 三個(gè)按鍵由定時(shí)器1中斷掃描 有長按功能         */
  122. /*****************************************************************************/
  123. void KeyDown(uchar keycode)
  124. {
  125.         /*********************************/
  126.         /*            "+"鍵              */
  127.         /*********************************/        
  128.         if(keycode == 0x26)                          
  129.         {
  130.                 if(mode == 1)                                    //模式1 向右切換波形
  131.                 {
  132.                         Convert_Wave(1);
  133.                 }
  134.                
  135.                 else if(mode == 2)                               //模式2 增加頻率
  136.                 {
  137.                         Change_Rate(1);
  138.                 }
  139.                
  140.                 else if(mode == 3)                               //模式3 增加步進(jìn)值
  141.                 {
  142.                         Change_Step(1);
  143.                 }
  144.   }
  145.         /*********************************/
  146.         /*            "-"鍵              */
  147.         /*********************************/
  148.         else if(keycode == 0x28)                           
  149.         {
  150.                 if(mode == 1)                                    //模式1 向左切換波形
  151.                 {
  152.                         Convert_Wave(0);
  153.                 }
  154.                
  155.                 else if(mode == 2)                               //模式2 減小頻率
  156.                 {
  157.                         Change_Rate(0);
  158.                 }
  159.                
  160.                 else if(mode == 3)                               //模式3 減小步進(jìn)值
  161.                 {
  162.                         Change_Step(0);     
  163.                 }
  164.         }
  165.         /*********************************/
  166.         /*          模式清零鍵           */
  167.         /*********************************/        
  168.         else if(keycode == 0x0D)
  169.         {
  170.                 mode = 0;
  171.         }
  172. }



  173. /**********頻率設(shè)置函數(shù)****************/
  174. /************定時(shí)器0控制***************/
  175. void SetWaveRate(uint num_2)
  176. {
  177.         ulong tmp;                                             
  178.         tmp=(12000000/12)/(num_2*32);                            //定時(shí)器計(jì)數(shù)頻率 是波形頻率的32倍                                                                        
  179.         tmp=65536-tmp;                                           //計(jì)算定時(shí)器重載值                        
  180.   tmp=tmp+18;                                              //補(bǔ)償
  181.         T0RH=(uchar)(tmp>>8);                                    
  182.         T0RL=(uchar)tmp;
  183.         TMOD&=0xF0;                                          
  184.         TMOD|=0x01;                                          
  185.         TH0=T0RH;                                             
  186.         TL0=T0RL;
  187. }

  188. /**********定時(shí)器1初始化函數(shù)***********/
  189. /**********用于三個(gè)獨(dú)立按鍵掃

  190. …………限于本文篇幅 余下代碼請(qǐng)從51hei下載附件…………
復(fù)制代碼
0.png

所有制作資料下載:
15.12864簡易波形發(fā)生器.rar (86.24 KB, 下載次數(shù): 318)

評(píng)分

參與人數(shù) 3黑幣 +115 收起 理由
swap1 + 5
練氏 + 10
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:192253 發(fā)表于 2017-4-27 10:40 | 顯示全部樓層
請(qǐng)問這個(gè)波形取碼是用MATLAB得到的嗎?
回復(fù)

使用道具 舉報(bào)

ID:150346 發(fā)表于 2017-4-27 16:00 | 顯示全部樓層
逞強(qiáng) 發(fā)表于 2017-4-27 10:40
請(qǐng)問這個(gè)波形取碼是用MATLAB得到的嗎?

對(duì) 可以用MATLAB取得
回復(fù)

使用道具 舉報(bào)

ID:192253 發(fā)表于 2017-4-27 22:53 | 顯示全部樓層
fhx97 發(fā)表于 2017-4-27 16:00
對(duì) 可以用MATLAB取得

我是初學(xué)者。。。謝謝的,得到這個(gè)波形取碼之后是不是根據(jù)液晶對(duì)電壓的控制,然后就可以顯示出波形了?
回復(fù)

使用道具 舉報(bào)

ID:150346 發(fā)表于 2017-4-28 13:04 | 顯示全部樓層
逞強(qiáng) 發(fā)表于 2017-4-27 22:53
我是初學(xué)者。。。謝謝的,得到這個(gè)波形取碼之后是不是根據(jù)液晶對(duì)電壓的控制,然后就可以顯示出波形了?

通過單片機(jī)發(fā)數(shù)字信號(hào) 再經(jīng)過DAC0832和運(yùn)放UA741 輸出波形 液晶只是顯示作用
回復(fù)

使用道具 舉報(bào)

ID:196178 發(fā)表于 2017-5-3 20:01 | 顯示全部樓層
兄弟真的能用嗎
回復(fù)

使用道具 舉報(bào)

ID:150346 發(fā)表于 2017-5-3 20:21 | 顯示全部樓層

你可以試著做一下
回復(fù)

使用道具 舉報(bào)

ID:196178 發(fā)表于 2017-5-5 10:22 來自手機(jī) | 顯示全部樓層
fhx97 發(fā)表于 2017-5-3 20:21
你可以試著做一下

我現(xiàn)在波形能做出來了,可是12864的顯示有點(diǎn)問題
回復(fù)

使用道具 舉報(bào)

ID:150346 發(fā)表于 2017-5-6 08:27 | 顯示全部樓層
微涼深處 發(fā)表于 2017-5-5 10:22
我現(xiàn)在波形能做出來了,可是12864的顯示有點(diǎn)問題

先看看硬件電路連接有沒有問題,再檢查一下程序
回復(fù)

使用道具 舉報(bào)

ID:138990 發(fā)表于 2017-5-16 11:49 來自手機(jī) | 顯示全部樓層
剛好用到,真的謝謝啦,我們年級(jí)賽題目跟這個(gè)相似,我自己先做出來再改吧,謝謝啦!
回復(fù)

使用道具 舉報(bào)

ID:138990 發(fā)表于 2017-5-18 14:28 來自手機(jī) | 顯示全部樓層
微涼深處 發(fā)表于 2017-5-3 20:01
兄弟真的能用嗎

你的現(xiàn)在成功了嗎?
回復(fù)

使用道具 舉報(bào)

ID:203640 發(fā)表于 2017-5-25 22:42 | 顯示全部樓層
很好,多謝分享
回復(fù)

使用道具 舉報(bào)

ID:237672 發(fā)表于 2017-10-7 20:21 | 顯示全部樓層
能控制電壓的幅值嗎
回復(fù)

使用道具 舉報(bào)

ID:165330 發(fā)表于 2017-10-8 20:13 | 顯示全部樓層
安逸,,,
回復(fù)

使用道具 舉報(bào)

ID:134692 發(fā)表于 2017-10-8 20:33 | 顯示全部樓層
學(xué)習(xí)學(xué)習(xí),謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:266345 發(fā)表于 2017-12-25 10:03 | 顯示全部樓層
好東西,正好有用
回復(fù)

使用道具 舉報(bào)

ID:266345 發(fā)表于 2017-12-27 19:40 | 顯示全部樓層
你好,有沒有這個(gè)的電子原理圖啊
回復(fù)

使用道具 舉報(bào)

ID:166341 發(fā)表于 2017-12-28 15:40 | 顯示全部樓層
多謝分享,有空山寨看看
回復(fù)

使用道具 舉報(bào)

ID:269211 發(fā)表于 2018-1-26 20:55 | 顯示全部樓層
很好,多謝分享#在這里快速回復(fù)#
回復(fù)

使用道具 舉報(bào)

ID:295205 發(fā)表于 2018-3-25 12:27 | 顯示全部樓層
元器件的封裝庫沒有啊
回復(fù)

使用道具 舉報(bào)

ID:351420 發(fā)表于 2018-6-18 11:47 | 顯示全部樓層
您好,下載程序后,我不能生成hex文件,您知道是什么原因嗎
回復(fù)

使用道具 舉報(bào)

ID:445996 發(fā)表于 2019-4-22 21:32 | 顯示全部樓層
哪個(gè)運(yùn)放我有點(diǎn)不懂 能給我講解一下嗎
回復(fù)

使用道具 舉報(bào)

ID:87000 發(fā)表于 2019-4-23 12:43 | 顯示全部樓層
做著好玩。有時(shí)間做做看
回復(fù)

使用道具 舉報(bào)

ID:421805 發(fā)表于 2019-11-13 06:10 來自手機(jī) | 顯示全部樓層
能改變?cè)O(shè)計(jì)的頻率范圍嗎?
回復(fù)

使用道具 舉報(bào)

ID:755152 發(fā)表于 2020-5-20 19:47 | 顯示全部樓層
你好,請(qǐng)問你這個(gè)原理圖上面的LCD12864在Proteus中叫什么呀?你上傳附件里的Proteus在我的電腦里面打不開
回復(fù)

使用道具 舉報(bào)

ID:770821 發(fā)表于 2020-9-6 10:06 | 顯示全部樓層
可以直接拿來用嗎?怎么我波形顯示為亂碼。。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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