久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4161|回復: 4
收起左側

單片機可調周期參數波形發生器源程序(dac0832、矩陣鍵盤、lcd12864、Proteus仿真)

[復制鏈接]
ID:451453 發表于 2021-4-21 20:20 | 顯示全部樓層 |閱讀模式
單片機設計—波形發生器,波形可選擇、幅值周期可編輯、含有lcd0832顯示屏、led數碼管、矩陣鍵盤輸入。通過lcd12864顯示屏顯示當前狀態,根據提示通過矩陣鍵盤輸入波形類型、波形幅值周期等參數,通過led顯示屏顯示實時電壓,通過dac0832輸出波形。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png 51hei.png 51hei.png 51hei.png 51hei.png

1.    輸出矩形波、梯形波、三角波、鋸齒波、正弦波五種波形;
2.    每種波形的周期可更改;
3.    每種波形的幅值可更改;
4.    采用lcd12864中文顯示屏顯示波形輸入輸出信息;
5.    采用數碼管顯示實時電壓。

單片機源程序如下:
  1. /**************************************************************************************
  2. * 設計一個能產生正弦、方波、三角波、梯形波等波形的波形發生器,周期頻率可調。
  3. * 其他附加功能:
  4. *
  5. 總得看一下有沒有重復定義的io口

  6. ***************************************************************************************/

  7. #include "reg52.h"    //此文件中定義了單片機的一些特殊功能寄存器
  8. #include "DAC0832.h"
  9. #include "lcd12864.h"
  10. #include "key.h"


  11. sbit test_led=P3^0;
  12. sbit test_led1=P3^1;

  13. sbit seg_k1=P3^3;
  14. sbit seg_k2=P3^4;

  15. int boxing=0;
  16. int zhouqi=0;
  17. float fuzhi=0;


  18. char code Hz_0[]=
  19. {0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,
  20. 0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,};
  21. char code Hz_1[]=
  22. {0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,
  23. 0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,};
  24. char code Hz_2[]=
  25. {0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,
  26. 0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
  27. };
  28. char code Hz_3[]=
  29. {0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,
  30. 0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,
  31. };
  32. char code Hz_4[]=
  33. {0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,
  34. 0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,
  35. };
  36. char code Hz_5[]=
  37. {0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,
  38. 0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,
  39. };
  40. char code Hz_6[]=
  41. {0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,
  42. 0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,
  43. };
  44. char code Hz_7[]=
  45. {0x00,0x18,0x08,0x08,0x88,0x68,0x18,0x00,
  46. 0x00,0x00,0x00,0x3E,0x01,0x00,0x00,0x00,
  47. };
  48. char code Hz_8[]=
  49. {0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,
  50. 0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
  51. };
  52. char code Hz_9[]=
  53. {0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,
  54. 0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,
  55. };
  56. char code Hz_dian[]=
  57. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  58. 0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,
  59. };

  60. extern u8 KeyValue;

  61. int flag=1;//推出while
  62. unsigned int key_time;//判斷輸入了幾個數

  63. unsigned int time_count=0;//幅值換算
  64. unsigned int time_loop=0;  //周期換算
  65. unsigned int time_count_h=0;  //周期換算H
  66. unsigned int time_count_l=0;  //周期換算L

  67. void main_delay(int x)
  68. {while(x--);}

  69. void Int0Init()
  70. {
  71. //設置 INT0
  72. IT0=1;//跳變沿出發方式(下降沿)
  73. EX0=1;//打開 INT0 的中斷允許。
  74. EA=1;//打開總中斷
  75. }

  76. /*******************************************************************************
  77. * 函 數 名       : main
  78. * 函數功能                 : 主函數
  79. * 輸    入       : 無
  80. * 輸    出             : 無
  81. *******************************************************************************/
  82. void main()
  83. {
  84.         Int0Init();
  85.         output_xinxi();//顯示姓名信息
  86.         
  87.         while(flag);
  88.         test_led=1;
  89.         test_led1=1;
  90.         while(1)
  91.         {
  92.                 flag=1;
  93.                 switch (boxing)
  94.                         {case (0): //矩形波
  95.                                                                 time_loop=zhouqi*100/65;
  96.                                                                 time_count_l=(int)(fuzhi*10)%10;
  97.                                                                 time_count_h=fuzhi;
  98.                                                                 time_count=(51*time_count_h+5*time_count_l);                                                               
  99.                                                                 while (flag)
  100.                                                                          {P2=Rectangular_wave(time_loop,time_count_h,time_count_l,time_count);}
  101.                                                                  break;//
  102.                          case (1):time_count=fuzhi*52;    //幅值換算結果   //鋸齒波
  103.                                                                          time_loop=(zhouqi*1000/time_count-195)/20;
  104.                                                                          while(flag)
  105.                                                                          {P2=Sawtooth_wave(time_loop,time_count);}   
  106.                                                                          break;
  107.                                                                         
  108.                          case (2):time_count=zhouqi*10/30;
  109.                                                                          test_led=0;
  110.                                                                          while(flag)
  111.                                                                          {P2=Sine_wave(time_count,fuzhi);}
  112.                                                                                 break;
  113.                         case (3):time_count=fuzhi*52;    //幅值換算結果   //三角波
  114.                                                                          time_loop=(zhouqi*1000/time_count-195)/20;
  115.                                                                          while(flag)
  116.                                                                          {P2=Triangle_wave(time_loop,time_count);}   
  117.                                                                          break;                                         
  118.                         case (4):time_count=fuzhi*104;    //幅值換算結果   //梯形波
  119.                                                                          time_loop=(zhouqi*1000/time_count-195)/20;
  120.                                                                          while(flag)
  121.                                                                          {P2=Trapezoidal_wave(time_loop,time_count);}   
  122.                                                                          break;                                                
  123.                   }
  124.                 }
  125. }

  126. void Int0() interrupt 0 //外部中斷 0 的中斷函數
  127. {        
  128.         main_delay(1000); //延時消抖
  129.         Clr_Scr();
  130.         seg_k1=1;
  131.         seg_k2=1;
  132.         boxing=0;
  133.         zhouqi=0;
  134.         fuzhi=0;
  135.         main_delay(1000);
  136.         KeyValue=0;
  137.         
  138.         output_shuru();
  139.         main_delay(100000);
  140.                
  141.         //檢測波形        
  142.         while((KeyValue!=11))
  143.                                 {KeyDown();}                        
  144.         output_boxing();
  145.         main_delay(100000);
  146.         KeyValue=0;                                 
  147.         key_time=0;                        
  148.         while((KeyValue!=11))                 
  149.           {
  150.                         KeyValue=15;                     
  151.                                 while(KeyValue==15)
  152.                                         {KeyDown();}
  153.                                         main_delay(100000);
  154.                                 LCDMcs=1; //右屏開顯示
  155.                                 LCDScs=0;
  156.                         switch(KeyValue)
  157.                                 {
  158.                                  case(0):hz_LCDDisp8(2,key_time+0,Hz_0);key_time=key_time+8;break;
  159.                                  case(1):hz_LCDDisp8(2,key_time+0,Hz_1);key_time=key_time+8;break;
  160.                                  case(2):hz_LCDDisp8(2,key_time+0,Hz_2);key_time=key_time+8;break;
  161.                                  case(3):hz_LCDDisp8(2,key_time+0,Hz_3);key_time=key_time+8;break;
  162.                                  case(4):hz_LCDDisp8(2,key_time+0,Hz_4);key_time=key_time+8;break;
  163.                                  case(5):hz_LCDDisp8(2,key_time+0,Hz_5);key_time=key_time+8;break;
  164.                                  case(6):hz_LCDDisp8(2,key_time+0,Hz_6);key_time=key_time+8;break;
  165.                                  case(7):hz_LCDDisp8(2,key_time+0,Hz_7);key_time=key_time+8;break;
  166.                                  case(8):hz_LCDDisp8(2,key_time+0,Hz_8);key_time=key_time+8;break;
  167.                                  case(9):hz_LCDDisp8(2,key_time+0,Hz_9);key_time=key_time+8;break;
  168.                            case(10):hz_LCDDisp8(2,key_time+0,Hz_dian);key_time=key_time+8;break;

  169.                                  default:break;
  170.                     }
  171.                                 if (KeyValue!=11)
  172.                                 boxing=KeyValue;
  173.                         }

  174. //檢測周期
  175. while((KeyValue!=11))
  176.                                 {KeyDown();}                        
  177.         output_zhouqi();                        
  178.                         KeyValue=0;                                 
  179.         key_time=0;                        
  180.         while((KeyValue!=11))                 
  181.           {
  182.                         KeyValue=15;                     
  183.                                 while(KeyValue==15)
  184.                                         {KeyDown();}
  185.                                         main_delay(100000);
  186.                                 LCDMcs=1; //右屏開顯示
  187.                                 LCDScs=0;
  188.                         switch(KeyValue)
  189.                                 {
  190.                                  case(0):hz_LCDDisp8(4,key_time+0,Hz_0);key_time=key_time+8;break;
  191.                                  case(1):hz_LCDDisp8(4,key_time+0,Hz_1);key_time=key_time+8;break;
  192.                                  case(2):hz_LCDDisp8(4,key_time+0,Hz_2);key_time=key_time+8;break;
  193.                                  case(3):hz_LCDDisp8(4,key_time+0,Hz_3);key_time=key_time+8;break;
  194.                                  case(4):hz_LCDDisp8(4,key_time+0,Hz_4);key_time=key_time+8;break;
  195.                                  case(5):hz_LCDDisp8(4,key_time+0,Hz_5);key_time=key_time+8;break;
  196.                                  case(6):hz_LCDDisp8(4,key_time+0,Hz_6);key_time=key_time+8;break;
  197.                                  case(7):hz_LCDDisp8(4,key_time+0,Hz_7);key_time=key_time+8;break;
  198.                                  case(8):hz_LCDDisp8(4,key_time+0,Hz_8);key_time=key_time+8;break;
  199.                                  case(9):hz_LCDDisp8(4,key_time+0,Hz_9);key_time=key_time+8;break;
  200.                            case(10):hz_LCDDisp8(4,key_time+0,Hz_dian);key_time=key_time+8;break;
  201.                                  default:break;
  202.                     }
  203.                                 if (KeyValue!=11)
  204.                                 zhouqi=KeyValue+zhouqi*10;
  205.                         }
  206.                         
  207.         //檢測幅值
  208. while((KeyValue!=11))
  209.                                 {KeyDown();}                        
  210.         output_fuzhi();                        
  211.                         KeyValue=0;                                 
  212.         key_time=0;                        
  213.         while((KeyValue!=11))                 
  214.           {
  215.                         KeyValue=15;                     
  216.                                 while(KeyValue==15)
  217.                                         {KeyDown();}
  218. ……………………

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

Keil代碼與Proteus8.8版本仿真下載:
波形發生器.7z (1.18 MB, 下載次數: 170)

評分

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

查看全部評分

回復

使用道具 舉報

ID:32289 發表于 2021-4-22 19:31 | 顯示全部樓層
生成方波頻率最高能到多少啊?
回復

使用道具 舉報

ID:262 發表于 2022-5-5 18:21 | 顯示全部樓層
需要用Proteus8.8打開才可以,然后按圖1操作






回復

使用道具 舉報

ID:768534 發表于 2022-5-5 22:46 | 顯示全部樓層
學習了51的波形輸出,便于stm32的開發

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品一区二区久久 | 九九久久在线看 | 欧美日韩高清免费 | 国产精彩视频 | 国产精品亚洲精品久久 | 国产精品激情在线 | 亚洲欧美一区二区三区视频 | 亚洲精品在线国产 | 亚洲 欧美 另类 日韩 | 免费av观看 | 奇米影视首页 | 亚洲一区国产精品 | 久久九九99 | 日本成人中文字幕在线观看 | 国产高清视频在线 | 黄色免费网站在线看 | 亚洲视频在线观看免费 | 国产在线观看一区二区 | 精品国产伦一区二区三区观看方式 | 一区二区三区视频在线免费观看 | 亚洲午夜av | 丁香婷婷综合激情五月色 | 亚洲精品福利视频 | 黄色国产视频 | 一区日韩 | 日韩毛片播放 | 午夜精品 | 欧美一区二区三区视频 | 久久亚洲一区二区三区四区 | 香蕉久久网| 亚洲va中文字幕 | 日本精品一区二区三区在线观看视频 | 国产成人精品一区二区三区网站观看 | 91精品国产综合久久久久 | 国产精品xxxx| 日韩色在线 | 亚州精品天堂中文字幕 | 国产精品国产成人国产三级 | 女同久久另类99精品国产 | 在线欧美亚洲 | 一区在线观看视频 |