51单片机,12MHZ晶振,定时器T0,模式1, 1ms时基,定时1分钟结果误差有30%?
一分钟计数程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar duan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //段码
uchar wei[5]={0X80,0X40,0X20,0X10,0x08}; //位选
uint a,z,x,c,v, date;
uint dispcount=0;
uint lck=0;
uint disp=0;
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
}
}
void xianshi()
{
a=date/10000; //万位
z=date/1000%10; //千位
x=date/100%10; //百位
c=date/10%10; //十位
v=date%10; //个位
P2=wei[0];
P0=duan[a];
delay(5);
P2=wei[1];
P0=duan[z];
delay(5);
P2=wei[2];
P0=duan[x];
delay(5);
P2=wei[3];
P0=duan[c];
delay(5);
P2=wei[4];
P0=duan[v];
delay(5);
}
void initTimer(void) //定时器初值
{
TMOD=0x01;
TL0=0x18;
TH0=0xfc;
}
void timer0(void) interrupt 1 //定时器中断函数
{
TL0=0x18; //1ms初值
TH0=0xfc;
lck++;
if(lck==1000*60)//乘60=1分钟
{
disp=dispcount;
lck=0;
dispcount=0;
}
}
void int0(void) interrupt 0 //外部INT0中断函数
{
dispcount++; //每一次中断,计数加一
}
void main(void) //主函数
{
IT0=1; //INT0下降沿中断
EX0=1; //允许INT0中断
initTimer(); //装入初值
TR0=1;
ET0=1;
EA=1;
while(1)
{
date=disp;
xianshi();
}
}
|