51单片机函数信号发生器程序 LCD12864显示波形 Proteus仿真图

[复制链接]
查看33 | 回复0 | 2021-4-30 01:11:20 | 显示全部楼层 |阅读模式
51单片机制作的函数信号发生器设计 Proteus仿真
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
1.png

部分源码:完整源码见附件
  1. #include <reg52.h>
  2. #include <math.h>
  3. #include <intrins.h>
  4. #include <lcd12864.h>

  5. #define DAC_OUT        P2

  6. sbit change_wave=P3^2;               //改变波形按键
  7. sbit change_rate=P3^3;               //改变频率按键
  8. uchar mode=0,rate=0,delay_time=0,k,p; //为波形发生模块提供中间变量
  9. uchar *which_wave,*which_wave2;                    
  10. uint rate_num;

  11. uchar code Sine_wave[64]=                                    //DA输出对应电压值对应的数字量,正弦波
  12. {
  13.     128,114,102,90,78,66,55,45,36,28,20,14,9,5,2,1,1,1,
  14.     3,7,11,17,24,32,41,50,61,72,84,96,108,121,133,146,
  15.     158,170,182,193,204,213,222,230,237,243,247,251,253,
  16.     254,254,252,249,245,240,234,226,218,209,199,188,176,
  17.     167,158,145,135
  18. };

  19. uchar code Sawtooth_Wave[64]=                                //锯齿波
  20. {
  21.     255,251,247,243,239,235,231,227,223,219,215,210,206,202,
  22.     198,194,190,186,182,178,174,170,166,162,158,154,150,146,
  23.     142,138,134,130,125,121,117,113,109,105,101,97,93,89,85,
  24.     81,77,73,69,61,57,53,49,45,40,36,32,28,24,20,16,12,8,4,0
  25. };

  26. uchar code Square_wave[64]=                                  //方波
  27. {
  28.     0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  29.     0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,
  30.     255,255,255,255,255,255,255,255,255,255,255,255,255,255,
  31.     255,255,255,255,255,255,
  32. };

  33. uchar code Triangular_Wave[64]=                              //三角波
  34. {
  35.     0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,
  36.     144,152,160,168,176,184,192,200,208,216,224,232,240,248,
  37.     248,240,232,224,216,208,200,192,184,176,168,160,152,144,
  38.     136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
  39. };

  40. void wave_delay()                         //波形延时函数
  41. {
  42.     int a,b;
  43.     for(a=1; a>0; a--)
  44.         for(b=122; b>0; b--);
  45. }

  46. void wave_init()             //波形发生模块的初始化(外部中断0、1)
  47. {
  48.     EA=1;
  49.     IT0=1;             //下降沿触发
  50.     EX0=1;
  51.     IT1=1;
  52.     EX1=1;
  53. }

  54. void disp_wave(uchar *wave)   //显示波形函数
  55. {
  56.     uchar page,i;
  57.     uint date;
  58.     select(1);                                                                //选择左屏
  59.     for(i=32; i<64; i++)
  60.     {
  61.         page=7-(wave[i]/4)/8;
  62.         date=7-(wave[i]/4)%8;
  63.         date=pow(2,date);
  64.         setpos(page,i);                                //选择行列
  65.         lcd_wdat(date);
  66.     }
  67.     select(2);                                                                //选择右屏
  68.     for(i=0; i<64; i++)
  69.     {
  70.         page=7-(wave[i]/4)/8;
  71.         date=7-(wave[i]/4)%8;
  72.         date=pow(2,date);
  73.         setpos(page,i);                                //选择行列
  74.         lcd_wdat(date);
  75.     }
  76. }

  77. void main()
  78. {

  79.     lcd_init();
  80.     clr_screen();
  81.     which_wave=&Sine_wave[0];
  82.     disp_chinese();
  83.     disp_function(chinese_sine);
  84.     disp_rate(400);
  85.     disp_xy();
  86.     disp_wave(which_wave);
  87.     wave_init();
  88.     while(1)
  89.     {
  90.         delay_time=rate;            //rate=0时,12mhz下,为400hz的波形。循环一次的时间为0.00025ms
  91.         DAC_OUT=*(which_wave+k);
  92.         k++;
  93.         if(k==64)
  94.             k=0;
  95.         while(delay_time)
  96.             delay_time--;
  97.     }
  98. }

  99. void int0() interrupt 0    //波形选择中断服务程序
  100. {
  101.     EX0=0;
  102.     wave_delay();
  103.     mode++;
  104.     if(mode==4)
  105.         mode=0;
  106.     switch(mode)
  107.     {
  108.     case 0 :                                                                                                                                                                //显示正弦波
  109.         which_wave=&Sine_wave[0];
  110.         which_wave2=&chinese_sine[0];
  111.         break;
  112.     case 1 :                                                                                                                                                                //显示三角波
  113.         which_wave=&Triangular_Wave[0];
  114.         which_wave2=&chinese_triangular[0];
  115.         break;
  116.     case 2 :                                                                                                                                                                //显示方波
  117.         which_wave=&Square_wave[0];
  118.         which_wave2=&chinese_square[0];
  119.         break;
  120.     case 3 :                                                                                                                                                                //显示锯齿波
  121.         which_wave=&Sawtooth_Wave[0];
  122.         which_wave2=&chinese_sawtooth[0];
  123.         break;
  124.     }
  125.     wave_delay();
  126.     clr_screen();                                                                                                                                                
  127.     disp_chinese();                                                                                                                                
  128.     disp_rate(400/rate);
  129.     disp_function(which_wave2);
  130.     disp_xy();
  131.     disp_wave(which_wave);
  132.     while(!change_wave);
  133.     EX0=1;
  134. }

  135. void int1() interrupt 2       //频率选择
  136. {
  137.     EX1=0;
  138.     wave_delay();
  139.     p++;
  140.     if(p==50)
  141.         p=0;
  142.     rate=p;
  143.     wave_delay();
  144.     rate_num=1/((0.000036+0.000006*rate)*64);
  145.     clc_rate();
  146.     disp_rate(rate_num);
  147.     while(!change_rate);
  148.     EX1=1;
  149. }
复制代码

Proteus仿真和51单片机C源码.zip (108.81 KB, 售价: 2 工控币)
回复

使用道具 举报

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

本版积分规则