题目2_时钟.c
资源名称:89s52_rtc.rar [点击查看]
上传用户:wzx8880901
上传日期:2009-04-09
资源大小:37k
文件大小:9k
源码类别:
嵌入式/单片机编程
开发平台:
C/C++
- #include <reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit p34=P2^2;
- sbit p35=P2^1;
- sbit p36=P2^0;
- sbit dula=P2^7;
- sbit wei1=P2^6;
- sbit wei2=P2^5;
- bit runnian,dayue,flag;
- uchar code tabledu[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x00};
- uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar nian,yue,ri,shi,fen,miao,xq,cont,day,days,s,tt,a;
- uint temp;
- int week(int y,int m,int d) ;
- void init();
- void display1();
- void display2();
- void delay(uchar z);
- void time();
- void year();
- void key();
- void jia();
- void jian();
- void xiaoy();
- void xiaoy1();
- void dxyue();
- void main()
- {
- init(); //初始化
- dxyue();
- while(1)
- {
- time();
- display1();
- display2();
- key();
- }
- }
- void key()
- {
- if(p34==0) //选择更改位。
- {
- delay(20); //去抖
- if(p34==0)
- {
- while(!p34)
- {
- display1(); //显示子函数打包
- display2();
- }
- delay(10);
- s++;
- cont=0; //保证按键按下时间过长时,松开后,能马上闪烁而不用等待.
- if(s==7)
- {
- s=0;
- }
- }
- }
- if(p35==0) //加位
- {
- if(s==0) // 没有按p34的情况下,按P35或P36的无效。
- {}
- else
- { delay(10);
- if(p35==0)
- {
- while(!p35)
- {
- display1(); //显示子函数打包
- display2();
- }
- jia();
- }
- }
- }
- if(p36==0) //减位
- {
- if(s==0) // 没有按p34的情况下,按P35或P36的无效。
- {}
- else
- { delay(10);
- if(p36==0)
- {
- while(p36==0)
- {
- display1(); //显示子函数打包
- display2();
- }
- jian();
- }
- }
- }
- }
- void jian() //减
- {
- if(s==1) //年
- {
- nian--; xq=week(nian,yue,ri);
- if(nian==0xff) //2099年
- {
- nian=99;
- }
- year();
- }
- if(s==2) //月
- {
- yue--; xq=week(nian,yue,ri);
- if(yue==0)
- {
- yue=12;
- }
- dxyue();
- }
- if(s==3) //日
- {
- ri--; xq=week(nian,yue,ri);
- if(ri==0)
- {
- if(yue==2)
- {
- if(runnian)
- {
- ri=29;
- }
- else
- {
- ri=28;
- }
- }
- else
- {
- if(dayue)
- {
- ri=31;
- }
- else
- {
- ri=30;
- }
- }
- }
- }
- if(s==4)
- {
- shi--;
- if(shi==0xff)
- {
- shi=23;
- }
- }
- if(s==5)
- {
- fen--;
- if(fen==0xff)
- {
- fen=59;
- }
- }
- if(s==6)
- {
- miao--;
- if(miao==0xff)
- {
- miao=59;
- }
- }
- }
- void jia()
- {
- if(s==1)
- {
- nian++; xq=week(nian,yue,ri);
- year();
- }
- if(s==2)
- {
- yue++; xq=week(nian,yue,ri);
- if(yue==13)
- {
- yue=1;
- }
- dxyue();
- }
- if(s==3)
- {
- ri++; xq=week(nian,yue,ri);
- if(yue==2)
- {
- if(ri>=day)
- {
- ri=1;
- }
- }
- else
- {
- if(ri>=days)
- {
- ri=1;
- }
- }
- }
- if(s==4)
- {
- shi++;
- if(shi==24)
- {
- shi=0;
- }
- }
- if(s==5)
- {
- fen++;
- if(fen==60)
- {
- fen=0;
- }
- }
- if(s==6)
- {
- miao++;
- if(miao==60)
- {
- miao=0;
- }
- }
- }
- void init()
- {
- flag=1;
- TMOD=0x01;
- TH0=0X4C;
- TL0=0X00;
- EA=1;
- ET0=1;
- TR0=1;
- nian=8;
- yue=11;
- ri=22;
- shi=20;
- fen=30;
- year();
- s=0;
- P0=0;
- dula=wei1=wei2=0;
- }
- void xiaoy()
- {
- //------------------------------
- P0=0;
- dula=1;
- P0=0;
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[7];
- wei2=0;
- delay(1);
- //------------------------------
- }
- void xiaoy1()
- {
- //------------------------------
- P0=0;
- dula=1;
- P0=0;
- dula=0;
- P0=0xff;
- wei1=1;
- P0=tablewe[7];
- wei1=0;
- delay(1);
- //------------------------------
- }
- void display2() //时分秒
- {
- uchar x,y;
- //----------------------------------
- x=shi%100/10; //时十位
- y=shi%10; //时个位
- P0=0x00;
- if(s==4) //校对时间时闪烁用。
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=1;
- P0=tabledu[x];
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[0];
- wei2=0;
- delay(2);
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- P0=0; //时个
- dula=1;
- P0=tabledu[y];
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[1];
- wei2=0;
- delay(2);
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- x=fen%100/10; //分十位
- y=fen%10; //分个位
- if(s==5)
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=1;
- P0=tabledu[x];
- dula=0; P0=0xff;
- wei2=1;
- P0=tablewe[2];
- wei2=0;
- delay(2);
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- //分个位
- P0=0;
- dula=1;
- P0=tabledu[y];
- dula=0; P0=0xff;
- wei2=1;
- P0=tablewe[3];
- wei2=0;
- delay(2);
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- x=miao%100/10; //秒十位
- y=miao%10;
- //秒十位
- if(s==6)
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=1;
- P0=tabledu[x];
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[4];
- wei2=0;
- delay(2);
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- P0=0; //秒个位
- dula=1;
- P0=tabledu[y];
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[5];
- wei2=0;
- delay(2);
- P0=0;
- //--------------------------
- xiaoy(); //消隐
- //--------------------------
- //----------------------------------
- P0=0; //星期显示
- dula=1;
- P0=tabledu[xq];
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[6];
- wei2=0;
- delay(2);
- P0=0;
- //--------------------------------
- P0=0; //无效作用位
- dula=1;
- P0=0;
- dula=0;
- P0=0xff;
- wei2=1;
- P0=tablewe[7];
- wei2=0;
- delay(2);
- P0=0;
- //-----------------
- }
- void display1() //年月日
- {
- uchar x,y;
- //----------------------------------
- x=nian%100/10; //年十位
- y=nian%10; //年个位
- P0=0x00;
- if(s==1) //校对时间时闪烁用。
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=0;
- dula=1;
- P0=tabledu[x];
- dula=0;
- P0=0xff;
- wei1=0;
- wei1=1;
- P0=tablewe[0];
- wei1=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- dula=0;
- P0=0; //年个
- dula=1;
- P0=tabledu[y];
- dula=0;
- P0=0xff;
- wei1=1;
- P0=tablewe[1];
- wei1=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- //----------------------------------
- //----------------------------------
- x=yue%100/10; //月十位
- y=yue%10; //月个位
- if(s==2)
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=1;
- P0=tabledu[x];
- dula=0; P0=0xff;
- wei1=1;
- P0=tablewe[2];
- wei1=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- //月个位
- P0=0;
- dula=1;
- P0=tabledu[y];
- dula=0; P0=0xff;
- wei1=1;
- P0=tablewe[3];
- wei1=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- //----------------------------------
- //----------------------------------
- x=ri%100/10; //日十位
- y=ri%10;
- //日个位
- if(s==3)
- {
- if(cont==12)
- {
- cont=0;
- flag=~flag;
- }
- if(flag)
- {
- x=0x0a;
- y=0x0a;
- }
- }
- P0=0;
- dula=1;
- P0=tabledu[x];
- dula=0; P0=0xff;
- wei1=1;
- P0=tablewe[4];
- wei1=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- P0=0; //日个位
- dula=1;
- P0=tabledu[y];
- dula=0;
- P0=0xff;
- wei1=1;
- P0=tablewe[5];
- wei1=0;
- P0=0;
- delay(2);
- //--------------------------
- xiaoy1(); //消隐
- //--------------------------
- //----------------------------------
- P0=0; //第一锁存器无效作用位
- dula=1;
- P0=0 ;
- dula=0;
- P0=0xff;
- wei1=1;
- P0=tablewe[6];
- wei1=0;
- P0=0;
- delay(2);
- //---------------------
- }
- void year() //平润年
- {
- uint aaa;
- aaa=2000+nian; //为了计算闰年。
- if(((aaa%4 == 0)&&(aaa%100!=0)) || (aaa%400==0))
- {
- runnian=1;
- day=30; //闰年
- }
- else
- {
- runnian=0;
- day=29; //平年
- }
- }
- void dxyue() //大小月
- {
- if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)
- {
- days=32; //31天
- }
- else
- {
- days=31; //30天
- }
- }
- void time()
- {
- if(cont==40) //一秒钟加一。不是很精确。
- {
- cont=0;
- miao++;
- if(miao==60)
- {
- miao=0;
- fen++;
- if(fen==60)
- {
- fen=0;
- shi++;
- if(shi==24)
- {
- shi=0;
- ri++;
- xq=week(nian,yue,ri);
- dxyue();
- if(yue!=2)
- {
- if(ri==days)
- {
- ri=1;
- yue++;
- xq=week(nian,yue,ri);
- if(yue==13)
- {
- yue=1;
- nian++;
- xq=week(nian,yue,ri);
- year();
- }
- }
- }
- else
- {
- if(ri==day)
- {
- ri=1;
- yue++;
- }
- }
- }
- }
- }
- }
- }
- void dingshi() interrupt 1
- {
- TH0=0x4C;
- TL0=0x00;
- cont++;
- }
- void delay(uchar z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=20;y>0;y--);
- }
- int week(int y,int m,int d)
- {
- int m_d[12]={2,5,5,1,3,6,1,4,7,2,5,7};
- int i,j,k=0;
- int s=2;
- int w=0;
- y=2000+y;
- if (((y%4==0)&&(y%100!=0))||(y%400)==0)
- {
- if (m<=2)
- j=y-1;
- else
- j=y;
- }
- else
- j=y;
- for (i=1904;i<=y;i=i+4)
- {
- if (i%100!=0)
- k++;
- else if (i%400==0)
- k++;
- }
- w=((j-1904+s+k)+m_d[m-1]+d)%7;
- return (w);
- }