|
1、注意時(shí)序圖時(shí)要連續(xù),不能中間突然加一個(gè)高電平或者低電平,上一個(gè)為高,下一時(shí)序則為低,不能變化,直到程序完成
2、注意秒分時(shí)等寄存器的數(shù)據(jù)范圍,要使CE=1不能直接改變time[0],這樣會(huì)超出范圍
3、定義全局變量在.h文件里定義extern,但不可在前加code
8位數(shù)碼管1302顯示時(shí)間仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機(jī)源程序如下:
- #include<reg51.h>
- #include<DS1302.h>
- #define u8 unsigned char
- sbit KEY1=P3^0; //定義功能按鍵
- sbit KEY2=P3^1; //定義加按鍵
- sbit KEY3=P3^2; //定義減按鍵
- u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //段顯示0~9
- u8 code smgwei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//行顯示
- //********延時(shí)函數(shù)***********//
- void delay(unsigned int i)
- {
- while(i--);
- }
- //******顯示函數(shù)*********//
- void display_all()
- {
- int k;
- for(k=0;k<8;k++)
- {
- switch(k)
- {
- case 0: P1=smgduan[time[2]/16];break;
- case 1: P1=smgduan[time[2]%16];break;
- case 2: P1=0x40;break;
- case 3: P1=smgduan[time[1]/16];break;
- case 4: P1=smgduan[time[1]%16];break;
- case 5: P1=0x40;break;
- case 6: P1=smgduan[time[0]/16];break;
- case 7: P1=smgduan[time[0]%16];break;
- }
- P2=smgwei[k];
- delay(100);
- P1=0x00;
- }
- }
- //*********顯示分*********//
- void display_fen()
- {
- int k;
- for(k=2;k<5;k++)
- {
- switch(k)
- {
- case 2: P1=0x40;break;
- case 3: P1=smgduan[time[1]/16];break;
- case 4: P1=smgduan[time[1]%16];break;
- }
- P2=smgwei[k];
- delay(100);
- P1=0x00;
- }
- }
- //***********顯示秒**********//
- void display_miao()
- {
- int k;
- for(k=5;k<8;k++)
- {
- switch(k)
- {
- case 5: P1=0x40;break;
- case 6: P1=smgduan[time[0]/16];break;
- case 7: P1=smgduan[time[0]%16];break;
- }
- P2=smgwei[k];
- delay(100);
- P1=0x00;
- }
- }
- //**********顯示時(shí)***********//
- void display_shi()
- {
- int k;
- for(k=0;k<3;k++)
- {
- switch(k)
- {
- case 0: P1=smgduan[time[2]/16];break;
- case 1: P1=smgduan[time[2]%16];break;
- case 2: P1=0x40;break;
- }
- P2=smgwei[k];
- delay(100);
- P1=0x00;
- }
- }
- //*********按鍵判斷處理函數(shù)****************//
- void anjian()
- {
- int b=1; //設(shè)置變量b,判斷當(dāng)為0時(shí)按下減按鍵變?yōu)樽畲笾?br />
- delay(100);
- if(!KEY1)
- {
- while(!KEY1); //判斷按鍵是否松開
- DS1302_Writer(0x8e,0x00);
- DS1302_Writer(0x80,time[0]|0x80);//暫停DS1302計(jì)時(shí)
- while(KEY1) //秒加減
- {
- if(!KEY2){time[0]++;if((time[0]&0x0f)>0x09) time[0]=time[0]+6;while(!KEY2);} //因?yàn)槭荁CD碼,所以要加6
- if(!KEY3){if(time[0]==0)b--;time[0]--;if((time[0]&0x0f)>0x09) time[0]=time[0]-6;while(!KEY3);} //因?yàn)槭荁CD碼,所以要減6
- if(time[0]>0x59) time[0]=0; //不能超過最大值和最小值
- if(!b) {time[0]=0x59;b=1;}
- display_miao(); //顯示秒
- }
- while(!KEY1);
- while(KEY1)
- {
- if(!KEY2){time[1]++;if((time[1]&0x0f)>0x09) time[1]=time[1]+6;while(!KEY2);}
- if(!KEY3){if(time[1]==0)b--;time[1]--;if((time[1]&0x0f)>0x09) time[1]=time[1]-6;while(!KEY3);}
- if(time[1]>0x59) time[1]=0;
- if(!b) {time[1]=0x59;b=1;}
- display_fen();
- }
- while(!KEY1);
- while(KEY1)
- {
- if(!KEY2){time[2]++;if((time[2]&0x0f)>0x09) time[2]=time[2]+6;while(!KEY2);}
- if(!KEY3){if(time[2]==0)b--;time[2]--;if((time[2]&0x0f)>0x09) time[2]=time[2]-6;while(!KEY3);}
- if(time[2]>0x24) time[2]=0;
- if(!b) {time[2]=0x24;b=1;}
- display_shi();
- }
- while(!KEY1)
- {
- DS1302_STOP(); //DS1302獲取改變后的值
- }
- while(KEY1)
- {
- display_all(); //顯示改變后的值,等待按鍵KEY1按下確認(rèn)時(shí)間
- }
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
DS1302時(shí)間顯示.zip
(74.3 KB, 下載次數(shù): 17)
2017-11-6 19:36 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|