¿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)
{ p>
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; p>
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 p>
{
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 p>
{
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); p>
si(INT0 ==0)
{
cuenta=cuenta-5;
si(cuenta==0) cuenta=255 ;
}
}
}