的大神,单片机电子万年历的程序怎么计算平年和闰年

作者&投稿:貂孔 (若有异议请与网页底部的电邮联系)
单片机控制数字万年历c程序 要求:可调整年、月、日、时间;判断闰年、农历时间、只使用52芯片 程序最好带~

唯一的农历不知道怎么判断?
#include

#define uchar unsigned char
#define uint unsigned int

/***********************************
P2.0~P2.7~P0.7~P0.0~P1.0位列扫描控制端口,低电平有效。
P3.0~P3.7为断码控制端口,低电平有效。
P1.1~P1.3为按键端口,下拉电阻,高电平有效。
P1.4声音输出端口。
***********************************/

sbit AJ_SET = P1^1 ;
sbit AJ_ADD = P1^2 ;
sbit AJ_DEN = P1^3 ;
sbit shengyin = P1^4;

//位驱动码0111 1111 ; 1011 1111 ; 1101 1111 ; 1110 1111 ; 1111 0111 ; 1111 1011 ; 1111 1101 ; 1111 1110
// 1 2 3 4 5 6 7 8
uchar bittab[18]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFE,0xFF};

//uchar disptab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//bit 7 6 5 4 3 2 1 0
//段为 h g f e d c b a
//字形码1100 0000;1111 1001;1010 0100;1011 0000;1001 1001;1001 0010;
//显示字符 0 1 2 3 4 5
//字形码1000 0010;1111 1000;1000 0000;1001 0000;1011 1111
//显示字符 6 7 8 9 --

uchar disptab[]={0x03,0x9f,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0XFD};

uint dispbuf[17]; //显示缓冲区

struct time
{
uchar second;
uchar cent;
uchar hour;
uint year;
uchar yue;
uchar ri;
uchar xq;
}packet;



uchar count=0;
uchar jjs=0;
uchar js=0;
uchar tmp;
uchar sy=0;


void delay(x)
{
uint l ;
for(l=x;l<=0;l--) ;
}


void Timer1() interrupt 1 //1为定时器0溢出
{
TH0=(65536-49981)/256;
TL0=(65536-49981)%256; //
TR0=1; //定时器0 开始运行
TF0=0;//TF1定时器1溢出中断标志,响应中断后由处理器清零
count++;
if(count>=20) //1S计数到
{
count=0;
(packet.second)++;
if((packet.second)>=60)
{
(packet.second)=0;
(packet.cent)++;
if((packet.cent)>=60)
{
(packet.hour)++;
(packet.cent)=0;
if((packet.hour)>=24)
{
packet.hour=0;
(packet.ri)++;
(packet.xq)++;

if((packet.xq)>=8)
(packet.xq)=1;

if(((packet.ri)==28)&&((packet.year)%4==0)&&((packet.yue)==2))
{ (packet.ri)=1;
(packet.yue)++;}
if(((packet.ri)==29)&&((packet.year)%4!=0)&&(packet.yue)==2)
{ packet.ri=1;
(packet.yue)++;}
if(((packet.ri)==30)&&((packet.yue)==4)||((packet.yue)==6)||((packet.yue)==9)||((packet.yue)==11))
{ packet.ri=1;
(packet.yue)++;}
if(((packet.ri)==31)&&((packet.yue)==1)||((packet.yue)==3)||((packet.yue)==5)||((packet.yue)==7)||((packet.yue)==8)||((packet.yue)==10)||((packet.yue)==12))
{ packet.ri=1;
(packet.yue)++;}

if((packet.yue)>=13)
{ packet.yue=1;
(packet.year)++;
if((packet.year)>=2019)
(packet.year)=2011;
}

}
}
}
}
}


void Timer2() interrupt 3 //3为定时器1溢出;
{

TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
TF1=0; //TF1定时器1溢出中断标志,响应中断后由处理器清零
TR1=1; //定时器1 开始运行
js++;
if(js>17) //20MS计数
{
js=0;
}

tmp=bittab[js]; //位驱动码从第0位开始

P1=P1|0x01;
P2=P2|0xFF; //1111 1100----0011 1111
P0=P0|0xFF;
P3=P3|0XFF ;
delay(10) ;
switch(jjs)
{
case 0:{
if(js<=7)
P2=P2&tmp;
if((js>7)&&(js<=15))
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 1:{
if(js3)||count>=250))
P2=P2&tmp;
if(js>7&&js<=15)
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 2:{
if(js6)||count>=250))
P2=P2&tmp;
if(js>7&&js<=15)
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 3:{
if(js7)||count>=250))
P2=P2&tmp;
if(js>7&&js<=15)
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 4:{
if(js<=7)
P2=P2&tmp;
if(js>7&&js8)||count>=250))
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 5:{
if(js<=7)
P2=P2&tmp;
if(js>7&&js10)||count>=250))
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
case 6:{
if(js<=7)
P2=P2&tmp;
if(js>7&&js13)||count>=250))
P0=P0&tmp;
if(js>15)
P1=P1&tmp;
break;
}
default: break;
}

