C51的日历时钟程序
扫描二维码
随时随地手机看文章
//程序功能:日历,时钟,温度显示(测温代码暂没加上,加上后程序将超过4k,注意芯片型号选用),温度传感器采用18B20
// 日历与时钟,温度分时切换显示,采用8位共阳数码管
// 数据输出P1, 位码驱动P2
// 也可以采用12864LCD显示,该程序暂时没写.
#include
#include
#define unchar unsigned char
#define unint unsigned int
unchar code dispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,
0Xbf,0x9c,0xc6,0x7f,0xff}; //数码管字形表,0-9,-,o,C,.,灭
unchar code rili1997code[]={0x2,0x5,0x5,0x1,0x3,0x6,0x1,0x4,0x0,0x2,0X5,0x0}; //1996年12个月的月份星期校正码
unchar timecnt=19; //定时中断计数器
unchar timeadd1=0; //时间加1判断
unchar newday=0; //日期加1判断
unchar week;//星期
unchar data date[]={9,12,9};
unchar data time[]={11,59,55};
unchar data wendu[]={14,19,116}; //wendu[0]=10为负,显示-;wendu[0] =14为正,符号位不显示, 原理参考数码管字形表
//wendu[1]是整数温度值,wendu[2]/10是"°"显示,wendu[2]/10+1显示C,wendu[2]%110是小数点后的温度值
unchar t=150; //延时常数
unchar cnt=0; //显示控制计数器
//#define SSL 0x7f //秒低位段码地址
//#define SSH 0XBF //秒高位段码地址
//#define _L 0XDF //8位数码管显示,分钟与秒之间的-分隔符
//#define MML 0XEF //以下同
//#define MMH 0XF7
//#define _H 0XFB //8位数码管显示,小时与分钟之间的-分隔符
//#define HHL 0XFD
//#define HHH 0XFE
sbit timeset=P3^2; //时间调整键
sbit dateset=P3^3; //日历调整键
sbit add=P3^4; //加调整
sbit dec=P3^5; //减调整
//日期加1函数
//当日期有进位时调用,判断年,月,日的最大值
void dateadd1(unchar i)
{
{ unchar j=0;
switch(i)
{ case 0:if(date[0]==99) //年采用低2位表示
date[0]=0;
else
date[0]++;break;
case 1:if(date[1]==12)
date[1]=1;
else
date[1]++;break;
case 2:
switch(date[1])
{case 4: //4,6,9,11月的最大天数是30
case 6:
case 9:
case 11:if(date[2]==30)
{date[2]=1;
j++; //j++表示月份加1,以下同
}
else
{date[2]++; }
break;
case 1: //1,3,5,7,8,10,12月的最大天数是31
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(date[2]==31)
{date[2]=1; j++; }
else
date[2]++; break;
case 2:if(date[0]%400==0) //2月份需要判断是否是闰年
{if(date[2]==29) //能被400整除的世纪年是闰年
{date[2]=1;j++; } //闰年2月29天,月份加1
else
date[2]++;break;
}
else
{if(date[0]%4==0) //非世纪年,能被4整除是闰年
{if(date[2]==29)
{date[2]=1;j++; }
else
date[2]++; break;
}
else
{if(date[2]==28) //非闰年2月28天
{date[2]=1;j++;}
else
date[2]++; break;
}
}
default:break;
}
if(j)
{ if(date[1]==12) //如果进位的月份是12月,置月份date[1]为1
date[1]=1;
else
date[1]++;
}
} }
}
void datedec1(unchar i)
{ unchar j=0;
switch(i)
{ case 0: if(date[0]==0)
date[0]=99;
else
date[0]--;break;
case 1:if(date[1]==0)
date[1]=12;
else
date[1]--;break;
case 2:
switch(date[1])
{ case 4: //4,6,9,11月的最大天数是30
case 6:
case 9:
case 11:if(date[2]==0)
date[2]=30;
else
date[2]--;
break;
case 1: //1,3,5,7,8,10,12月的最大天数是31
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: if(date[2]==0)
date[2]=31;
else
date[2]--; break;