PIANO USING AT89C51RD2

SIMULATOR: PROTEUS 8.0

SOFTWARE: KEIL 4.0

CIRCUIT DIAGRAM:

 


CIRCUIT DESCRIPTION:

Switches from one to seven are connected in pull-up configuration to p1.0 to p1.6 respectively. A buzzer is connected to p2.0.

WORKING:

In this project, I have created the prototype of the piano using seven switches and a buzzer. Seven switches are used as a seven keys(sa, re, ga, ma, pa, dha, ni, sa) of piano. A buzzer is used to generate the sound given by the controller(AT89C51RD2).

Whenever a switch related to a particular key is pressed, the frequency of that particular key is applied to the buzzer by the controller(AT89C51RD2).

PROGRAM:

#include<reg51.h>

sbit sw1 = P1^0;   // SA

sbit sw2 = P1^1;  // RE

sbit sw3 = P1^2; // GA

sbit sw4 = P1^3; // MA

sbit sw5 = P1^4; // PA

sbit sw6 = P1^5; // DHA

sbit sw7 = P1^6; // NI

sbit pulse = P2^0; //buzzer

void tune(unsigned int th,unsigned int tl);

int main()

{

 while(1)

{

if(sw1==0)  

{

pulse = ~P2^0;

tune(0xf8,0x77); // frequency of sa

}

if(sw2==0)

{

pulse = ~P2^0;

tune(0xf9,0x4d);     // frequency of re

}

if(sw3==0)

{

pulse = ~P2^0;

tune(0xf9,0xf9); // frequency of ga

}

if(sw4==0)

{

pulse = ~P2^0;

tune(0xfa,0x59);   // frequency of ma

}

if(sw5==0)

{

pulse = ~P2^0;

tune(0xfa,0xfa);    // frequency of pa

}

if(sw6==0)

{

pulse = ~P2^0;

tune(0xfb,0x7b);    // frequency of dha

}

if(sw7==0)

{

pulse = ~P2^0;

tune(0xfb,0xfb);    // frequency of ni

}

}

}

// Function to display different frequencies

void tune(unsigned int th ,unsigned int tl)

{

TMOD = 0x01; // timer 0 in mode 1

TH0 = th; // load the higher value

TL0 = tl; // load the lower value

TR0 = 1; // start the timer

while(TF0 == 0); // wait for overflow

TF0 = 0; // clear overflow flag

TR0 = 0;  // stop the timer

}

PROGRAM DESCRIPTION:

I have used timer 0 in mode 1 to generate square waves of different frequencies of swaras. I have generated the square wave on by providing logic 1 and logic 0 alternatively to p2.0.

Frequencies of swaras are as follows:

1.SA: 240hz

2.RE: 270hz

3.GA: 300hz

4.MA: 320hz

5.PA: 360hz

6.DHA: 400hz

7.NI: 450hz

I have calculated the timer values of the above swaras as mentioned below:

Calculation of timer value to be loaded in TH0 and TL0 register:

I have taken the micro-controller with a crystal frequency of 11.0592mhz frequency. Thus, the calculation is

SA : 240 HZ

1.(11.0592 MHZ ) / 12 = 921600 HZ

2.1 / (921600) = 1.08*10^-6

3.Here we want a square wave of 240 Hz. So time will be 1/ (240 Hz)=4.16 msec

4.As we want to generate the square wave, this delay is equivalent to Ton+Toff=4.16msec. As we know that in square wave Ton=Toff

5.Hence to get the required delay we will divide this 4.16 msec by 2 so that we will get the value of Ton and Toff.

6.Ton = Toff = (4.16*10^-3) / 2 = 2.08 msec

7.Count= required time / processor time

8.Here the required time is 2.08 msec

9.Count = (2.08*10^-3) / (1.08*10^-6)

10.Count = 1929.01=1929(decimal)

11.Value to be loaded in timer register: 65536 – 1929 = 63607 =        f877(hex)

12.So, in TH0 = 0xf8 and TL0 = 0x77

RE: 270 HZ

1.Here the required time is (1/270)/2 = 1.85 msec

2.Count = (1.85*10^-3) / (1.08*10^-6)

3.Count = 1714.67=1715(decimal)

4.Value to be loaded in timer register: 65536 – 1715 = 63821 = f94d(hex)

5.So in TH0 = 0xf9 and TL0 = 0x4d

GA: 300 HZ

1.Here the required time is (1/300)/2 = 1.66 msec

2.Count = (1.66*10^-3) / (1.08*10^-6)

3.Count = 1543.20=1543(decimal)

4.Value to be loaded in timer register: 65536 – 1543 = 63993 = f9f9(hex)

5.So in TH0 = 0xf9 and TL0 = 0xf9

MA: 320 HZ

1.Here the required time is (1/320)/2 = 1.56 msec

2.Count = (1.56*10^-3) / (1.08*10^-6)

3.Count = 1446.75=1447(decimal)

4.Value to be loaded in timer register: 65536 – 1447 = 64089 = fa59(hex)

5.So in TH0 = 0xfa and TL0 = 0x59

PA: 360 HZ

1.Here the required time is (1/360)/2 = 1.38 msec

2.Count = (1.38*10^-3) / (1.08*10^-6)

3.Count = 1286.00=1286(decimal)

4.Value to be loaded in timer register: 65536 – 1286 = 64250 = fafa(hex)

5.So in TH0 = 0xfa and TL0 = 0xfa

DHA: 400 HZ

1.Here the required time is (1/400)/2 = 1.25 msec

2.Count = (1.25*10^-3) / (1.08*10^-6)

3.Count = 1157.40=1157(decimal)

4.Value to be loaded in timer register: 65536 – 1157 = 64379 = fb7b(hex)

5.So in TH0 = 0xfb and TL0 = 0x7b

NI: 450 HZ

1.Here the required time is (1/450)/2 = 1.11 msec

2.Count = (1.11*10^-3) / (1.08*10^-6)

3.Count = 1028.80=1029(decimal)

4.Value to be loaded in timer register: 65536 – 1029 = 64507 = fbfb(hex)

5.So in TH0 = 0xfb and TL0 = 0xfb

VIDEO:










NOTE:

Please visit below link to know how to interface timer and generate the square wave using 8051:

https://embeddedprojects222.blogspot.com/2020/08/timer-interfacing-with-8051.html


 

 

Comments

Popular posts from this blog

Digital Thermometer using 8051 and ADC 0808 Interfacing With 8051

how to display numbers on lcd?

Introduction of IODIR,PINSEL,IOSET and IOCLR Registers