tmp=dispbuf[js];
tmp=disptab[tmp]; //字符对应的字形码
P3=tmp;
}


/*************************************
判断按键是什么按键,返回1,2,3
*************************************/
uchar setkey(key)
{
uchar x=key ;
if((x|0xE1)==0xE3) //1110 0001
x=1;
if((x|0xE1)==0xE5)
x=2;
if((x|0xE1)==0xE9)
x=3;
if((x|0xE1)==0xf1)
x=4;
return(x);
}
/*******************************
执行按键对应的功能
*******************************/
void smkey(temp)
{
uchar x=temp ;
switch(x)
{
case 1: {
jjs++;
if(jjs>6)
jjs=0;
break;
}

case 2:{
if(jjs==1)
{
(packet.year)++;
if((packet.year)>9999)
(packet.year)=0;
}
if(jjs==2)
{
(packet.yue)++;
if((packet.yue)>12)
(packet.yue)=1;
}
if(jjs==3)
{
(packet.ri)++;
if((packet.ri)==28&&(packet.year)%4!=0&&(packet.yue)==2)
(packet.ri)=1;
if((packet.ri)==29&&(packet.year)%4==0&&(packet.yue)==2)
(packet.ri)=1;
if((packet.ri)==30&&((packet.yue)==4||(packet.yue)==6||(packet.yue)==9||(packet.yue)==11))
(packet.ri)=1;
if((packet.ri)==31&&((packet.yue)==1||(packet.yue)==3||(packet.yue)==5||(packet.yue)==7||(packet.yue)==8||(packet.yue)==10||(packet.yue)==12))
(packet.ri)=1;
}
if(jjs==4)
{
(packet.xq)++;
if((packet.xq)>7)
(packet.xq)=1;
}
if(jjs==5)
{
(packet.hour)++;
if((packet.hour)>=60)
(packet.hour)=0;
}
if(jjs==6)
{
(packet.cent)++;
if((packet.year)>=60)
(packet.year)=0;
}
break;
}

case 3:{
if(jjs==1)
{
(packet.year)--;
if((packet.year)==2011)
(packet.year)=2019;
}
if(jjs==2)
{
(packet.yue)--;
if((packet.yue)==0)
(packet.yue)=12;
}
if(jjs==3)
{
(packet.ri)--;
if((packet.ri)==0&&(packet.year)%4!=0&&(packet.yue)==2)
(packet.ri)=28;
if((packet.ri)==0&&(packet.year)%4==0&&(packet.yue)==2)
(packet.ri)=29;
if((packet.ri)==0&&((packet.yue)==4||(packet.yue)==6||(packet.yue)==9||(packet.yue)==11))
(packet.ri)=30;
if((packet.ri)==0&&((packet.yue)==1||(packet.yue)==3||(packet.yue)==5||(packet.yue)==7||(packet.yue)==8||(packet.yue)==10||(packet.yue)==12))
(packet.ri)=31;
}
if(jjs==4)
{
(packet.xq)--;
if((packet.xq)==0)
(packet.xq)=7;
}
if(jjs==5)
{
(packet.hour)--;
if((packet.hour)<0)
(packet.hour)=59;
}
if(temp==3&&jjs==6)
{
(packet.cent)--;
if((packet.year)<0)
(packet.year)=59;
}
break;
}
case 4:{
sy++;
if(sy>6)
sy=0;
break;
}

default: break;
}
}

//********************************
void dlay(uchar x ,uchar y)
{
uchar a,b ;
for(a=x;a>0;a--)
for(b=3;b>0;b--) ;

for(a=y;a>0;a--)
for(b=3;b>0;b--) ;
}

void dlay2(uchar x)
{
uchar a,b ;
for(a=x;a>0;a--)
for(b=6;b>0;b--) ;
}

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

