欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 51單片機+12864做的簡易波形發生器 含源碼 已制作出實物(DAC0832+UA741運放) [打印本頁]

作者: fhx97    時間: 2017-4-24 15:05
標題: 51單片機+12864做的簡易波形發生器 含源碼 已制作出實物(DAC0832+UA741運放)
最近用51單片機+DAC0832+UA741運放 做了個簡易的波形發生器
LCD12864 顯示 ,可以產生正弦波 三角波 方波 按鍵切換波形 調整頻率和步進值(按鍵可長按)
有24C02掉電儲存設置的數據
頻率不高 10HZ~600HZ(頻率高了有點誤差)
由單片機定時器中斷產生數字信號 DAC0832轉換 運放調幅
能力有限 和大家分享一下~ ~

注意原理圖 DA轉換電路的芯片是DAC0832 畫圖的人寫錯了!!!
實物圖:


原理圖:


部分單片機源程序預覽:

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

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

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

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

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

  18. uchar code sin[32]={                                             //此數組內的數據為,DA輸出對應電壓值對應的數字量,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]={                                                 //一個周期是采樣32個點, 所以數組內是32個數據
  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. /*****************子函數聲明*****************/
  36. void Timer1Init(uint ms);
  37. void SetWaveRate(uint num_2);
  38. void Control_Key();
  39. void Refresh_Out();
  40. /*****************************************************************************/
  41. /*                                 主函數                                    */
  42. /*****************************************************************************/
  43. void main()
  44. {
  45.         Timer1Init(1);                          //初始化定時器1 定時1ms
  46.         LcdInit();                              //初始化12864
  47.         Init_Display();                         //顯示固定內容
  48.         Init_OutPut();                          //初始化輸出數據和顯示

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

  56. /*****************************************************************************/
  57. /*                             按鍵控制函數                                  */
  58. /*               按鍵KEY_1 :用延時函數判斷按下 控制模式變換                  */
  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. /*                            更新輸出函數                                   */
  75. /*                      根據不同的模式變量 打開或關閉波形輸出                */
  76. /*****************************************************************************/
  77. void Refresh_Out()
  78. {
  79.                         if(mode == 0)                                    //不顯示箭頭   輸出波形 獨立按鍵關閉
  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)                               //箭頭指向 "步進值" 說明在加減步進值
  110.                   {
  111.                                 ET1=1;
  112.                           TR1=1;
  113.                           ET0=0;        
  114.               TR0=0;
  115.                     EA=1;
  116.                           Display_Arr(3);
  117.                   }
  118. }


  119. /*****************************************************************************/
  120. /*                             按鍵動作函數                                  */
  121. /*          按鍵  KEY_2 ~ KEY_4 三個按鍵由定時器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 增加步進值
  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 減小步進值
  161.                 {
  162.                         Change_Step(0);     
  163.                 }
  164.         }
  165.         /*********************************/
  166.         /*          模式清零鍵           */
  167.         /*********************************/        
  168.         else if(keycode == 0x0D)
  169.         {
  170.                 mode = 0;
  171.         }
  172. }



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

  188. /**********定時器1初始化函數***********/
  189. /**********用于三個獨立按鍵掃

  190. …………限于本文篇幅 余下代碼請從51hei下載附件…………
復制代碼


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


作者: 逞強    時間: 2017-4-27 10:40
請問這個波形取碼是用MATLAB得到的嗎?
作者: fhx97    時間: 2017-4-27 16:00
逞強 發表于 2017-4-27 10:40
請問這個波形取碼是用MATLAB得到的嗎?

對 可以用MATLAB取得
作者: 逞強    時間: 2017-4-27 22:53
fhx97 發表于 2017-4-27 16:00
對 可以用MATLAB取得

我是初學者。。。謝謝的,得到這個波形取碼之后是不是根據液晶對電壓的控制,然后就可以顯示出波形了?
作者: fhx97    時間: 2017-4-28 13:04
逞強 發表于 2017-4-27 22:53
我是初學者。。。謝謝的,得到這個波形取碼之后是不是根據液晶對電壓的控制,然后就可以顯示出波形了?

通過單片機發數字信號 再經過DAC0832和運放UA741 輸出波形 液晶只是顯示作用
作者: 微涼深處    時間: 2017-5-3 20:01
兄弟真的能用嗎
作者: fhx97    時間: 2017-5-3 20:21
微涼深處 發表于 2017-5-3 20:01
兄弟真的能用嗎

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

我現在波形能做出來了,可是12864的顯示有點問題

作者: fhx97    時間: 2017-5-6 08:27
微涼深處 發表于 2017-5-5 10:22
我現在波形能做出來了,可是12864的顯示有點問題

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

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

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

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




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