51单片机可调周期参数波形发生器源程序和Proteus仿真

[复制链接]
查看34 | 回复0 | 2021-4-21 22:48:44 | 显示全部楼层 |阅读模式
单片机设计—波形发生器,波形可选择、幅值周期可编辑、含有lcd0832显示屏、led数码管、矩阵键盘输入。通过lcd12864显示屏显示当前状态,根据提示通过矩阵键盘输入波形类型、波形幅值周期等参数,通过led显示屏显示实时电压,通过dac0832输出波形。
仿真原理图如下(proteus仿真工程文件和完整单片机C语言源码可到本帖附件中下载)
1.png 2.png 3.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. …………限于本文篇幅 余下代码请下载附件…………
复制代码
波形发生器仿真文件和C源程序.zip (816.98 KB, 售价: 5 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则