標(biāo)題: 51單片機(jī)+12864做的簡(jiǎn)易波形發(fā)生器 含源碼 已制作出實(shí)物(DAC0832+UA741運(yùn)放) [打印本頁(yè)]

作者: fhx97    時(shí)間: 2017-4-24 15:05
標(biāo)題: 51單片機(jī)+12864做的簡(jiǎn)易波形發(fā)生器 含源碼 已制作出實(shí)物(DAC0832+UA741運(yùn)放)
最近用51單片機(jī)+DAC0832+UA741運(yùn)放 做了個(gè)簡(jiǎn)易的波形發(fā)生器
LCD12864 顯示 ,可以產(chǎn)生正弦波 三角波 方波 按鍵切換波形 調(diào)整頻率和步進(jìn)值(按鍵可長(zhǎng)按)
有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 畫(huà)圖的人寫(xiě)錯(cuò)了。!
實(shí)物圖:


原理圖:


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

  1. /****************************************************************************************************************/
  2. /*                                           簡(jiǎn)易波形發(fā)生器 程序                                                */
  3. /*                                            編寫(xiě)者 :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ù)不同的模式變量 打開(kāi)或關(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)                               //箭頭指向 "波形"   說(shuō)明是在切換波形
  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)                               //箭頭指向 "頻率"   說(shuō)明是在加減頻率
  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)值" 說(shuō)明在加減步進(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中斷掃描 有長(zhǎng)按功能         */
  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ù)制代碼


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


作者: 逞強(qiáng)    時(shí)間: 2017-4-27 10:40
請(qǐng)問(wèn)這個(gè)波形取碼是用MATLAB得到的嗎?
作者: fhx97    時(shí)間: 2017-4-27 16:00
逞強(qiáng) 發(fā)表于 2017-4-27 10:40
請(qǐng)問(wèn)這個(gè)波形取碼是用MATLAB得到的嗎?

對(duì) 可以用MATLAB取得
作者: 逞強(qiáng)    時(shí)間: 2017-4-27 22:53
fhx97 發(fā)表于 2017-4-27 16:00
對(duì) 可以用MATLAB取得

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

通過(guò)單片機(jī)發(fā)數(shù)字信號(hào) 再經(jīng)過(guò)DAC0832和運(yùn)放UA741 輸出波形 液晶只是顯示作用
作者: 微涼深處    時(shí)間: 2017-5-3 20:01
兄弟真的能用嗎
作者: fhx97    時(shí)間: 2017-5-3 20:21
微涼深處 發(fā)表于 2017-5-3 20:01
兄弟真的能用嗎

你可以試著做一下
作者: 微涼深處    時(shí)間: 2017-5-5 10:22
fhx97 發(fā)表于 2017-5-3 20:21
你可以試著做一下

我現(xiàn)在波形能做出來(lái)了,可是12864的顯示有點(diǎn)問(wèn)題

作者: fhx97    時(shí)間: 2017-5-6 08:27
微涼深處 發(fā)表于 2017-5-5 10:22
我現(xiàn)在波形能做出來(lái)了,可是12864的顯示有點(diǎn)問(wèn)題

先看看硬件電路連接有沒(méi)有問(wèn)題,再檢查一下程序
作者: 逆風(fēng)丶蒲公英灬    時(shí)間: 2017-5-16 11:49
剛好用到,真的謝謝啦,我們年級(jí)賽題目跟這個(gè)相似,我自己先做出來(lái)再改吧,謝謝啦!
作者: 逆風(fēng)丶蒲公英灬    時(shí)間: 2017-5-18 14:28
微涼深處 發(fā)表于 2017-5-3 20:01
兄弟真的能用嗎

你的現(xiàn)在成功了嗎?
作者: 安茲烏爾恭    時(shí)間: 2017-5-25 22:42
很好,多謝分享
作者: 無(wú)名小卒1    時(shí)間: 2017-10-7 20:21
能控制電壓的幅值嗎
作者: 浩潔nice    時(shí)間: 2017-10-8 20:13
安逸,,,
作者: zhhufe    時(shí)間: 2017-10-8 20:33
學(xué)習(xí)學(xué)習(xí),謝謝分享
作者: LMIREE    時(shí)間: 2017-12-25 10:03
好東西,正好有用

作者: LMIREE    時(shí)間: 2017-12-27 19:40
你好,有沒(méi)有這個(gè)的電子原理圖啊
作者: Jerry0925    時(shí)間: 2017-12-28 15:40
多謝分享,有空山寨看看
作者: chaoself    時(shí)間: 2018-1-26 20:55
很好,多謝分享#在這里快速回復(fù)#
作者: 847339305    時(shí)間: 2018-3-25 12:27
元器件的封裝庫(kù)沒(méi)有啊
作者: 苡翾168    時(shí)間: 2018-6-18 11:47
您好,下載程序后,我不能生成hex文件,您知道是什么原因嗎
作者: 許你一世柔情    時(shí)間: 2019-4-22 21:32
哪個(gè)運(yùn)放我有點(diǎn)不懂 能給我講解一下嗎
作者: 西點(diǎn)鐘靈毓秀    時(shí)間: 2019-4-23 12:43
做著好玩。有時(shí)間做做看
作者: luchuancai    時(shí)間: 2019-11-13 06:10
能改變?cè)O(shè)計(jì)的頻率范圍嗎?
作者: 重山    時(shí)間: 2020-5-20 19:47
你好,請(qǐng)問(wèn)你這個(gè)原理圖上面的LCD12864在Proteus中叫什么呀?你上傳附件里的Proteus在我的電腦里面打不開(kāi)

作者: hundunshan    時(shí)間: 2020-9-6 10:06
可以直接拿來(lái)用嗎?怎么我波形顯示為亂碼。。。。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1