# Waveforms in 8051 Microcontroller

Square Wave
To create a square wave generation using Delay.
let us say we want to construct a 1khz square waveform
the processor instruction cycle of 8051 is 1.085microseconds
so for 1khz (1milli seconds =1/1khz), is 1ms/1.085microseconds = 921.6 (this value is set to the for loop)

Sine Wave generation
Since sine wave is plotted in a digital device the number of samples determines the smoothness, hence in this case, more the samples, smoother is the waveform. so a lookup table is been created to get the samples. in the following examples, there are totally 36 samples are taken, starting from 0 degrees to 360 degrees with a step of 10 degrees

 Degrees A = 5 (1+Sin theta) Where 5 is the full scale voltage DAC = 25.6 * A 0 5 128 30 7.5 192 60 9.3 239 90 10 256 etc…like this we need to calculate for 13 samples  with a step of 30degree

// SINE WAVE
#include<reg51.h>
int main()
{
int j;
int c[37]={128,150,172,192,210,226,239,248,254,255,254,248,239,226,210,192,172,150,128,106,84,64,46,30,17,8,2,0,2,8,17,30,46,64,84,106,128};
while(1)
{
for(j=0;j<36;j++)
{
P1=c[j];
}
P1=128;
}}

Triangular Waveform

//Triangular wave
#include<reg51.h>
void main()
{
int j;
while(1)
{
for(j=0;j<256;j++)
{
P0=j;
}
for(j=255;j>0;j=j-2)
{
P0=j;
}
}
}

Saw tooth or Ramp Waveform

// SAWTOOTH WAVE
#include<reg51.h>
void main()
{
int j;
while(1)
{
for(j=0;j<256;j++)
{
P1=j;
}}}

Pulse Width Modulation (PWM) Generation in 8051

#include <reg51.h>
sbit pinpwm = P2^0;
unsigned char PWM = 0;//PWM is the variable to alter the pulse width from 0 to 255
unsigned int temp = 0;
int main(void)
{
P2=0x00;
PWM = 0; //0% duty cycle
//Initialize the timer
TMOD &= 0xF0;
TMOD |= 0x01;

TH0 = 0x00;
TL0 = 0x00;

ET0 = 1;         //enable timer interrupt
EA  = 1;         //enable all interrupts

TR0 = 1;         // Start Timer 0
PWM = 220;       //a duty cycle of 220/256
while(1)
{}
}
// Timer0 ISR
void Timer0_ISR (void) interrupt 1
{
TR0 = 0;    // Stop Timer 0
if(pinpwm)    // if high
{
pinpwm= 0;
temp = (255-PWM); //this is in decimal
TH0  = 0xFF;
TL0  = 0xFF – temp&0xFF;    //to handle in hex
}
else         // else if low
{
pinpwm = 1;
temp = PWM;
TH0  = 0xFF;
TL0  = 0xFF – temp&0xFF;
}
TF0 = 0;     // Clear the interrupt flag
TR0 = 1;     // Start Timer 0
}

Here the PWM Waveform is generated with a duty cycle of 220/256(86%) duty cycle. PWM are advantageous in controlling the power to machines be reducing the supply voltage by altering the pulse width.
Duty Cycle means, the time percentage for which the duty is done. in the image show above, the high waveform for 86% and low waveform (0) for 14%.