|
- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- //**************寄存器宏定義*******************************
- #define write_miao 0x80
- #define write_fen 0x82
- #define write_shi 0x84
- #define read_miao 0x81
- #define read_fen 0x83
- #define read_shi 0x85
- #define write_protect 0x8e
- //*********************************************************
- sbit ACC_7=ACC^7; //管腳定義
- sbit sclk=P3^5; //ds1302時鐘信號
- sbit dio=P3^6; //ds1302數(shù)據(jù)信號
- sbit ce=P3^7; //ds1302片選
- //*********************************************************
- sbit wei=P2^0;
- sbit duan=P2^1;
- sbit k1=P1^0;
- sbit k2=P1^1;
- uchar table[]={0x3f,0x06,0x5b,0x4f, //0,1,2,3
- 0x66,0x6d,0x7d,0x07, //4,5,6,7
- 0x7f,0x6f,0x40,0x00}; //8,9,-,空格
- uchar wela[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar num,num1,num2,shi,fen,miao,m,s;
- char guo0,guo1,guo2;
- /********************地址、數(shù)據(jù)發(fā)送子程序*******************/
- void write1302(uchar addr,dat)
- {
- uchar i,temp;
- ce=0; //ce引腳為低,數(shù)據(jù)傳送中止
- sclk=0; //清零時鐘總線
- ce=1; //ce引腳為高,邏輯控制有效
- //發(fā)送地址
- for(i=8;i>0;i--) //循環(huán)8次移位
- {
- sclk=0;
- temp=addr;
- dio=(bit)(temp&0x01);//每次傳輸?shù)妥止?jié)
- addr>>=1; //右移一位
- sclk=1;
- }
- //發(fā)送數(shù)據(jù)
- for(i=8;i>0;i++)
- {
- sclk=0;
- temp=dat;
- dio=(bit)(temp&0x01);
- dat>>=1;
- sclk=1;
- }
- ce=0;
- }
- /******************數(shù)據(jù)讀取子程序*******************/
- uchar read1302(uchar addr)
- {
- uchar i,temp,dat1; // dat2,
- ce=0;
- sclk=0;
- ce=1;
- //發(fā)送地址
- for(i=8;i>0;i--)
- {
- sclk=0;
- temp=addr;
- dio=(bit)(temp&0x01);//每次傳輸?shù)妥止?jié)
- addr>>=1;
- sclk=1;
- }
- //讀取數(shù)據(jù)
- for(i=8;i>0;i--)
- {
- ACC_7=dio;
- sclk=1;
- ACC>>=1;
- sclk=0;
- }
- ce=0;
- dat1=ACC;
- return(dat1);
- }
- /*****************初始化ds1302**********************/
- void initial()
- {
- TMOD=0x01;
- TH1=(65536-56074)/256; // 11.05768M.
- TL1=(65536-56074)%256;
- EA=1; // 打開中斷允許
- ET1=1; // 開起計數(shù)器0
- EX0=1;
- }
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void display(uchar duan_i,uchar wela_i)
- {
- duan=1;
- P0=table[duan_i];
- duan=0;
- wei=1;
- P0=wela[wela_i];
- wei=0;
- delay(1);
- P0=0;
- }
- void display_1()
- {
- display(shi/16,0);
- display(shi%16,1);
- display(10,2);
- display(fen/16,3);
- display(fen%16,4);
- display(10,5);
- display(miao/16,6);
- display(miao%16,7);
- }
- void display_2()
- {
- while(m==3&&num2%2!=0)
- {
- display(11,0);
- display(11,1);
- display(10,2);
- display(fen/16,3);
- display(fen%16,4);
- display(10,5);
- display(miao/16,6);
- display(miao%16,7);
- }
- while(m==1&&num2%2!=0)
- {
- display(shi/16,0);
- display(shi%16,1);
- display(10,2);
- display(fen/16,3);
- display(fen%16,4);
- display(10,5);
- display(11,6);
- display(11,7);
-
- }
- while(m==2&&num2%2!=0)
- {
- display(shi/16,0);
- display(shi%16,1);
- display(10,2);
- display(11,3);
- display(11,4);
- display(10,5);
- display(miao/16,6);
- display(miao%16,7);
- }
- while(num2%2==0)display_1();
- }
- char fun_1(uchar u)
- {
- u=u/16*10+u%16; //將十六進(jìn)制轉(zhuǎn)化為十進(jìn)制
- u++;
- s=0;
- u>=60?u=0:u;
- u=u/10*16+u%10; //將十進(jìn)制轉(zhuǎn)化為十六進(jìn)制BCD
- return u;
- }
- void keyboard()
- {
- if(k1==0)
- delay(5);
- if(k1==0)
- {
- if(TR1=1,m++,m==4)
- {
- m=0;
- TR1=0;
- }
- while(!k1)display_1();
- }
- if(m!=0)
- {
- if(k2==0)
- {
- if(delay(5),s=1,m==1&&s!=0)
- {
- miao=fun_1(miao);
- write1302(write_protect,0x00);
- write1302(write_miao,miao);
- write1302(write_protect,0x80);
- }
- if(m==2&&s!=0)
- { fen=fun_1(fen);
- write1302(write_protect,0x00);
- write1302(write_fen,fen);
- write1302(write_protect,0x80);
- }
- if(m==3&&s!=0)
- {
- shi=shi/16*10+shi%16;
- shi++;
- shi>=24?shi=0:shi;
- shi=shi/10*16+shi%10;
- write1302(write_protect,0x00);
- write1302(write_shi,shi);
- write1302(write_protect,0x80);
- }
- while(!k2)display_1();
- }
- }
- }
- void main()
- {
- initial();
- while(1)
- {
- shi=read1302(read_shi);
- fen=read1302(read_fen);
- miao=read1302(read_miao);
- keyboard();
- /* if(m!=0)
- {
- write1302(write_protect,0x00); //禁止寫保護(hù)
- write1302(write_shi,shi);
- write1302(write_fen,fen);
- write1302(write_miao,miao);
- write1302(write_protect,0x80); //允許寫保護(hù)
- } */
- m!=0?display_2():display_1();
- }
- }
- void time_1() interrupt 3
- {
- if(TH1=(65536-56074)/256,TL1=(65536-56074)%256,num1++,num1==20)
- {
- num1=0;
- num2++;
- }
- }
- 說實話,我對這個程序不是很滿意,因為這個程序在設(shè)置部分還有不足,比如說在設(shè)置的時候秒還在走;如果說要在設(shè)置的時候讓時候不走,那么就得每時每刻都往1302中寫入秒,但是寫的時間又太長,從而導(dǎo)致了常亮部分也出現(xiàn)了閃爍的現(xiàn)象:
- /* if(m!=0)
- {
- write1302(write_protect,0x00); //禁止寫保護(hù)
- write1302(write_shi,shi);
- write1302(write_fen,fen);
- write1302(write_miao,miao);
- write1302(write_protect,0x80); //允許寫保護(hù)
- } */
- 我不知道為什么寫的時間會有那么長,以致于出現(xiàn)了閃爍現(xiàn)象,之后我為了消除這個現(xiàn)象,就用了這個結(jié)構(gòu):
- if(k2==0)
- {
- if(delay(5),s=1,m==1&&s!=0)
- {
- miao=fun_1(miao);
- write1302(write_protect,0x00);
- write1302(write_miao,miao);
- write1302(write_protect,0x80);
- }
- 但這個結(jié)構(gòu)有不足之處,簡單的說就是只有在做加法時才能讀寫入,其他時間都不會讀寫入。正因為這樣才消除了閃爍,但是這個方法卻帶來了新的問題,由于這個程序只有在做加法時才能讀寫入所以在不讀寫入的時間里時間一直在走。
- 用1302做的時鐘最吸引人眼球的就是在斷電的時候不影響時間的進(jìn)行,不過這需要備用電源的支持!
復(fù)制代碼
|
|