I,ve made a "tacho" using an 8051 , a 4511 decoder and 4 digit 7 seg display. its not very accurate where am i going wrong with my code.
Code:
#include <reg66x.h>
#define on 1
#define off 0
void delay();
unsigned int F,number,i,count,overflow,digit1,digit2,digit3,digit4;
float T;
sbit enable_digit1 = P1^0;
sbit enable_digit2 = P1^1;
sbit enable_digit3 = P1^2;
sbit enable_digit4 = P1^3;
void an_interrupt() interrupt 0 using 1
{
TR0 =on;
if (count<3)
{count++;}
else
TR0 = off;
T = overflow* 65536 ;
T = T + ( TH0 *256 ) + TL0 ;
T = T * 0.000000543;
F = 1/T;
number = F * 60 ;
digit1 = (number/1000);
digit2 = ( (number%1000)/100 );
digit3 = ( (number%100)/10 );
digit4 = ( (number%10) );
count = 0;
overflow = 0;
TH0 = 0x00;
TL0 = 0x00;
}
void timing ()interrupt 1 using 2
{
overflow++;
}
void main (void)
{
count = 0; // set count zero
IT0 =on; // make interrupt edge triggered
TMOD = 0x01; //mode 1
TH0 = 0x00;
TL0 = 0x00;
TR0 = off; //timer0 off
EA = on; //global enable all
ET0 = on; //enable timer zero
EX0 = on; //enable external interrupt
while (on)
{
P2 = digit1; //multiplex digits on and off
enable_digit1 = on;
delay();
enable_digit1 = off;
P2 = digit2;
enable_digit2 = on;
delay();
enable_digit2 = off;
P2 = digit3;
enable_digit3 = on;
delay();
enable_digit3 = off;
P2 = digit4;
enable_digit4 = on;
delay();
enable_digit4 = off;
}
}
void delay()
{
for(i=0; i<255; i++)
{
}
}