Escribí un código simple que cuenta 30 segundos utilizando el temporizador 0 (Modo 0, es un contador de 13 bits) de Atmel 89S51, y utilicé Proteus para simular. Después de 30 segundos, la luz LED debe estar encendida.
Encontré que la luz LED se encendería a aproximadamente 31 segundos, que parece ser un error de 1 segundo. Creo que este error no es aceptable ya que solo cuento 30 segundos.
En esta imagen puede ver el resultado de la simulación:
Aquí está el código:
#include <reg51.h>
long i=0;
main()
{
EA=1; //Enable EA bit
ET0=1; //Enable Timer 0
TMOD=0x00; //Use Timer 0, Mode 0
TH0=(8192-1000)/32; //Count 1ms
TL0=(8192-1000)%32;
TR0=1; //Start Timer 0
while(1);
}
void T0_int(void) interrupt 1
{
TH0=(8192-1000)/32;
TL0=(8192-1000)%32;
//if i==30000,30000*1ms=30s
if(++i==30000)
{
P1=~0x01;
}
}
¿Perdí algo o hay alguna forma de reducir este error?