自制万年历年月日时分秒周温度

自制万年历年月日时分秒周温度
自制万年历年月日时分秒周温度

万年历

#include

#include "ds1302.h"

#include "hareware.h"

#include "18b20.h"

//1MS延时子程序

void delay_ms(int x){

int i,j;

for(i=0;i

for(j=0;j<120;j++);}

}

unsigned char code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数据0---9

unsigned char code TAB1[]={0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,

0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,

0xc0,0xb0,0x60};//数据选择输出口

char disp1[17];

//char init[7];

int j,temperture,y,t_cnt,t_cnt1,flag,mos,yiwei,shezhi,a;

void trasfer(void); //数据转换

//void trasfer1(void); //数据转换2

void anjian(void);//按键判断

void shuzhi1(void);//数值的转化

void wendu(void);//温度报警

main(){

TMOD = 0X11;//定时器0和定时器0工作在方式一

TH0=(65536-time0_us)/256;

TL0=(65536-time0_us)%256;//定时器0赋初值

TH1=(65536-time_us)/256;

TL1=(65536-time_us)%256;//定时器0赋初值

EA=1;//开总中断开关

ET0=1;//开定时器0中断开关

TR0=1;//定时器0开始定时

ET1=1;//开定时器0中断开关

TR1=1;//定时器0开始定时

DS1302_Initial(); //初始化DS1302

// DS1302_SetTime(init1); //设置初始时间

DS1302_GetTime(now); //读取当前时间

y=temperture;

flag=1;

mos=0;

yiwei=0;

shezhi=0;

a=0x20;

while(1){

temperture=ReadTemperature();

anjian();

// trasfer1();

trasfer();

wendu();

}

}

/**************************************************/

/**************定时器T0中断服务子函数**************/

/**************************************************/

void T0_ISR() interrupt 1 using 1

{

TH0=(65536-time0_us)/256;

TL0=(65536-time0_us)%256; //定时器0重新赋初

switch(mos){

case 0:{

SEG7P=0x00; // 关闭7节显示器

SCANP=TAB1[j]; // 输出扫瞄信号

SEG7P=TAB[(disp1[j])]; // 转换成驱动信号,并输出到P0

j++;

if(j==17)j=0;

break;

}

case 1:{

SEG7P=0x00; // 关闭7节显示器

SCANP=TAB1[j]; // 输出扫瞄信号

if((j==yiwei||j==yiwei+1)&&flag==1){

SEG7P=0x00;

}

else{

SEG7P=TAB[(disp1[j])]; // 转换成驱动信号,并输出到P0

}

j++;

if(j==17)j=0;

break;

}

}

}

/**************************************************/

/**************定时器T1中断服务子函数**************/

/**************************************************/

void T1_ZD() interrupt 3 using 1 //定时器中断子程序