uint x;
uchar m, n=0 ;
void main()
{
P0=0xff;
P1=0x01;
P2=0xff;
P3=0xFF; //全灭

TMOD=0x11; //定时器1 工作于定时方式1
//设置定时器模式
// bit7 6 5 4 3 2 1 0
// 0 0 0 1 0 0 0 1
// GATE C/T M1 M0 GATE C/T M1 M0
// 定时器1 ; 定时器0
// GATE=0只要置位TR定时器就开始工作.
// 定时器1 M1:M0=0:1工作在定时方式1

TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //
TR0=1;
EA=1; //所有中断打开
ET0=1;

TH1=(65536-2500)/256;
TL1=(65536-2500)%256; //
TR1=1; //定时器1 开始运行
ET1=1; //定时器1中断允许

packet.hour=12;
packet.cent=0;
packet.second=0;
packet.year=2011 ;
packet.yue=1;
packet.ri=1;
packet.xq=1;

while(1)
{
dispbuf[0]=packet.year/1000 ;
x=packet.year%1000 ;
dispbuf[1]=x/100 ;
x=x%100 ;
dispbuf[2]=x/10 ;
x=x%10 ;
dispbuf[3]=x%10 ;

dispbuf[4]=packet.yue/10 ;
dispbuf[5]=packet.yue%10 ;

dispbuf[6]=packet.ri/10 ;
dispbuf[7]=packet.ri%10 ;

dispbuf[8]=packet.xq ;
if(dispbuf[8]==7)
dispbuf[8]=8;

dispbuf[9]=packet.hour/10 ;
dispbuf[10]=packet.hour%10 ;

dispbuf[11]=10 ;

dispbuf[12]=packet.cent/10 ;
dispbuf[13]=packet.cent%10 ;

dispbuf[14]=10 ;

dispbuf[15]=packet.second/10 ;
dispbuf[16]=(packet.second)%10 ;



P1=P1&0xE1; //1110 0001
m=P1;
if((m|0xE1)==0xE1) //1110 0001
{
m=0;
if(n!=0)
smkey(n);
}
else
{
n=setkey(m);
}
}
}

电子万年历的程序已经够大的了,还要加计算器,还一毛不拔,难呀,没人会帮到你的。

能被4整除且不能被100整除确可以被400整除的年的为闰年。比如2016年为闰年,2100年不为闰年,2000年为闰年。


单片机控制的电子闹钟系统 这是我的电路图,请各位大神帮我看看需要什...
我就说主要的东西吧,电阻电容晶振二极管等我就不说了。单片机是89C2051。74LS164四片,8段数码管四只,7805一只。

的大神,单片机电子万年历的程序怎么计算平年和闰年
能被4整除且不能被100整除确可以被400整除的年的为闰年。比如2016年为闰年,2100年不为闰年,2000年为闰年。

单片机大神有哪些人
一、吴鉴鹰 吴鉴鹰,男,1985.9,老家安徽安庆,04年毕业于电子科技大学学生,后接触单片机,已经成为单片机领域的一个企业家,名下有鉴鹰电子科技有限公司,主要进行教育类电子产品的开发和电力电力产品以及智能仪器仪表的开发,旗下的产品有高频数字电源,网络分析仪,矿下安全检测系统,无损探测仪等高科技...

如何评价单片机大神郭天祥?
他的10天学会单片机和C语言确实不错,便于入门,郭也火了一把,但他们公司的其他开发板也不是他讲的,确实也下咋的,板子还比较贵,特别是ARM开发板,相比野火和正点原子没什么优势

电子发烧友的单片机大神有哪些啊,除了吴鉴鹰那些人。
吴鉴鹰就是很厉害的单片机大神了。

求单片机大神
ORG 001BH LJMP T1ISR ORG 0030H MAIN:MOV TMOD,#10H MOV TH1,#HIGH(65536-50000)MOV TL1,#LOW(65536-50000)SETB TR1 SETB ET1 SETB EA MOV R2,#20 MOV R3,#5 SJMP T1ISR:CLR TR1 MOV TH1,#HIGH(65536-50000)MOV TL1,#LOW(65536-50000)SETB TR1 DJNZ R2,T1E MOV R2,#20 DJNZ ...

求单片机大神给我指点方向 想要精通单片机要学习什么 我现在学起来感觉...
你知道学习单片机的几个要点就可以慢慢入门了:1、学习IO口,知道IO口都干什么,输入、输出的条件。2、学习中断:外部中断、定时器中断、串口中断 3、学习存储结构:内部寄存器的几大类(工作寄存器(4组R0~R7)、位址空间20H~2FH、用于寄存器30H~7FH、特殊功能寄存器80H~FFH)外部扩展存储器。4、学习...

跪求单片机的大神:本人专业是计算机相关的,一直想从事单片机相关的工 ...
1,汇编语言,c语言 2,电路,数字电路,模拟电路 3,接口技术,传感器技术 4,一些相关芯片 5,相关的数学知识 6,软件操作知识 7,自动控制原理 这些可以在郭天祥老师的C51单片机C语言教程+数字电路这里入门后,然后逐步学习,深入学习,想要学好单片机,这些基础还不行,要有思想,勤奋,积累,坚持,才会学的很好....

谈谈你对单片机的认识?拜托各位大神
单片机是靠程序的,并且可以修改。通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是...

