|
仿真 實物都通過.stc89c52 11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數(shù)碼管顯示88-88的樣式
一個按鍵調(diào)節(jié)時間:
1.長按key1,進入調(diào)時狀態(tài),小時十位開始閃爍,此時再短按key1,小時十位加加,
小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關(guān))
2.調(diào)好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
3.小時個位調(diào)好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
之間變化;
4.分鐘十位調(diào)好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
之間變化;
5.分鐘個位調(diào)好后,過5秒,退出調(diào)時狀態(tài),時鐘正常走時。
在非調(diào)時狀態(tài),短按key1,開關(guān)LED燈;
小時 、分鐘的個位、十位分開調(diào)節(jié),這樣比常規(guī)的個位、十位在一起調(diào)時快;
QQ截圖20190624145700.jpg (154.21 KB, 下載次數(shù): 59)
下載附件
2019-6-24 15:00 上傳
單片機源程序如下:
- /*********************************************************************************
- 仿真 實物都通過.stc89c52 11.0592MHz晶振 ;具體電路見仿真圖;仿真用5位數(shù)碼管顯示88-88的樣式
- 一個按鍵調(diào)節(jié)時間:
- 1.長按key1,進入調(diào)時狀態(tài),小時十位開始閃爍,此時再短按key1,小時十位加加,
- 小時十位在0-2之間變化;(key1可以是按鈕,也可以用觸摸開關(guān))
- 2.調(diào)好后,過5秒自動跳到小時個位閃爍,此時再短按key1,小時個位加加,如果十位是0、1,
- 小時個位再0-9之間變化;如果十位是2,小時個位在0-3之間變化;
- 3.小時個位調(diào)好后,過5秒,分鐘十位開始閃爍,此時再短按key1,分鐘十位加加,分鐘十位在0-5
- 之間變化;
- 4.分鐘十位調(diào)好后,過5秒,分鐘個位開始閃爍,此時再短按key1,分鐘個位加加,分鐘個位在0-9
- 之間變化;
- 5.分鐘個位調(diào)好后,過5秒,退出調(diào)時狀態(tài),時鐘正常走時。
- 在非調(diào)時狀態(tài),短按key1,開關(guān)LED燈;
- 小時 、分鐘的個位、十位分開調(diào)節(jié),這樣比常規(guī)的個位、十位在一起調(diào)時快;
- **********************************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit sclk = P1^0;
- sbit dio = P1^1;
- sbit ce = P1^2;
- sbit wela = P2^7;
- sbit dula = P2^6;
- sbit led = P1^7;
- sbit key1=P3^0; //按鍵 多功能
- uchar knum=0,ssnum,fsnum,sgnum,fgnum; //調(diào)時 位 閃爍變量
- uchar shi,fen,miao;
- uchar ss; //秒點閃爍變量
- bit zdyw; //自動移位標(biāo)志
- uchar count;//自動移位時間計數(shù)變量
- /***********寫時分秒地址************/
- #define write_shi 0x84
- #define write_fen 0x82
- #define write_miao 0x80
- #define write_ram 0xc0
- /***********讀時分秒地址************/
- #define read_shi 0x85
- #define read_fen 0x83
- #define read_miao 0x81
- #define read_ram 0xc1
- // 0 1 2 3 4 5 6 7 8 9
- uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數(shù)點
- uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};// 共陰帶小數(shù)點
- //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共陽帶小數(shù)點
- //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90}; //共陽不帶小數(shù)點
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void t0_init() //定時50ms中斷
- {
-
- TMOD=0X01;
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- EA=1;
- ET0=1;
- TR0=1;
- ET1=1;
- }
- void display(uchar shi,uchar fen) //顯示函數(shù)
- {
- if(knum==0)
- {
- ssnum=30;
- fsnum=30;
- sgnum=30;
- fgnum=30;
- }
-
- if(knum==3)
- {
- fsnum++;
- ssnum=30;
- fgnum=30;
- sgnum=30;
- }
-
- if(knum==4)
- {
- fgnum++;
- ssnum=30;
- fsnum=30;
- sgnum=30;
- }
- if(knum==1)
- {
- ssnum++;
- sgnum=30;
- fgnum=30;
- fsnum=30;
- }
-
- if(knum==2)
- {
- sgnum++;
- ssnum=30;
- fsnum=30;
- fgnum=30;
- }
-
-
- if(ssnum>=30)
- {
- // if((shi/10)<1) //如果小時十位小于1,
- // {
- // wela=1;
- // P0=0xfe; //第1位
- // wela=0;
- //
- // dula = 1;
- // P0=0xff; // 小時十位就不顯示
- // dula = 0;
- // }
- //
- // else
- {
- wela=1;
- P0=0xfe; //第1位
- wela=0;
-
- dula=1;
- P0=d[shi/10];
- dula=0;
- P0=0xff;
- delay(2);
- }
- if(ssnum==60)
- ssnum=0;
- }
- if(sgnum>=30)
- {
- wela=1;
- P0=0xfd; //第2位
- wela=0;
- dula=1;
- P0=d[shi%10]; //時的個位,P0=d[shi%10]時的個位小數(shù)點閃爍
- dula=0; // 時的個位,P0=dd[shi%10]時的個位小數(shù)點不閃爍
- P0=0xff;
- delay(2);
-
-
-
- if(sgnum==60)
- sgnum=0;
- }
- // if(miao%2==0) //if(miao%2==0) 1秒閃爍1次
- if(ss>=10) // 這里寫為ss>=10,閃爍頻率可調(diào)
- {
- wela=1;
- P0=0xfb; //第3位
- wela=0;
-
- dula=1;
- P0=0x40; //第三位數(shù)碼管顯示“— ”
-
- // P0=0x09; //第三位數(shù)碼管顯示“= ”
- dula=0;
- P0=0xff;
- delay(2);
-
- }
- else
- {
- wela=1;
- P0=0xfb; //第3位
- wela=0;
-
- dula=1;
- P0=0; //第三位數(shù)碼管不顯示
- dula=0;
- P0=0xff;
- delay(2);
- }
-
-
- if(fsnum>=30)
- {
- wela=1;
- P0=0xf7; //第4位
- wela=0;
- dula=1;
- P0=d[fen/10];
- dula=0;
- P0=0xff;
- delay(2);
-
-
- // wela=1;
- // P0=0xef; //第5位
- // wela=0;
- //
- // dula=1;
- // P0=d[fen%10];
- // dula=0;
- // P0=0xff;
- // delay(2);
-
-
- if(fsnum==60)
- fsnum=0;
- }
- if(fgnum>=30)
- {
- wela=1;
- P0=0xef; //第5位
- wela=0;
- dula=1;
- P0=d[fen%10];
- dula=0;
- P0=0xff;
- delay(2);
- if(fgnum==60)
- fgnum=0;
- }
-
- // if(miao%2==0) //if(miao%2==0) 1秒閃爍1次
- // if(ss>=10) //if(ss>=10)閃爍頻率可調(diào)
- // {
- // wela=1;
- // P0=0xdf; //第6位
- // wela=0;
- // dula=1;
- // P0=0x40; //第六位數(shù)碼管顯示“— ”
- // dula=0;
- // P0=0xff;
- //
- // delay(2);
- // }
- //
- // else
- // {
- // wela=1;
- // P0=0xdf; //第6位
- // wela=0;
- // dula=1;
- // P0=0; //第六位數(shù)碼管不顯示
- // dula=0;
- // P0=0xff;
- //
- // delay(2);
- // }
- //
- //
- // wela=1;
- // P0=0xbf; //第7位
- // wela=0;
- //
- // dula=1;
- // P0=d[miao/10]; //秒十位
- // dula=0;
- // P0=0xff;
- // delay(2);
- //
- //
- // wela=1;
- // P0=0x7f; //第8位
- // wela=0;
- //
- // dula=1;
- // P0=d[miao%10]; //秒個位
- // dula=0;
- // P0=0xff;
- // delay(2);
-
- }
- void write_1302(uchar add,dat) //寫1302函數(shù) qx
- {
- uchar i,temp;
- temp=add;
- ce=0;
- _nop_();
- sclk=0;
- _nop_();
- ce=1;
- _nop_();
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- temp=dat;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- ce=0;
- sclk=0;
- }
- uchar read_1302(uchar add) //讀1302函數(shù) qx
- {
- uchar dat,dat1,i,temp;
- temp=add;
- ce=0;
- _nop_();
- sclk=0;
- _nop_();
- ce=1;
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if((temp&0x01)==0x01)
- dio=1;
- else
- dio=0;
- temp>>=1;
- sclk=1;
- _nop_();
- }
- for(i=0;i<8;i++)
- {
- sclk=0;
- _nop_();
- if(dio)
- dat|=0x80;
- if(i<7)
- dat>>=1;
- sclk=1;
- }
- dat1=dat/16; //讀出的數(shù)值轉(zhuǎn)為10進制
- dat=dat%16;
- dat=dat1*10+dat;
- ce=0;
- sclk=0;
- return dat;
- }
- void init_1302() //初始化函數(shù) 設(shè)置第一次上電時顯示的時間值
- {
- write_1302(0x8e,0x00); //保護取消,可以進行寫操作
- write_1302(write_miao,0x57); //寫秒57
- write_1302(write_fen,0x30); //寫分30
- write_1302(write_shi,0x12); //寫時12
- write_1302(0x8e,0x80); //保護啟動,不能進行寫操作
- }
- void read_sf() //讀時分秒
- {
- shi=read_1302(read_shi);
- fen=read_1302(read_fen);
- miao=read_1302(read_miao);
- display(shi,fen);
- }
- void keyscan() //按鍵掃描函數(shù)
- {
- uchar fs,fg,shs,shg; //分鐘十位、個位 ,小時十位、個位
- static uint a; //按鍵延時變量
- fs = fen/10; fg=fen%10; //分鐘十位、個位
- shs = shi/10; shg=shi%10; //小時十位、個位
- if(key1==0)
- {
- a++;
- if(a>50)
- while(!key1)
- {
- display(shi,fen);
- a=0;
- zdyw=1;
- }
- }
- else
- {
- if(a>10 && a<50)
- {
- count=0; //每次按下,count都要清零,松手后,count都是從0開始計數(shù),這句很重要
- a=0;
- if(knum==1) //小時十位調(diào)節(jié)
- {
- shs++;
- if(shs>2) shs=0;
- shi=shs*16+shg;
- write_1302(write_shi,shi); //寫入1302
- read_sf(); //讀出時間,然后顯示
- }
- /*********************/
- if(knum==2) //小時個位調(diào)節(jié)
- {
-
- shg++;
- if(shs==0 || shs==1) //如果小時十位為0、1
- {
- if(shg>9) shg=0; //小時個位可以在0-9變化
- }
- else //否則,小時個位可以在0-3變化
- {
- if(shg>3) shg=0;
- }
- shi=shs*16+shg; //10進制轉(zhuǎn)為16進制
- write_1302(write_shi,shi); //寫入1302
- read_sf(); //讀出時間,然后顯示
- }
- /************************/
- if(knum==3) //分鐘十位調(diào)節(jié)
- {
- fs++;
- if(fs>5) fs=0;
- fen=fs*16+fg;
- write_1302(write_fen,fen); //寫入1302
- read_sf(); //讀出時間,然后顯示
- }
- /*******************/
- if(knum==4) //分鐘個位調(diào)節(jié)
- {
- fg++;
- if(fg>9) fg=0;
- fen=fs*16+fg;
- write_1302(write_fen,fen); //寫入1302
- read_sf(); //讀出時間,然后顯示
- }
-
- /***********************/
- if(knum==0) //非調(diào)時狀態(tài),短按key1,開關(guān)LED
- {
- led=~led;
- }
- }
- }
- }
- /************************/
- void main()
- {
- t0_init();
- init_1302();
- while(1)
- {
- read_sf();
- keyscan();
- }
- }
- void temer1() interrupt 1
- {
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- ss++;
- if(ss==20) //1秒時間到
- {
- ss=0;
- if(zdyw)
- {
- count++;
- if(count==5) //調(diào)時的時候,自動移位快慢調(diào)這里,要快就把count的值減小,反之亦然。
- {
- count=0;
- knum++;
- if(knum==1)
- {
- write_1302(0x8e,0x00); //寫保護取消
- // write_1302(write_miao,0x80); // 寫秒80,時鐘停止走時;
- }
- if(knum>4)
- {
- knum=0;
- zdyw=0;
- write_1302(write_miao,0x00);
- write_1302(0x8e,0x80); //寫保護啟動
- }
- }
- }
- }
- }
復(fù)制代碼 全部資料51hei下載地址:
時鐘個十位分開調(diào)節(jié) -1鍵調(diào)節(jié).rar
(181.79 KB, 下載次數(shù): 15)
2019-6-24 15:00 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|