就是一个简单的20分钟定时,20分钟后蜂鸣器响3声。晶振频率11.0592,可是时间过去了20分钟,它只是显示到15分钟左右,请问问题出在哪里?
使用的是T0,方式1,定时50ms产生中断,累计20次为1S
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code seg_data[]={0xC0,0xF9,0xaA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uint count=0;
uint second=0;
uint minute=0;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3;
sbit P24=P2^4;
sbit BEEP=P3^7;
void Delay_ms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=115;j>0;j--);
}
void main()
{
uchar k;
TMOD=0x01;
EA=1;
ET0=1;
TH0=0x4c; //定时50ms初值
TL0=0x00;
TR0=1;
while(1)
{
if(second>=60)
{second=0; minute++;}
if(minute>=20)
{
minute=0;
TR0=0;
for(k=0;k<3;k++)
{
BEEP=0; //蜂鸣器鸣叫
Delay_ms(500);
BEEP=1;
Delay_ms(500);
}
}
P0=seg_data[second%10]; //分钟和秒的显示
P20=0;
Delay_ms(1);
P20=1;
P0=seg_data[second/10];
P21=0;
Delay_ms(1);
P21=1;
P0=0xbf;
P22=0;
Delay_ms(1);
P22=1;
P0=seg_data[minute%10];
P23=0;
Delay_ms(1);
P23=1;
P0=seg_data[minute/10];
P24=0;
Delay_ms(1);
P24=1;
}
}
void display() interrupt 1 //TO中断函数
{
count++;
if(count==20)
{
count=0;
second++;
}
}
|