Generador de señales basado en 51 microcomputadoras de un solo chip

contenido

1. Función del proyecto

2. Simulación

3. Procedimiento


Dirección de descarga de datos: generador de señales basado en 51 microcomputadoras de un solo chip

1. Función del proyecto

1. Salida de onda rectangular, onda trapezoidal, onda triangular, onda de diente de sierra, onda sinusoidal cinco tipos de formas de onda;

2. La frecuencia de cada forma de onda se puede cambiar;

3. La pantalla china lcd12864 se utiliza para mostrar formas de onda e información relacionada;

2. Simulación

 

onda sinusoidal 

Onda triangular 

ola cuadrada

onda de diente de sierra

3. Procedimiento

#include <reg52.h>
#include <math.h>
#include <intrins.h>
#include <lcd12864.h>

#define DAC_OUT	P2

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

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

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

uchar code Square_wave[64]=                                  //方波
{
    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,
    0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,
    255,255,255,255,255,255,255,255,255,255,255,255,255,255,
    255,255,255,255,255,255,
};

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

void wave_delay()                         //波形延时函数
{
    int a,b;
    for(a=1; a>0; a--)
        for(b=122; b>0; b--);
}

void wave_init()             //波形发生模块的初始化(外部中断0、1)
{
    EA=1;
    IT0=1;             //下降沿触发
    EX0=1;
    IT1=1;
    EX1=1;
}

void disp_wave(uchar *wave)   //显示波形函数
{
    uchar page,i;
    uint date;
    select(1);								//选择左屏
    for(i=32; i<64; i++)
    {
        page=7-(wave[i]/4)/8;
        date=7-(wave[i]/4)%8;
        date=pow(2,date);
        setpos(page,i);				//选择行列
        lcd_wdat(date);
    }
    select(2);								//选择右屏
    for(i=0; i<64; i++)
    {
        page=7-(wave[i]/4)/8;
        date=7-(wave[i]/4)%8;
        date=pow(2,date);
        setpos(page,i);				//选择行列
        lcd_wdat(date);
    }
}

void main()
{

    lcd_init();
    clr_screen();
    which_wave=&Sine_wave[0];
    disp_chinese();
    disp_function(chinese_sine);
    disp_rate(400);
    disp_xy();
    disp_wave(which_wave);
    wave_init();
    while(1)
    {
        delay_time=rate;            //rate=0时,12mhz下,为400hz的波形。循环一次的时间为0.00025ms
        DAC_OUT=*(which_wave+k);
        k++;
        if(k==64)
            k=0;
        while(delay_time)
            delay_time--;
    }
}

void int0() interrupt 0    //波形选择中断服务程序
{
    EX0=0;
    wave_delay();
    mode++;
    if(mode==4)
        mode=0;
    switch(mode)
    {
    case 0 :																				//显示正弦波
        which_wave=&Sine_wave[0];
        which_wave2=&chinese_sine[0];
        break;
    case 1 :																				//显示三角波
        which_wave=&Triangular_Wave[0];
        which_wave2=&chinese_triangular[0];
        break;
    case 2 :																				//显示方波
        which_wave=&Square_wave[0];
        which_wave2=&chinese_square[0];
        break;
    case 3 :																				//显示锯齿波
        which_wave=&Sawtooth_Wave[0];
        which_wave2=&chinese_sawtooth[0];
        break;
    }
    wave_delay();
    clr_screen();																		
    disp_chinese();																
    disp_rate(400/rate);
    disp_function(which_wave2);
    disp_xy();
    disp_wave(which_wave);
    while(!change_wave);
    EX0=1;
}

Supongo que te gusta

Origin blog.csdn.net/qq_35654286/article/details/124254416
Recomendado
Clasificación