使用的51开发板为普中的开发板 晶振11.0592
主代码如下:
#include <REGX52.H>
#include <INTRINS.H>
#include "Delay.h"
#include "Nixie.h"
#include "LCD1602.h"
#include "MatrixKey.h"
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>
unsigned int DATE[6]={2023,11,8,0,0,0};
unsigned int CMode,EMode;
static unsigned int T0count;
int KeyNumber;
int DATESlect = 5;
unsigned int Month_BOS(unsigned int Month)
{
if(Month !=2 && Month%7%2==1 || Month%7==0)
return 1;
else if(Month !=2 && Month%7%2==0 && Month%7!=0)
return 0;
else if(Month == 2)
return 2;
}
unsigned int is_leap_year(int j)
{
if (((j % 4 == 0) && (j % 100!= 0)) || (j % 400 == 0))
return 1;//是闰年
else
return 0;//不是闰年
}
void TADD()
{
if(DATE[5]>=60)
{
DATE[5]=0;
DATE[4]++;
}
if(DATE[4]>=60)
{
DATE[4]=0;
DATE[3]++;
}
if(DATE[3]>=24)
{
DATE[3]=0;
DATE[2]++;
}
if((Month_BOS(DATE[1])==1&&DATE[2]==32)||(Month_BOS(DATE[1])==0&&DATE[2]==31)||(Month_BOS(DATE[1])==2&&DATE[2]==30&&is_leap_year(DATE[0]))||(Month_BOS(DATE[1])==2&&DATE[2]==29&&!is_leap_year(DATE[0])))
{
DATE[2] =1;
DATE[1]++;
}
if(DATE[1]>12)
{
DATE[1]=1;
DATE[0]++;
}
}
void main()
{
LCD_Init();
Time_Init();
LCD_ShowString(1,1,"Clock:");
while(1)
{
KeyNumber=Key();
if(KeyNumber)
{
if(KeyNumber==1)
{
CMode+=1;
if(CMode>=2)CMode=0;
}
if(KeyNumber==2)
{
EMode+=1;
if(EMode>=2)EMode=0;
}
}
if(CMode==0)
{
LCD_ShowNum(2,1,DATE[3],2);
LCD_ShowString(2,3,":");
LCD_ShowNum(2,4,DATE[4],2);
LCD_ShowString(2,6,":");
LCD_ShowNum(2,7,DATE[5],2);
LCD_ShowString(2,9," ");
}
if(CMode==1)
{
LCD_ShowNum(2,1,DATE[0],4);
LCD_ShowString(2,5,"-");
LCD_ShowNum(2,6,DATE[1],2);
LCD_ShowString(2,8,"-");
LCD_ShowNum(2,9,DATE[2],2);
}
if(EMode==1)
{
if(KeyNumber)
{
if(KeyNumber==3)
{
DATESlect-=1;
if(DATESlect<0)DATESlect=5;
}
if(KeyNumber==4)
{
DATE[DATESlect]++;
TADD();
}
}
}
if(EMode==0)
{
if(T0count>=5000)
{
T0count=0;
DATE[5]++;
TADD();
}
}
}
}
void Timer0_Routine() interrupt 1
{
T0count++;
}
计时器代码如下
#include <REGX52.H>
void Time_Init()
{
TMOD = 0x02; //设置定时器模式
TL0 = 72; //设置定时初值
TH0 = 72; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //66器0开始计时
ET0 = 1;
EA = 1;
PT0 = 0;
}
思路是计时器模式2计时200us5000个循环增加1s 但是误差很高 麻烦在不改变大体框架的基础上帮我把误差减小到1天5s以内 谢谢