{

TH1=(65536-time_us)/256;

TL1=(65536-time_us)%256;//设定定时器初值

t_cnt++;//定时器定时一次就加一

t_cnt1++;//定时器定时一次就加一

if(t_cnt>=time_cnt){//判断是否有20次

t_cnt=0; //清零

flag=~flag;

// y=temperture; //2秒钟温度稳定变化一次,以稳定温度的显示}

if(t_cnt1>=time_cnt1){//判断是否有20次

t_cnt1=0; //清零

y=temperture; //2秒钟温度稳定变化一次,以稳定温度的显示}

}

/******************************************* *****/

/*****************转换数据***********************/

/************************************************/

void trasfer(void) //数据转换

{

DS1302_GetTime(now);

// disp1[0]=(init[0]/10);

// disp1[1]=(init[0]%10); //年

disp1[0]=(a/16);

disp1[1]=(a%16); //年

disp1[2]=(now[6]/16);

disp1[3]=(now[6]%16); //年

disp1[4]=(now[4]/16);

disp1[5]=(now[4]%16); //月

disp1[6]=(now[3]/16);

disp1[7]=(now[3]%16); //日

disp1[8]=(now[2]/16);

disp1[9]=(now[2]%16); //时

disp1[10]=(now[1]/16);

disp1[11]=(now[1]%16);//分

disp1[12]=(now[0]/16);

disp1[13]=(now[0]%16);//秒

disp1[14]=((y%1000)/100); // 温度十位

disp1[15]=((y%100)/10); //温度个位

disp1[16]=(now[5]%16); //周

}

/******************************************* *****/

/*****************转换数据2***********************/

/************************************************/

/*void trasfer1(void) //数据转换2

{

init[0]=20;

now[6]=init[1]; //年

now[4]=init[2]; //月

now[3]=init[3]; //日

now[2]=init[4]; //时

now[1]=init[5]; //分

now[0]=init[6]; //秒

now[5]=init[7]; //周

} */

/**********************************************************/ /*********************按键判断选择*************************/ /**********************************************************/ void anjian(void)

{ /***********判断按键K1是否按下************/

if(k3==0){

delay_ms(10);

if(k3==0){

mos++;

if(mos>1){

mos=0;

yiwei=0;

shezhi=0;

}

while(k3==0);

}

}

/***********判断按键K2是否按下************/

if(k4==0&&mos==1){

delay_ms(10);

if(k4==0){

shezhi++;

if(yiwei>=10){

yiwei+=6;

}

else{

yiwei+=2;

}

if(yiwei>16)yiwei=0;

if(shezhi>6)shezhi=0;

while(k4==0);

}

}

/***********判断按键K3是否按下************/

if(k1==0&&mos!=0){

delay_ms(10);

if(k1==0){

switch(shezhi){

case 0:{a+=0x01; if(a==0x64) a=0x00; break;} //年千百位

case 1:{now[6]+=0x01; if(now[6]==0x9a) now[6]=0; break;} //年

case 2:{now[4]+=0x01; if(now[4]==0x13) now[4]=1; break;} //月

case 3:{now[3]+=0x01; if(now[3]==0x32) now[3]=1; break;} //日

case 4:{now[2]+=0x01; if(now[2]==0x24) now[2]=0; break;} //时

case 5:{now[1]+=0x01; if(now[1]==0x5a) now[1]=0; break;} //分

case 6:{now[5]+=0x01; if(now[5]==0x08) now[5]=1; break;} //周}

// now[0]=0x00;

shuzhi1();

DS1302_SetTime(now);

while(k1==0);

}

}

/***********判断按键K4是否按下************/

if(k2==0&&mos!=0){

delay_ms(10);

if(k2==0){

switch(shezhi){

case 0:{a-=1; if(a==0xff) a=0x64; break;} //年千百位

case 1: {now[6]-=0x01; if(now[6]==0xff) now[6]=0x99; break;} //年

case 2: {now[4]-=0x01; if(now[4]==0x00) now[4]=0x12; break;} //月

case 3: {now[3]-=0x01; if(now[3]==0x00) now[3]=0x31; break;} //日

case 4: {now[2]-=0x01; if(now[2]==0xff) now[2]=0x23; break;} //时

case 5: {now[1]-=0x01; if(now[1]==0xff) now[1]=0x59; break;} //分

case 6: {now[5]-=0x01; if(now[5]==0x00) now[5]=0x07; break;} //周

}

// now[0]=0x00;

shuzhi1();

DS1302_SetTime(now);

while(k2==0);

}

}

}

/**********************************************************/

/******************** 数字功能***************************/

/**********************************************************/

void shuzhi1(void)

{

if(now[6]%16==10) now[6]+=6; //年的时间的判断

if(now[6]%16==15) now[6]-=6;

if(now[4]%16==10) now[4]+=6; //月

if(now[4]%16==15) now[4]-=6;

if(now[3]%16==10) now[3]+=6; //日

if(now[3]%16==15) now[3]-=6;

if(now[2]%16==10) now[2]+=6; //时

if(now[2]%16==15) now[2]-=6;

if(now[1]%16==10) now[1]+=6; //分

if(now[1]%16==15) now[1]-=6;

if(a%16==10) a+=6; //年的千位判断

if(a%16==15) a-=6;

}

/**********************************************************/

/********************温度报警功能**************************/

/**********************************************************/

void wendu(void)

{

if(disp1[14]>=9&&flag==1){beef=0;}

else{beef=1;}

if(disp1[10]==0&&disp1[11]==0&&disp1[12]==0&&disp1[13]==0)beef=0; }

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告 设计任务: 设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。并能准确计算闰年闰月的显示。设计要求: 通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示: 图3 仿真按键 4)温度采集部分: DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。独特的单线接口方式,DS18B20在与微处理器

连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示 : 程序如下: ReadOneChar(void) { unsigned char i=0;// 定义i用于循环 unsigned char dat = 0;// 读取的8位数据 for (i=8;i>0;i--)//8次循环 { DQ = 0;// 拉低DQ总线开始读时序 dat>>=1;// dat左移一位 DQ = 1; //释放DQ总线 if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据) //DQ=0,就跳过 dat|=0x80; Tdelay(4);// 延时以完成此次读时序,之后再读下一数据 } return(dat); 返回读取的dat } //写一个字节 WriteOneChar(unsigned char dat) { unsigned char i=0;// for (i=8; i>0; i--)// { DQ = 0;// DQ = dat&0x01;// Tdelay(5);//延时以完成此次读时序,之后再读下一数据

Excel中关于日期的计算公式的运用

Excel中关于日期的计算公式的运用 方法1:在A1单元格输入前面的日期,比如“2004-10-10”,在A2单元格输入后面的日期,如“2005-6-7”。接着单击A3单元格,输入公式 “=DATEDIF(A1,A2,"d")”。然后按下回车键,那么立刻就会得到两者的天数差“240”。 提示: 公式中的A1和A2分别代表前后两个日期,顺序是不可以颠倒的。此外,DATEDIF函数是Excel中一个隐藏函数,在函数向导中看不到它,但这并不影响我们的使用。 方法2:任意选择一个单元格,输入公式“="2004-10-10"-"2005-6-7"”,然后按下回车键,我们可以立即计算出结果。 计算工作时间——工龄—— 假如日期数据在D2单元格。 =DATEDIF(D2,TODAY(),"y")+1 注意: 工龄两头算,所以加“1”。 如果精确到“天”—— =DATEDIF(D2,TODAY(),"y")&"年"&DATEDIF(D2,TODAY(),"ym")&"月 "&DATEDIF(D2,TODAY(),"md")&"日" 二、计算2003-7-617:05到2006-7-713:50分之间相差了多少天、多少个小时多少分钟 假定原数据分别在A1和B1单元格,将计算结果分别放在C 1、"D1和E1单元格。

C1单元格公式如下: =ROUND(B1-A1,0) D1单元格公式如下: =(B1-A1)*24 E1单元格公式如下: =(B1-A1)*24*60 注意: A1和B1单元格格式要设为日期,C 1、"D1和E1单元格格式要设为常规. 三、计算生日,假设b2为生日 =datedif(B2,today(),"y") DATEDIF函数,除Excel2000中在帮助文档有描述外,其他版本的Excel在帮助文档中都没有说明,并且在所有版本的函数向导中也都找不到此函数。但该函数在电子表格中确实存在,并且用来计算两个日期之间的天数、月数或年数很方便。微软称,提供此函数是为了与Lotus1-2-3兼容。 该函数的用法为“DATEDIF(Start_date,End_date,Unit)”,其中Start_date为一个日期,它代表时间段内的第一个日期或起始日期。End_date为一个日期,它代表时间段内的最后一个日期或结束日期。Unit为所需信息的返回类型。 “Y”为时间段中的整年数,“M”为时间段中的整月数,“D”时间段中的天数。“MD”为Start_date与End_date日期中天数的差,可忽略日期中的月和年。“YM”为Start_date与End_date日期中月数的差,可忽略日期中的日和年。“YD”为Start_date与End_date日期中天数的差,可忽略日期中的年。比如,B2单元格中存放的是出生日期(输入____年__月__日时,用斜线或短横线隔开),在C2单元格中输入“=datedif(B2,today(),"y")”(C2单元格的格式为常规),按回车键

带温度计的万年历

设计课题题目: 带温度计的万年历 一、设计任务与要求 1. 显示准确的北京时间(时、分、秒)及公历日期显示功能(年、月、日); 2. 可通过按键切换年、月、日及时、分、秒的显示状态; 3. 可随时可以调校年、月、日或时、分、秒; 4. 可每次增减一进行时间调节,也可快速增减进行时间调节; 5. 可显示环境温度。 二、系统设计方案 方案一、用主芯片为AT89C51的单片机控制实现,使用单片机内部的定时计数器实现时间的设定,使用按键进行时间的调整和定时,按键有蜂鸣器提示,温度传感器使用DALLAS 公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、抗干扰能力强、易配处理器等优点。显示时间和温度使用数码管显示。 方案二、用主芯片为STC89C52的单片机控制实现,为了满足单片机系统的实时控制的需求,采用实时钟芯片DS1302,使用按键进行时间的调整和定时,温度传感器使用 DS18B20。显示时间和温度使用LCD1602显示。 方案一片内定时器会导致计时节拍的时间误差,当进行年、月、日的日历计时,定时中断误差扥积累就会很大。使用片内定时器进行计时的时候,单片机始终要处于工作状态。才能维持计时时间,一旦停机或进入待机状态,开机后,计时时间就需要重新设定。为了满足单片机系统的实时钟需求,本设计采用的是方案二,系统框图如图2-1所示。 图2-1 三、单元电路分析与设计 1. 原理分析 1.1主控制器 单片机STC89C52 具有低电压供电和体积小等特点,如图3-1所示。

1.2晶振电路 AT89S52引脚XTAL1和XTAL2与晶体振荡器及电容C1、C2按图3-2所示方式连接。晶振、电容C1/C2及片内与非门(作为反馈、放大元件)构成了电容三点式振荡器,振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,范围在0~33MHz 之间,电容C1、C2取值范围在5~30pF 之间。 根据实际情况,本设计晶振选择频率为12MHZ ,电容选择30pF 如图3-2。经计算得单片机工作的机器周期为:12×(1÷12M )=1us 。振荡器的振荡信号从XTAL2端输入到片内的时钟发生器上。时钟发生器是个二分频的触发器,它将振荡器的信号频率fosc 除以2,向CPU 提供两相时的时钟号。 1.3复位电路 时钟电路工作后, 芯片内部开始进行初始复位,如图3-3 。 1.4 LCD 显示电路 显示器是单片机常用的功能单元之一,显示器的工作是由单片机通过显示接口驱动的。本设计采用的是LCD1602显示电路图如图3-4所示。

一个计算万年历的简单程序

一个计算万年历的简单程序 通常我们只知道生活当天的前后几天是星期几,即便是翻日历,也只能知道有限日期的星期数。那么有没有一种方法可以让我们知道任何一天是星期几呢?有,下面我将向大家介绍一种方法,用以编写万年历的程序。 首先我们必须约定一些法则,我们用Y、M、D分别表示年、月、日,用数字0-6分别表示星期日-星期六,这样我们就可以开始推导我们的公式了。 我们知道2002年9月1号为星期日,如果我们要想知道2002年9月10号为星期几,可以这样算:(0+(10-1))%7=(0+9)%7=2,即星期二。同样可算得2002年9月20号为:(0+(20-1))%7=(0+19)%7=5,即星期五。但是这样算需要把日期减1,不太方便,为了解决这个问题,我们可以假设每个月有一个0号,由于2002年9月1号为星期日,那么2002年9月0号为星期六,这样算9月10号,只需代入10既(6+10)%7=2。事实上,9月0号也就是8月31号,每个月0号的星期数实际上就是每个月1号的前一天的星期数。我把这个星期数称之为每个月的代码。有了这个代码,要算这个月任一天的星期数都好办了。 以上讨论的是一年中每个月的代码,事实上对于每年也有一个代码,这个代码就是每年1月0号(即1月1号的前一天)的星期数,也就是一月份的代码。如果我们能够找到每年的代码之间的关系,那么要计算万年历就易如反掌了。 (一)推算年的代码公式 我们都知道,平年一年有365天,即52周多1天。闰年为366天即52周多2天。我们先只考虑平年的情况。 假设第N年的代码为W,则第N+1年的代码为(W+1)%7,而第N+K年的代码则为(W+K)%7。这是因为从第N年到第N+K年共经过了K年,每过一年也就是过了52周余1天,经过K年也就是过了52*K周余K天,将多余的天数K加上第N年的代码W再对7取模,所得也就是第N+K年的代码了。 下面我们把闰年也考虑进来。判断闰年的规则是,能被4整除,并能被100和400同时整除的年份就是闰年。所以从第N年到第N+K年间共有K/4 -K/100+K/400个闰年,而每个闰年有52周余2天,要比平年多余了1天,即共多余了K/4-K/100+K/400天。我们应该把这些天也加进去,所以第N+K年的代码应为(W+K+K/4-K/100+K/400)%7。 这样子是不是就考虑完全了呢?并非如此,我们还有两点没考虑到。第一点是第N年是不是闰年。如果第N年是闰年的话,它本身就是52周余2天,而我们在上面却是把它当作平年来计算的,少算了1天,应加上。所以在第N年为闰年的时候上式应为 (W+(K+1)+K/4-K/100+K/400)%7。第二点是第N+K年是不是闰年。如果第N+K年是闰年,虽然它有52周余2天,但只有在算第N+(K+1)年的时候,才需要多加它那一天,而在算第N+K年的时候不需要多加这1天,因此我们必须将上式改为 (W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7(注意千万不能改为 (W+(K+1)+(K/4-K/100+K/400-1))%7=(W+K+K/4-K/100+K/400)%7)。 由此我们可以得出当第N年为闰年时,第N+K年的代码计算式为: A=(W+(K+1)+(K-1)/4-(K-1)/100+(K-1)/400)%7 为了方便计算,我们可以取N为0,也就是假设公元元年的代码为W。因为公元元年也是闰年,符合上式,那么当我们输入的年份为Y时,此时就有K=Y,也就是说第Y年的代码为 A=(W+(Y+1)+(Y-1)/4-(Y-1)/100+(Y-1)/400)%7

电子表格日期公式

竭诚为您提供优质文档/双击可除 电子表格日期公式 篇一:excel中几个时间计算公式 假设b2为生日 =datedif(b2,today(),"y") datediF函数,除excel2000中在帮助文档有描述外,其他版本的excel在帮助文档中都没有说明,并且在所有版本的函数向导中也都找不到此函数。但该函数在电子表格中确实存在,并且用来计算两个日期之间的天数、月数或年数很方便。微软称,提供此函数是为了与lotus1-2-3兼容。 该函数的用法为 “datediF(start_date,end_date,unit)”,其中start_date 为一个日期,它代表时间段内的第一个日期或起始日期。end_date为一个日期,它代表时间段内的最后一个日期或结束日期。unit为所需信息的返回类型。 “y”为时间段中的整年数,“m”为时间段中的整月数,“d”时间段中的天数。“md”为start_date与end_date日期中天数的差,可忽略日期中的月和年。“ym”为start_date 与end_date日期中月数的差,可忽略日期中的日和年。“yd”

为start_date与end_date日期中天数的差,可忽略日期中的年。比如,b2单元格中存放的是出生日期(输入年月日时,用斜线或短横线隔开),在c2单元格中输入 “=datedif(b2,today(),"y")”(c2单元格的格式为常规),按回车键后,c2单元格中的数值就是计算后的年龄。此函数在计算时,只有在两日期相差满12个月,才算为一年,假如生日是20xx年2月27日,今天是20xx年2月28日,用此函数计算的年龄则为0岁,这样算出的年龄其实是最公平的。 身份证号提取年龄 =datediF(--text((len(a1)=15)*19”即可获得当时的日期时间; 2、使用公式:用=now()而非=date(),=date()只有日期,然后进行菜单“工具->选项”,选择“重新计算”页,选中“人工重算”,勾不勾选“保存前自动重算”看自己的需要和想法了,如果勾选了,那日期时间那总是最后一次保存的日期时间,不勾选的话,如果你的表格中有公式记得准备存前按F9 篇二:excel函数--时间和日期函数 时间和日期函数 1.date 用途:返回代表特定日期的序列号。

北极星数码万年历使用说明书

北极星数码万年历 北极星数码万年历使用说明书 操作说明 1、按键说明:设置键、上调键、下调键、流水开关键。 2、时间调整在正常走时状态下,按“设置”键进入时间设置状态,同时年份“闪烁”,可按“上调”或“下调”键修改年份,修改好后按“设置”键将闪烁位移到公历“月”,按“上调”或“下调”键修改月份;用同样的方法可对日、时、分进行设置;12个公历节日及倒计天数、24个农历节气及倒计天数、12生肖、12星座、星期、农历月、日将自动跟随公历的变化。当分设定好后,再按“设置”键退出时间设置,回到正常时间状态。 3、节气灯花样转换在正常走时状态下,按住“设置”键3秒钟即可进入节气灯花样转换。 4、12/24小时制切换在正常走时状态下,按住“上调”键3秒钟,则可进行12小时制与24小时制的切换。上电复位时,可默认为24小时制或12小时制,由选项决定。 5、开/关整点报时在正常走时状态下,按住“下调”键3秒钟听到“嘀”一声,则可以打开或关闭整点报时功能。 6、天数倒计时或顺计时(由选项决定)在正常时间状态下,按“模式”键进入“天数计时状态”,在温度位显示“d1”,计时天数位若显示“――――”,表示计时“无效”;若显示具体数字表示有效,按“上调”键可以切换“有效”/“无效”,按“设置”键进入天数设定,且左边第一位(千位)闪烁,按“上调”或“下调”键修改内容,按“设置”键移动闪烁位置到第二位(百位),按“上调”或“下调”键修改闪烁位的内容,同样方法可设置十位与个位 7、闹钟 8组定闹(由按键选项决定),默认值无效,默认时间为――:――点,闹钟设定:在正常时间状态下(或天数计时状态),按“下调”键进入“定闹查询状态”,定闹指示灯点亮,在温度位显示“A1”,表示当前你看到的是“第1组定闹”的信息,在小时、分钟位显示“――∶――”,表示定闹“无效”;显示“XX∶XX”的具体时间,表示定闹“有效”,按“上调”键可以切换“有效”/“无效”,按“设置”键进入定闹时间设定,且小时位闪烁,按“上调”或“下调”键修改闪烁位的内容,按“设置”键移动闪烁位置到分钟位,按“上调”或“下调”键修改闪烁位的内容,再按“设置”键确认并退出定闹时间设定,再按“下调”键进入下一组闹铃状态,其设置与“第1组定闹”相同,依次类推即可设置所有定闹。 8、生日提醒①7组生日提醒,默认值无效。②生日提醒设定:在最后一组定闹状态,再按一次“下调”键则进入第一组生日提醒,生日提醒指示灯点亮,在温度位显示“b1”,在公历“月日位”显示有效“生日日期”或无效日期“――――”,则表示生日以“公历日期”为准,若在农历“月日位”显示则表示生日以农历日期为准;按“上调”键可“打开/关闭”该组生日提醒,按“设置”键进入“该组生日提醒日期”设置,按“上调”或“下调”键修改其内容,按“设置”键移动闪烁位置,再按“设置”键确认该组生日提醒设置,再按“下调”键进入下一组生日提醒,依次类推即可设置所有生日提醒,当在最后一组生日提醒时,按“下调”键则退到正常时间状态若闹铃中没有一组设置有效,则定闹指示灯熄灭,在任何闹铃时间到正在响闹 北极星数码万年历使用说明书第1页共2页

万年历阴历星期温度

#include #include #include #define uchar unsigned char #define uint unsigned int sbit CLK=P1^1; //DS1302时钟线 sbit SDA=P1^0; // DS1302数据线 sbit RST=P1^2; //DS1302复位线 sbit RS=P2^0;//数据/指令选择端口 sbit RW=P2^1;//读写端口 sbit EN=P2^2;//使能端口 sbit K1=P3^4; // 选择 sbit K2=P3^5; // 加 sbit K3=P3^6; // 减 sbit K4=P3^7; // 确定 uchar tCount=0;//一年中每个月的天数,2月的天数由年份决定 uchar MonthsDays[]={0,31,0,31,30,31,30,31,31,30,31,30,31}; uchar *WEEK[]={"sun","mon","tus","wen","thu","fri","sat"};//周日,周一到周六 uchar LCD_DSY_BUFFER1[]={"Date 00-00-00 "}; //LCD显示缓冲 uchar LCD_DSY_BUFFER2[]={"Time 00-00-00 "}; uchar DateTime[7]; //所读取的日期时间 char Adjust_Index=-1; //当前调节的时间:秒,分,时,日, uchar Change_Flag[]="-MHDM-Y"; uchar Read_LCD_State();//读LCD状态 void LCD_Busy_Wait();//判忙 void Write_LCD_Data(uchar dat);//写数据 void Write_LCD_Command(uchar cmd);//写命令 void Init_LCD();//LCD初始化 void Set_LCD_POS(uchar p);//设置显示位置 void Display_LCD_String(uchar p,uchar *s);//写字符串 void DelayMS(uint x)//延时 { uchar i; while(x--) for(i=0;i<120;i++); } uchar Read_LCD_State()//读LCD状态 { uchar state;

电子万年历

河北科技师范学院课程设计说明书 题目: 学院(系): 年级专业: 学号: 学生姓名: 指导教师:

摘要 本设计是电子万年历。具备三个功能:能显示:年、月、日、时、分、秒及星期信息,并具有可调整日期和时间功能。 我选用的是单片机8052来实现电子万年历的功能。该电子万年历能够成功实现时钟运行,调整,显示年月日时分秒及星期,温度等信息。 该电子万年历使用12MHZ晶振与单片机8052相连接,通过软件编程的方法实现了以24小时为一个周期,同时显示小时、分钟和秒的要求。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 电子万年历设计与制作可采用数字电路实现,也可以采用单片机来完成。若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,这样一来就降低了硬件电路的复杂性,从而使得其成本降低,更适合我们大学生自主研发。所以在该设计与制作中我选用了单片机8052,它是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, 单片机8052的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。 因此,采用单片机8052原理制作的电子万年历,不仅仅在原理上能够成功实现计时等功能,也更经济,更适用,更符合我们实际生活的需要,对我们大学生来说也更加有用。

lcd数显温度万年历电波钟

外观尺寸:29cm(宽)*18.5cm(高) 可挂可摆,背面有挂孔,可挂在墙上,也可以安装随机配送的支架摆放在台面上。 电子说明书地址:https://www.360docs.net/doc/ae15542107.html,/item.htm?spm=a1z09.5.0.4 0&id=16362908718 功能特点: 1、时间显示:时:分:秒,12/24小时制可选 2、日历显示:日/月 3、星期显示:英文简写 4、温度显示:摄氏或华摄,范围:0℃-50℃(32℉-122℉),分辨率:0.1℃。 5、闹铃功能:可设置1个闹铃时间。 6、特殊日期提醒功能:可设置三个特殊日期提醒。 使用电源:两节AA电池(不配送电池),超省电,两节电池可使用一年以上。 使用说明: 一、信号自动同步: 当时钟正确装上电池后,稍等几秒,自动开始接收日本发射的无线电校时信号,接收过程中屏幕右上角显示一个闪动的信号接收塔标识。当接收到正确的时间信号后,接收塔标识停止闪动并自动同步时间和日历信息,时钟每天会定时进行接收,无须人工干预。如果接收不成功,时钟仍可以作为一个高精度石英钟使用。 时钟在接收信号的过程(接收塔标识闪动)中无法进行其他功能的操作,如果需要进行其它设置或取消接收,须按下‘+’键退出接收状态。为了达到最好的接收效果,应将时钟远离其它用电器至少在1-2米以上,并可以适当转动时钟位置以获取最佳接收效果。 二、信号手动同步: 在正常的时钟显示模式,长按‘+’键,强制进入信号接收状态,此时收塔标识闪动,接收过程与自动同步一样。 三、手动设定时钟、日历: 在正常的时钟显示模式,长按‘CLK/CAL’键,进入时间日历设置界面,当前设置项目闪动,通过短按‘+,-’键调整数值,再短按‘CLK/CAL’确认并进入下一设置项目。设置项目顺序:12/24时制—小时—分钟—年—月—日—时区。 四、每日闹钟设置: 在正常的时钟显示模式,长按‘ALARM’键,进入闹铃设置界面,通过短按按‘+,-’键输入每天的闹铃时间,最后按‘ALARM’键确认。 在正常的时钟显示模式,短按‘-’键可以开启和关闭闹铃功能,当闹铃响时,按任意键都可以关闭闹铃。 五、特殊日期提醒设置:

基于51单片机带温度显示的液晶万年历

摘要 在寒假期间我用一周时间完成了这个液晶万年历,它可以显示年月日、时分秒、以及温度(可上下限报警),可以对时间进行加一或减一调整,并加入了闰、平年时间调整,方便可行,已经调试成功。考虑到成本和方便,本作品采用了STC89c52和DS18B20,计时用的是51单片机自带的十六位定时器/计数器T0,尽管对时间进行了误差调整但是还是有一定的误差,考虑到学校后改用DS1302时钟芯片,进一步减小误差。温度显示精度达到0.1摄氏度。 关键词:单片机 DS18B20 万年历温度 1.硬件工作介绍 (1)上电自动复位及手动复位电路 STC89c52单片机的RST端外部复位有两种操作方式:上电自动复位和按键手动复位。本设计用上电自动复位以及手动复位下结合的方式外接电路(见附图)。 (2)时钟振荡电路 作品中采用12M晶振,其连接方法如图所示,其中电容的值都为22pF。(3)1602液晶显示接口 1602采用标准的16脚接口(见附图),其中: 第1脚:GND为地电源 第2脚:VCC接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS 和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7~14脚:D0~D7为8位双向数据线。 第15脚:VCC 第16:GND (4)键盘 键盘是通过S3(P3.2),S4(p3.3),S5(p3.4)对时钟进行调整,其S3选择要调整的对象如时,分,日,月等等,并在液晶屏上显示所选的对象。S4对所选中

可以显示温度的万年历程序(已在PD1000开发板上运行)

//1602+18b20+ds1302程序 // 程序名称:1602+18b20+ds1302程序 // 实验目的:综合应用lcd1602,ds18b20,ds1302 // 连接方法:将LCD1602液晶屏插到J9端子上引脚朝下 // JP8与JP5 用8p排线连接 // 描述:液晶显示当前时间(可调整),温度(精度可调) // K1设置键 K2递增键 K3递减键 // 版本:PD1000开发板 // 作者:青岛普爱特 // 日期:2011.02.28 //注:(1):主芯片STC89C52RD 使用12M晶振 // (2):Keil uV3 3.30编译运行通过 // (3):本例程在 PD1000 开发板平台上成功运行通过 // (4):青岛普爱特版权所有,只供学习参考,不得应用于商业用途. // (5):公司网站:https://www.360docs.net/doc/ae15542107.html, 淘宝网店:https://www.360docs.net/doc/ae15542107.html, #include #include #include #define uchar unsigned char //功能引脚定义 sbit set= P1^0; //设置调整按键 sbit up = P1^1; //加键 sbit down =P1^2; //减键 sbit LCM_RS= P2^5; //l602定义引脚 sbit LCM_RW= P2^6; sbit LCM_E =P2^7; #define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识 uchar id,timecount,dipsmodid; bit lmcinit_or_not; //是否需要清屏标志位“1”为需要“0”为不需要 bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志void Disp_line1(void); //显示屏幕第一行 void Disp_line2(void); //显示屏幕第二行 void id_case1_key(); void Disp_mod0(void); //*********** DS1302 时间显示定义部分 sbit T_IO =P3^4; sbit T_RST=P3^5; sbit T_CLK=P3^6; sbit ACC0=ACC^0; sbit ACC7=ACC^7; void Set(uchar,uchar); //根据选择调整相应项目 void RTInputByte(uchar); /* 输入 1Byte */ uchar RTOutputByte(void); /* 输出 1Byte */ void W1302(uchar, uchar); // 向DS1302写入一个字节 uchar R1302(uchar); // 从DS1302读出一个字节 void Set1302(unsigned char * ); // 设置时间 bit sec,min,hour,year,mon,day,weekk; //闪烁标志位 //初始化后设置为:11年02月28日星期1 08点11分59秒 unsigned char inittime[7]={0x59,0x11,0x08,0x28,0x02,0x11,0x01}; // 秒分钟小时日月年星期 //***** 18B20温度显示定义部 sbit DQ=P3^7; //18B20 接P3.7口 typedef unsigned char byte; typedef unsigned int word; Read_Temperature(char,char); void mychar(void); byte ow_reset(void); byte read_byte(void); void write_byte(char val); void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应 // 0.5, 0.25, 0.125

根据公历日期计算星期的公式

根据公历日期计算星期的公式 蔡勒(Zeller)公式:是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。 公式如下: W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1 公式中的符号含义如下: w:星期;(w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六) c:世纪(前两位数) y:年(后两位数) m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d:日 [ ]代表取整,即只要整数部分。 下面以中华人民共和国成立100周年纪念日那天(2049年10月1日)来计算是星期几,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26×(10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) 即2049年10月1日(100周年国庆)是星期五。 再比如计算2006年4月4日,过程如下: w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =6+[6/4]+[20/4]-2*20+[26*(4+1)/10]+4-1 =-12 (除以7余2,注意对负数的取模运算!) 不过,以上的公式都只适合于1582年(我国明朝万历十年)10月15日之后的情形。罗马教皇格里高利十三世在1582年组织了一批天文学家,根据哥白尼日心说计算出来的数据,对儒略历作了修改。将1582年10月5日到14日之间的10天宣布撤销,继10月4日之后为10月15日。 后来人们将这一新的历法称为“格里高利历”,也就是今天世界上所通用的历法,简称格里历或公历。 若要计算1582年10月4日及之前的日期是星期几,则公式为:

多功能液晶显示万年历、温度计

实验报告 实验名称:多功能液晶显示万年历、温度计的制作 所在专业:测控技术与仪器 学生姓名: 班级学号: 任课教师:陆婷 2014 /2015 学年第一学期

摘要:多功能液晶显示万年历、温度计具有造型美观、经济实用,性能稳定、耗电少等优点。实验内容为学习PCB板的设计和绘制方法,完成一个多功能万年历、温度计的装配及调试。 一、设计目的:1. 了解并掌握多功能液晶显示万年历、温度计的主要工作原理,更好的理解和掌握平时所学的电子电路理论知识; 2.认识贴片元件,学习贴片元件的装配方法和PCB板的设计和绘制方法; 2.通过自己亲自动手装配,锻炼动手能力,提高学生解决实际电路问题的能力。还能激发学生的好奇心。 二、基本功能说明: (1)液晶同屏显示年、月、日、星期、时、分、秒,正常走时状态下,外围电路设有一LED秒指示灯,每秒闪烁一次。 (2)开机画面显示3秒,显示相关制作信息3秒,清屏后进入正常走时状态。 (3)整点报时功能,早8点到晚10点,多首歌曲在整点时刻循环播放,每首歌曲的长度均控制在一分钟以内。 (4)公历和农历所有的节日提醒,均在屏幕最下面一行显示。如果当天是某个节日,则显示相关节日信息,若当天无任何节日,则可显示当天的各个时段信息,如:凌晨、早晨、上午、中午、下午、

晚上、夜里、深夜等。 (5)实时温度显示,精确到小数点后一位。(6)时间调整:在正常走时状态下,按SET键进入时间调整界面,可以依次调节年、月、日、星期、时、分等信息,按CLK键退出当前的调整状态,恢复正常走时。 (7)闹钟调整:在正常走时状态下,按CLK键,进入闹钟设置界面,可以依次调节闹钟小时、闹钟分、闹钟开启和闹钟关闭。当想要设置闹钟时,设置好小时、分之后,再按此键至闹钟开启,按SET键即可退出闹钟设定界面,闹钟设置完成,若不想使用闹钟,就按CLK 键至闹钟关闭状态时,再按SET键退出界面,则闹钟被关闭。(8)外部电路设有扬声器开关,用户可根据需要自行开关扬声器。(9)电路板界面设计人性化,便于人机交互,在正常走时界面或任一调整界面状态时,均会在相应按键对应位置显示相关的操作提示信息,使用户使用方便,易学易用。 三、元件

电子万年历

第一章绪论 1.1设计背景 从改革开放开始,电子工业已成为科技创新的重要领域,我国的电子产业也在新世纪开始高速发展,无论是产业结构,产业规模和技术水平都有了十分明显的进步和提升,而且电子产品在各个领域都有开创性的发展,使我们的生活变得更加智能化,为我国经济的发展做出了杰出的贡献。其中,单片机的大规模使用为我们的生活创造了极大的便利,可以说无时无刻不在影响着我们的生活。何为单片机,单片机全名为单片微控制器,它的结构组成就是将微型计算机的基本功能部件全都集成在一个半导体芯片上。尽管仅仅是一个芯片,但从单片机的构成和功能的角度来看充分具备一个计算机系统的中央处理功能。最重要的优点是,单片机体积小巧,可以任意嵌入到任何符合条件的应用系统中作为中央处理器进行指挥决策,是系统实现完全的智能化。当今世界,单片机已经无时无刻不在我们生活的周边存在,各类电子产品几乎都以单片机作为主控核心,通过单片机的控制使之更加智能快速,使我们的生活更加舒畅和方便。正是随着日常周边科学技术的进步,人们对待生活用品的要求也在逐步提高,时钟亦是如此,从古至今,人们对时间的概念就非常重视,从日晷到摆钟,经历了百年的发展,如今,人们对时钟的要求不仅仅是能够知道时间,还需要能够知道日期,星期,节气,天气情况等等,以便于满足人们对生活的各种需要,由此电子万年历就诞生了,正是因为电子万年历功能的多样性,使它在应用在各种场合,人们对它的需求量也就却来越大,电子万年历的发展空间也越来越广阔,成为了一项重要的产业。 1.2设计的目的及意义 中国从古至今就有重视时间的好传统,农民通过日照和鸡叫开始一天的劳作,商人通过古老的计时工具来确认是否应该开门迎客,学士知道时间后则开始一天的读书学习,这种传统一直绵延至今。当今社会,人们的生活节奏飞快,在工作中讲究快速和效率,需要在最短的时间内完成最合理的工作要求,所以人们通常需要在最短的时间内了解到最丰富的信息,人们不满足于只能看到此时此刻的时间信息,还需要了解过去和未来几天内的时间情况,包括农历,天

万年历的算法

摘自: 星期、干支、二十八宿计算公式打印本页关闭本窗口 1. 求星期公式 星期=[5+A(实际天数)] mod 7 2. 干支计算公式 六十甲子干支序号,从1->59->0。 六十甲子干支序号=[23+A(实际天数)] mod 60 3. 二十八宿计算公式 二十八宿序号=[23+A(实际天数)] mod 28 4. 实际天数A的计算 A=B(基本天数)+C(闰日天数) B=(计算年-1)*365+(要计算到年的月日天数) 例:1984年2月1日的基本天数B=(1984-1)*365+(31+1)=723827(天), 其中,31是1月为31天,1为2月1日为1天。 公元308年8月28日的基本天数 B=(308-1)*365+(31+28+31+30+31+30+31+27)=112055+239=112294(天) 这里的(要计算到年的月日天数),用的是公历,月日天数的规则我好 象小学就学过了。哈哈…… C=(计算年-1) div 4 -误差修正值+ fixValue2 fixValue2为0或者1。常值为0,当年数为闰年(公历闰年法)之中的3月 1日之后的为1。 误差修正值推算: 公元元年1月1日至1582年10月14日为0。 1582年10月15日至1699年12月31日为10。 从1701年1月1日起每增加一个世纪累加1,但能被400除尽的世纪不累 加1。此方法推算即可。 --有一个问题,1700年这一年的修正值应为多少呢?算法中正好没有 讲到,但看来应该是10。 例1701年1月1日起误差值为11,而1801年1月1日起误差修正值为12,而1901年1月1日起误差修正值为13, 但2001年误差修正值仍为13,因为2000年能被400整除,故不累加。而2101年1月1日起误差修正值为14。 5. 实例:1998.3.15的星期、干支与二十八宿 B=(1998-1)*365+(31+28+15)=728979 C=(1998-1) div 4 - 13 + 0 = 486 A=B+C=728979+486=729465 星期序号=(5+729465) mod 7=0,即为星期日 干支序号=(13+729465) mod 60=58,即为辛酉

电子万年历

Tianjin University of Technology and Education 课程设计 学院:电子工程学院 班级:应电1211班 学生姓名:马登桂(01) 张婵(20) 李春鹏(22) 指导教师:马宁梁彩凤 2015年7月

天津职业技术师范大学 应电专业课程设计任务书 电子工程学院应电1211 班学生: 课程设计课题: 一、课程设计工作日自 2015 年 7 月 6 日至 2015 年 7 月 24日 二、同组学生: 三、课程设计任务要求: 要求全班同学每3人一组自由分组,每组在下列题目中任选2题,完成电路设计仿真、硬件焊接以及软件的编程与调试(统一采用AT89系列单片机): 题目1:基于单片机的多功能计算器设计题目(显示设备采用1602液晶模块) 基本要求:以4×4键盘作为输入,通过软件设计实现加减乘除计算功能,并显示; 扩展功能:进一步实现乘方、开方、对数、阶乘等科学计算功能。 题目2:基于单片机的电子万年历设计(显示设备采用1602液晶模块) 基本要求:通过软件设计实现年月日时间显示及时间设定等功能; 扩展要求:进一步实现定时闹钟功能。 题目3:基于单片机的温度采集显示电路设计(显示设备采用4位数码管) 基本要求:实现用DS18B20采集温度,并实时显示; 扩展要求:进一步实现预设温度告警功能。 指导教师:梁彩凤、马宁

目录

1基于单片机的电子万年历设计 1.1设计任务 基本要求:通过软件设计实现年月日时间显示及时间设定等功能; 扩展要求:进一步实现定时闹钟功能。 1.2 设计方案 1.2.1总体方框图 图1.1总体方框图 1.2.2整体功能说明: 本论文一主要研究基于单片机的万年历设计。当程序执行后,LCD显示即时时间、年月日、星期、温度。设置3个操作键:K1:设置键;K2:上调键;K3:下调键。本设计的主要内容:1、了解单片机技术的发展现状,熟悉万年历各模块的工作原理;2、选择适当的芯片和元器件,确定系统电路,绘制电路原理图,尤其是各接口电路;3、熟悉单片机使用方法和C语言的编程规则,编写出相应模块的应用程序;4、分别在各自的模块中调试出对应的功能,在Proteus软件上进行仿真。 1.3电路设计与分析

万年历说明书

万年历说明书 2、定闹的设置:按“D”键,进入定闹的设置,月数码管位置显示定闹序号,序号闪烁,按“B”或“C”键,可选择定闹1~4中的某个设置;再按“D”键时闪烁,按“B”或“C”键其调整为设置值;再按“D”键分闪烁,按“B”或“C”键其调整为设置值;再按“D”键,在日数码管位置显示“on”或“--”的定闹状态并闪烁,,按“B”或“C”键,关闭或开启此定闹,再按“D”键,退出定闹的设置。注:4个定闹中只要有1个或1个以上的定闹状态设置为开启,定闹指示灯即亮,只有所有定闹的状态都为关闭时,定闹指示灯才灭。 3、整点闹铃的设置:在正常运行状态下,按一下“B”键,面板上的整点闹指示灯“亮”表示整点闹铃已开启,反之,灯“灭”为关闭。 数码万年历使用说明书 作者pupaishop浏览213发布时间11/09/24 1.按键阐明:报时/退出键、设置键、上调键、下调/定闹键、流水键、模式/定闹键(模式键只在选为倒计天或逆计天才有)。 2.时光调剂: ①反常走时状态下,按“设置”键进进时间设置状态,同时暮年份“闪

耀”,可按“上调”或“下调”键建改暮年份,修正佳先按“设置”键将闪烁位移到公历“月”,按“上调”或“下调”键建改月份;用同样的方式可对于日、时、分、秒入止设置;12个公历节日及正计地数、24个农历节气及正计天数、12生肖、12星座、礼拜、工历月、日将自静追随母历的变更。 ②该秒设定佳先,再按“设置”键退出时间设置,归到正常时间状态。 3.12/24小时制切换: 在反常走时状态,按住“上调”键3秒钟,则可进止12小时制取24小时造的切换。 下电单位时,否默以为24大时造或者12大时造,由选项决议。4.启/闭零面报时: 在正常走时状态,按一下“上调”键,则可以挨开整点报时指导灯和整点报时功能;按一下“上调”键,则可以关关整点报时指导灯战整点报时功能。 5.地数正计时或逆计时(由选项决议) 在正常时间状态下,按“模式”键进入“天数计时状态”,在温度位显示“d1”,计时天数位若显示“????”,表示计时“无效”;若显示详细数字表示有效,按“上调”键可以切换“有效”/“无效”,按“设置”键进入天数设定,且右边第一位(千位)闪烁,按“上调”或“下调”键修改内容,按“设置”键挪动闪烁位置到第两位(百位),按“上调”或“下调”键修改闪烁位的内容,同样方式可设置十位取个位。

万年历

程序设计综合实践报告 (C语言) 项目名称:桌面万年历 班级:信息与计算2010级1班 姓名:郭玉豪 学号:201001051506 山东科技大学信息科学与工程学院 2012年12月

目录 1. 项目概述 (3) 1.1 需求陈述 (3) 1.2 开发技术、环境与工具 (3) 2. 软件需求 (4) 2.1 功能性需求 (4) 3. 软件架构设计 (4) 4. 软件详细设计与实现 (5) 4.1 主要模块的流程图 (5) 4.2 核心代码 (5) 5 总结与体会 (21) 5.1遇到的问题与解决途径 (21) 5.2 心得体会 (22)

1. 项目概述 1.1 需求陈述 本项目是桌面时钟与万年历的实现,时钟可以实现年月日、时分秒、天干地支及生肖的输出,并且还能显示阴历的日期。右击时钟会选中日历会出现日历的输出。日历上显示今天阳历的年月日、阴历的年月日、干支年,生肖及图片,并且右边还有年和月的加减,点击今日按钮时间就立刻转的电脑本地的日期。日历本身显现阳历与阴历,和国家法定节假日。在日历的右上角有个取消按钮。为了增加日历的外观,增加了换肤按钮,使得本万年历更加人性化。 1.2 开发技术、环境与工具 1.2.1(DrawClockText) 此函数给出了表盘的的年月日与时分秒、干支年和生效年的输出调用。 1.2.2(DrawCalendar) 此函数是日历表的输出函数,它实现了日历表的输出阳历时间和阴历时间,生肖与干支年的输出。1.2.3(用到的API函数) API函数参考: GetLocalTime: 获得当前时间(公历:年、月、日、周); MoveToEx: 移动划线的起点; LineTo: 绘制到某一点; SetTextColor: 设置要绘制的文字颜色; TextOut: 绘制文字; GetLocalTime:获得当前系统的本地时间; 结构体类型参考: SYSTEMTIME: 描述时间类型,包括年月日、时分秒、周; 系统调用: 根据已给样本的提示,绘制了日历的矩形背景,并且也根据公历日期来计算出农历日期,并且标注了一些重要节日,像“春节、元宵节、国庆节、端午节、中秋节”等一些重要的节日,并且将节假日的字体颜色设置为红色,然后又写了获取当前系统本机时间的函数,成功的获得了当前本机的时间,这在日历中就可以观察到。

相关文档
最新文档