Red de conocimiento informático - Material del sitio web - ¿Cómo escribir un programa basado en la implementación de forma de onda SPWM del microcontrolador de la serie STC51? ¿Cómo escribir un programa?

¿Cómo escribir un programa basado en la implementación de forma de onda SPWM del microcontrolador de la serie STC51? ¿Cómo escribir un programa?

/************************************************ * *******

// La relación de portadora se selecciona como N=24, la relación de modulación M=Uc/Ur=1 y la frecuencia del cristal es 12M

// Frecuencia de onda sinusoidal 50 Hz

// Ancho de nivel alto Tpw = Tt/2*(1+Msimwt)

// Ancho de nivel bajo Tpw = Tt/2*(1- Msimwt)

// Tt period

/// T2 se utiliza para generar la forma de onda SPWM y la salida desde P1^1, conectado a P3. 4 Utilice un cable como frecuencia de prueba.

// T1 funciona en modo de temporización 1, el tiempo de temporización es de 1 segundo

// T0 funciona en modo de conteo, cuenta los pulsos de entrada y genera una interrupción cuando se produce un desbordamiento.

// El valor máximo del contador de 16 bits es 65536 y puede haber múltiples desbordamientos en 1 segundo, por lo que el controlador de interrupciones contará el número de interrupciones

// Después de 1 segundo, el valor del contador se extraerá del contador de interrupciones para un procesamiento completo y los datos procesados ​​se enviarán a la pantalla de visualización.

// Cálculo de la frecuencia de la señal:

// T0 funciona en modo de conteo, asumiendo que C1 se desborda en 1 segundo y el último valor de conteo no desbordado es C2, entonces la fórmula de frecuencia es : :

// F=C1*2^16+C2 = C1*65536+TH0*256+TL0)

// Utiliza reloj de 12MHz.

#include "reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar disp[8] ={0,0,0,0,0,0,0,0,0,0};

uchar FreStr[]="La frecuencia es:";

uchar T0count ,T1count;

código uchar x[]={66,38,26,89,15,97,7,102,2,103,1,102,2,

97,7,89, 15,78,26,66,38,38,66,26,78,15,

89,7,97,2,102,1,103,1,103,2,102,7,97,15,

89,26,78,38,66};

uchar ky,kc,count=255;

sbit L1=P1^1;

void delayms( uchar ms)

{

uchar i

mientras(ms--)

{

for(i = 0; i < 120; i++

}

}

}

}

// Comience a definir LCD

// Los siguientes tres pines definen LCD

sbit lcden=P0^5;

sbit lcdwrite= P0^ 6;

sbit lcdrs=P0^7;

//Programa de retraso

retraso nulo (uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0; y- -);

}

//comando de escritura LCD

void write_com(uchar com)

{

lcdrs=0 ;

lcden=0;

P2=com;

retraso(5);

lcden=1;

delay(5);

lcden=0;

}

// Escribir datos para lcd

void write_data(uchar da)

{

lcdrs=1;

lcden=0;

P2=da;

retraso(5 );

lcden=1;

retraso(5);

lcden=0;

}

//Inicialización

void Lcd_init()

{

lcdwrite=0;

lcden=0;

write_com(0x38); //Pantalla de 16*2, 5*7 puntos, datos de 8 bits

write_com(0x0c); //Abrir pantalla, cerrar cursor

write_com (0x06); //Mover el cursor

write_com(0x01);//Borrar la pantalla LCD

}

//Fin de la definición de LCD

p >

//Calcular valor de frecuencia

/

void calc()

{

uchar i;

frecuencia larga

cy;

frecuencia=(T0count*256+TH0)*256+TL0;

for(i=7;i>0;i--)

{

disp[i]=frecuencia%10;

frecuencia=frecuencia/10;

}

disp[0] =frecuencia;

}

void init()<

{

T0count=0;

T1count =0;

TH0=0;

TL0=0;

}

void main()

{

uchar dis;

init().

Lcd_init();

TMOD=0x15;

TH1=(65536-5*110592/12)/256;

TL1=(65536-5*110592/12)/256%10;

ET1=1;

ET0=1;

EA=1;

TR1=1;

TR0=1;

//La función de las siguientes cuatro oraciones es formar un pulso de 1000Hz en el pin P1.1. Después de cambiar los valores iniciales de los 8 bits superiores y los 8 bits inferiores, se pueden generar pulsos de diferentes frecuencias.

T2MOD = 0x02;

TH2=255-x[ky];

TL2=255-x[ky];

ET2=1;

EX0=1;

TR2=1;

L1=1;

write_com( 0x80);

for(dis=0; dis<12;dis++)

write_data(FreStr[dis]);

mientras(1)

{

write_com(0xC0);

for(dis =0;dis<8;dis++)

write_data(disp[dis]+0x30); //Mostrar frecuencia

}

}

//Calcular el número de pulsos de entrada

void time0() interrupción 1

{

T0count++;

}

/ Calcular 1s de tiempo

tiempo vacío1() interrupción 3

{

TH1=(65536-5*110592/12)/256;

TL1=(65536-5*110592/12)/256%10;

if(T1count==20)

{

calc();

init();

}

else T1count++;

}

Este es el proceso de generación de la forma de onda SPWM,

void M() interrupción 5

{

TH2=255-x[ky];

TL2=255-x[ky];

kc++; >

if(kc==cuenta)

{

kc=0;<

L1=~L1;

ky++;

if(ky==49) ky=0;

}

}

// Este es el uso de interrupción externa 0, se puede utilizar para ajustar la frecuencia de la forma de onda de salida

void MM() interrupción 0

{

retrasos(300);

si(INT0 ==0)

{

cuenta=cuenta-5;

si(cuenta==0) cuenta=255 ;

}

}

}