单片机大神编个程序
ORG 0000HLJMP MAINORG 0023HLJPM UARTORG 0030HMAIN:MOV TMOD,#20HMOV TH1,#0FDHMOV TL1,#0FDHSETB TR1SETB ESSETB EAMOV SCON,#50HSJMP $UART:JBC RI,UART1RETIUART1:MOV A,SBUFCJNE A,#'A',UARTEMOV SBUF,#'O'JNB TI,$CLR TIMOV SBUF,#'K'JNB TI,$CLR TIUARTE:RETI ...

舒兰市19484117920: 的大神,单片机电子万年历的程序怎么计算平年和闰年 -
诺戚茵白: 能被4整除且不能被100整除确可以被400整除的年的为闰年.比如2016年为闰年,2100年不为闰年,2000年为闰年.

舒兰市19484117920: 急求单片机编程高手帮我编一个AT89C51的时钟+万年历的程序! -
诺戚茵白: 基于单片机的数字钟(电子万年历) http://hi.baidu.com/dsu5566/blog/item/7cfe0fa480cd14fe9152eec8.html

舒兰市19484117920: 电子日历单片机制作 -
诺戚茵白: 用51单片机就可以做.编写软件用keil.仿真软件可以用Proteus.方案可以有以下2种:1.用专门的时钟芯片,比较经典的有DS12887和DS1302,任一种都是可以的.模块就是单片机最小系统+时钟芯片模块电路就可以了.2.利用单片机的定时器来做,只是误差要大一些,也可以实现功能.日历的显示可以用液晶模块:1602,或者是用数码管搭建(较麻烦).网上应该有现成的仿真资料的,这基本都是学习单片机需要做的一个实验.如果对模块非常熟悉,可以直接买实物焊接.如果只是做着玩,做做仿真就行了.

舒兰市19484117920: 一周内基于51单片机电子万年历设计 -
诺戚茵白: 第一首先你得学会编程(C语言或者汇编语言) 第二你还得会熟练使用51单片机的内部资源,主要是定时器,IO,中断.当然51内部定时器的时钟做钟表精度差,基本每天需要调时,另外就是断电后时间不能保存,建议你使用RTC芯片或者具有RTC的单片机,第三:你要懂的按键的消抖原理,第四:你要看懂DS18B20和1602液晶的数据手册或者看懂别人写的驱动测序也可以(建议你自己写驱动程序,这样你会学习到很多东西的,特别是对液晶的扫描方式和单总线的理解更加深刻,你也会尝到其中的乐趣,);第五:如果你需要自己绘制硬件电路,你还得清楚单片机的最小系统,普通的电源供电系统,IO的合理分配.

舒兰市19484117920: 51单片机万年历编程? -
诺戚茵白: 万年历用的时钟芯片一般都是DS1302,会使用DS1302就基本没什么问题了,下面是我做过电子小闹钟写的DS1302头文件,希望能给你帮助#define uchar unsigned char#define uint unsigned intvoid ds1302writebyte(uchar date) //写一个字节 { ...

舒兰市19484117920: 单片机万年历的制作流程,请尽量详细?以及需要的元件? -
诺戚茵白: 你的这个项目有点难度,首先要语音芯片如616,存储芯片如20c02,时钟芯片如1307,电源(整流,滤波恒压)如1400,显示(是数码管还是lcd)按键.电阻,电容等...

舒兰市19484117920: 电子万年历:用C语言设计一个年历系统,功能要求: (1)输入任一年将显示出该年的所有月份日期,对应的星 -
诺戚茵白: //这个可以吧 #include "stdio.h" long int f(int year,int month) {/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/if(month<3) return year-1;else return year; }long int g(int month) {/*g(月)=月+13,如月<3;否则,g(月)=月+1*/if(month<...

舒兰市19484117920: 100高分求【单片机】高手赐教,给个思路.课程设计题目是:多功能电子万年历
诺戚茵白: 用DS1302来计时,不过他只能计阳历,然后网上有很多的阳历转阴历的算法程序,直接找个就可以了具体调整时间,定时什么的,都是很简单的东西掉电存储没用过1302的,一般要是实验板的话应该会有个AT24C01或02之类的芯片,他应该是让你往那里面存,然后每次开机读出来,需要修改的话就在吧新的数据写进去.

舒兰市19484117920: 毕业设计基于STM32的电子万年历设计制作?哪位大神知道怎么做,大概步骤怎样? -
诺戚茵白: stm32本来就带了rtc,就不用时钟芯片了,然后找个显示屏,例如点阵之类的,再移植个万年历算法就搞完了

舒兰市19484117920: 基于AT89C51单片机的电子万年历设计,能够显示日期,时间,温度湿度,最好是闹钟.急急急,求大神指点 -
诺戚茵白: 单片机读取时钟芯片和温湿度传感器的数据,然后在1602上面做显示.下载DS1302和LCD1602的数据手册,看看工作时序和寄存器就行了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网