|
- ///////////////////////////////////////////////////////////////////
- /*名稱:單片機定時開關且定時放樂電子鐘, /
- /*作者:周光明 /
- /*時間:2010年12月6日 /
- /*功能: /
- /* /
- /* /
- ///////////////////////////////////////////////////////////////////*/
- #include <reg52.h>
- #include "ds1302.c" //ds1302芯
- #include "lanhuacao.c" //蘭花草音樂
- #define uchar unsigned char
- #define uint unsigned int
- #define sjck P0
- #define wei P2
- #define hua 0xf7
- #define ds_o 0xa3 ///o
- #define ds_n 0xab ///n
- #define ds_f 0x8e ///f
- #define xds 0xc0 //寫DS1302初地址
- #define dds 0xc1 //讀初值地址
- uchar rem[8]={0,1,10,3,4,10,6,7};
- uchar remds[6][2]={
- {0x00,0x00},
- {0x00,0x00},
- {0x00,0x00},
- {0x00,0x00},
- {0x00,0x00},
- {0x00,0x00},
- };
- uchar code bcd[15]={0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0xbf,0xff,
- 0xa3,0xab,0x8e};
- uchar ii,moshi,moshi_h,tiao,time_1;
- uint tt,tt1,msgl;
- bit aj_1,shan_1,ds_1,ds_2,qr_1;
- sbit jidianqi=P3^0;
- sbit e=P3^3;
- sbit SB0=P1^0;
- sbit SB1=P1^1;
- sbit SB2=P1^2;
- sbit SB3=P1^3;
- sbit SB4=P1^4;
- sbit dsd0=P0^7;
- /******************延時*********************/
- yanshi(uint t)
- {
- while(t--);
- }
- //////////////////////////////////////////////
- /******************顯示*********************/
- xianshi(uint t)
- {
- sjck=0xff;
- e=0;
- e=1;
- if(shan_1)
- {
- if(moshi==0)
- {
- if(ii==2)ii++;//時間顯示時橫杠閃爍
- if(ii==5)ii++;
- }
- if(tiao<9)
- {
- if(ii==tiao)ii=ii+2;//閃爍調(diào)整位
- }
- }
- wei=~(0x01<<ii); //段選
- sjck=bcd[rem[ii]];
- if(ii==0)if(ds_1)dsd0=0;//定時開燈亮否
- e=0;
- e=1;
- ii++;
- if(ii>7)ii=0;
- yanshi(t);
- }
- ////////////////////////////////////////////////
- /////////////////////////////////////
- yinyue(uint x,uint y)
- {
- uint i;
- for(i=0;i<y;i++)
- {
- yue=~yue;
- xianshi(x);
- yue=1;
- }
- }
- /******************顯示111*********************/
- /******************讀時間膀*********************/
- dushijian()
- {
- uchar time;
- time=duds1302(dumiao);
- rem[0]=time&0x0f;
- rem[1]=time>>4;
- time=duds1302(dufen);
- rem[3]=time&0x0f;
- rem[4]=time>>4;
- time=duds1302(dushi);
- rem[6]=time&0x0f;
- rem[7]=time>>4;
- rem[2]=10;
- }
- /******************讀年月日*********************/
- dunianyueri()
- {
- uchar time;
- time=duds1302(duri);
- rem[0]=time&0x0f;
- rem[1]=time>>4;
- time=duds1302(duyue);
- rem[3]=time&0x0f;
- rem[4]=time>>4;
- time=duds1302(dunian);
- rem[6]=time&0x0f;
- rem[7]=time>>4;
- }
- ///////////////////////////////////////////寫時間
- xieshijian()
- {
- xieds1302(baohu,0x00);
- time_1=(rem[1]<<4)+rem[0];
- xieds1302(xiemiao,time_1);
- time_1=(rem[4]<<4)+rem[3];
- xieds1302(xiefen,time_1);
- time_1=(rem[7]<<4)+rem[6];
- xieds1302(xieshi,time_1);
- xieds1302(baohu,0x80);
- }
- ///////////////////////////////////////////寫年月日
- xienianyueri()
- {
- xieds1302(baohu,0x00);
- time_1=(rem[1]<<4)+rem[0];
- xieds1302(xieri,time_1);
- time_1=(rem[4]<<4)+rem[3];
- xieds1302(xieyue,time_1);
- time_1=(rem[7]<<4)+rem[6];
- xieds1302(xienian,time_1);
- xieds1302(baohu,0x80);
- }
- /******************?********************/
- /////////////////////////////////////////////////////////
- anjian()
- {
- P1=0xff;
- if(P1==0xff)aj_1=1;
- if(aj_1)
- {
- if(SB0==0) //模式
- {
- yinyue(10,10);
- aj_1=0;
- if(SB0==0) //模式鍵按下
- {
- msgl=0;
- tiao=9;
- while(SB0==0)yinyue(2,50);
- moshi++;
- if(moshi>7)moshi=0;
- }
- }
- if(SB1==0) //調(diào)整位鍵9 6 3 0 位
- {
- yinyue(20,30);
- aj_1=0;
- if(SB1==0)
- {
- msgl=0;
- while(SB1==0)yinyue(2,30);;
- tiao=tiao+3;
- if(tiao>9)tiao=0;
- }
- }
- if(SB2==0) //加法
- {
- yinyue(10,20);
- aj_1=0;
- if(SB2==0)
- {
- msgl=0;
- while(SB2==0)yinyue(2,60);
- rem[tiao]++;
- if(rem[tiao]>9)
- {
- rem[tiao]=0;
- rem[tiao+1]++;
- if(rem[tiao+1]>=6)rem[tiao+1]=0;
- }
- }
- }
- if(SB3==0)
- {
- yinyue(3,50); /////減法
- aj_1=0;
- if(SB3==0)
- {
- while(SB3==0)yinyue(2,34);
- if(rem[tiao]==0)
- {
- msgl=0;
- if(rem[tiao+1]==0){rem[tiao]=9;rem[tiao+1]=5;}
- else
- {
- rem[tiao+1]--;
- rem[tiao]=9;
- }
- }
- else rem[tiao]--;
- }
- }
- if(SB4==0) //定時器開
- {
- yinyue(2,20);
- aj_1=0;
- if(SB4==0)
- {
- msgl=0;
- while(SB4==0)yinyue(2,15);
- ds_1=~ds_1; //定時標志取反;
- }
- }
- }
- }
- ////////////////////////////////////////////////////////讀定時到顯存
- dudingshi(uchar m)
- {
- rem[0]=m;
- rem[2]=12; //ds_o;
- m--;
- if(m%2==0)rem[1]=13; //ds_n;
- else rem[1]=14; //ds_f;
- rem[3]=remds
- --[0]&0x0f; //取分低位到顯存
- rem[4]=remds
- -[0]>>4; //取分高位
- rem[6]=remds
- -[1]&0x0f; //取時低位
- rem[7]=remds
- -[1]>>4; //取時高位到顯存
- }
- ////////////////////////////////////////////////////////////////
- xiedingshi(uchar m)
- {
- uchar n;
- remds
- -[0]=rem[3]+(rem[4]<<4);
- remds
- -[1]=rem[6]+(rem[7]<<4); //從DS1302 0xc0 開始,xds 帶表0xc0
- n=xds+(m*4);
- xieds1302(baohu,0x00); //開保護
- xieds1302(n,remds
- -[0]); //寫第一個數(shù)據(jù)
- n=n+2;
- xieds1302(n,remds
- --[1]); //寫第二個數(shù)據(jù)
- xieds1302(baohu,0x80);
- }
- ////////////////////////讀取定時數(shù)據(jù)到存儲器
- duchudingshi()
- {
- uchar i,m;
- m=dds;
- for(i=0;i<6;i++)
- {
- remds[i][0]=duds1302(m);
- m=m+2;
- remds[i][1]=duds1302(m);
- m=m+2;
- }
- }
- //////////////////////////////////////////////////////////////////
- dingshipanduan()
- {
- uchar i,temp,temp1;
- temp=rem[3]+(rem[4]<<4);
- temp1=rem[6]+(rem[7]<<4);
- for(i=0;i<6;i++)
- {
- if(temp==remds[i][0])
- {
- if(temp1==remds[i][1])
- {
- if(remds[i][0]==0x00){if(remds[i][1]==0x00)goto loop;}
- else
- {
- if(i%2==0)jidianqi=0;
- else jidianqi=1;
- if(ds_2==0)if(rem[0]==0)if(rem[1]==0)ds_2=1;//音樂標志位置1
- }
- loop: xianshi(1);
- }
- }
- }
-
- }
- //////////////////////////////////////////////////////////////
- zhengdian()
- {
- if(rem[0]==0)
- if(rem[1]==0)if(rem[2]==0)if(rem[3]==0)ds_2=1;
- }
- /******************主程序111*********************////////////////
- //////////////////////////////////////////////////////////////////
- void main(void)
- {
- tiao=9;
- duchudingshi();//從DS1302讀出到存儲器
- yue=1;
- jidianqi=1;
- ds_1=0;
- while(1)
- {
- anjian();
- if(tiao==9)
- {
- if(moshi>1)dudingshi(moshi-1);//讀定時到顯存
- switch(moshi)
- {
- case 0: dushijian();break; ///////讀時間
- case 1: dunianyueri();break; /////度年月日
- default:break;
- }
- }
- else
- {
- if(moshi>1)xiedingshi(moshi-2); //寫定時到定時存儲器,寫到DS1302
- switch(moshi)
- {
- case 0:xieshijian();break; ///寫時間
- case 1:xienianyueri();break;////寫年月日
- default:break;
- }
- }
- xianshi(20);
- if(ds_1) { if(moshi==0)dingshipanduan(); //zhengdian();
- }
- else jidianqi=1; //否則繼電器關
- if(ds_2){fangyinyue();ds_2=0;}
- tt++;
- if(tt>500)
- {
- tt=0;
- shan_1=~shan_1; //閃爍標志取反
- msgl++; //按鍵按下時模式歸零計數(shù)器
- if(msgl>20)
- {
- msgl=0;
- if(moshi!=0)moshi=0; //模式不等于零時歸零
- if(tiao!=9)tiao=9; //調(diào)整不等于9時歸九
- rem[2]=10; //
- }
- }
- }
- }
復制代碼
|
|