|
描述:
1、8位共陰數(shù)碼管顯示實(shí)時(shí)時(shí)鐘88-88-88樣式,兩‘-’1秒閃爍1次
2、STC89C52 @ 11.0592MHz晶振,兩片74HC573做段選、位選
3、調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay。
4、在調(diào)時(shí)狀態(tài)超過(guò)3秒再?zèng)]有按鍵按下,回到走時(shí)狀態(tài)
5、加備用電池,掉電走時(shí) ,仿真 實(shí)物都通過(guò)。
仿真圖:
QQ截圖20180131164125.jpg (122.3 KB, 下載次數(shù): 79)
下載附件
2018-1-31 16:45 上傳
單片機(jī)源程序:
- /*********************************************************************************
- 描述:
- 1、8位共陰數(shù)碼管顯示實(shí)時(shí)時(shí)鐘88-88-88樣式,兩‘-’1秒閃爍1次
- 2、STC89C52 @ 11.0592MHz晶振,兩片74HC573做段選、位選
- 3、調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay。
- 4、在調(diào)時(shí)狀態(tài)超過(guò)3秒再?zèng)]有按鍵按下,回到走時(shí)狀態(tài)
- 5、加備用電池,掉電走時(shí) ,仿真 實(shí)物都通過(guò)。
- **********************************************************************************/
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- /***********寫時(shí)分秒地址************/
- #define write_shi 0x84
- #define write_fen 0x82
- #define write_miao 0x80
- #define write_ram 0xc0
- /***********讀時(shí)分秒地址************/
- #define read_shi 0x85
- #define read_fen 0x83
- #define read_miao 0x81
- #define read_ram 0xc1
- sbit sclk = P1^0; //控制數(shù)據(jù)時(shí)鐘
- sbit dio = P1^1; //數(shù)據(jù)口
- sbit ce = P1^2; //使能端、復(fù)位端
- sbit wela = P2^7; //位選
- sbit dula = P2^6; //段選
- sbit key1=P3^0; //按鍵 選擇
- sbit key2=P3^1; //按鍵 加
- sbit key3=P3^2; //按鍵 減
- uint ms; //調(diào)時(shí)自動(dòng)走時(shí)計(jì)時(shí)變量
- uchar knum=0,snum,fnum,ss; //定義 key1按下次數(shù)變量,時(shí)分調(diào)時(shí)閃爍變量,兩‘-’閃爍計(jì)時(shí)變量
- char shi,fen,miao; //定義時(shí)分秒變量
- bit f1,f2,f3; //定義自動(dòng)走時(shí)標(biāo)志
- // 0 1 2 3 4 5 6 7 8 9 不顯 -
- uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40}; //共陰不帶小數(shù)點(diǎn)段碼
- void delay(uint z) //ms延時(shí)函數(shù)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=120;y>0;y--);
- }
- void t0_init() //定時(shí)器初始化函數(shù)
- {
-
- TMOD |= 0X11; //定時(shí)器0、1都為模式1, 16位計(jì)數(shù)模式
- TH0=(65536-46080)/256; //50ms初值 @11.0529MHz
- TL0=(65536-46080)%256;
- TH1=(65536-921)/256; //1ms初值 @11.0529MHz
- TL1=(65536-921)%256;
-
- EA=1; //開(kāi)總中斷
- ET0=1; //開(kāi)定時(shí)器T0中斷
- TR0=1; //啟動(dòng)T0
- ET1=1; //開(kāi)定時(shí)器T1中斷
- // TR1=1;
- }
- void display(uchar shi,uchar fen,uchar miao) //顯示函數(shù)
- {
- if(knum==0) //正常走時(shí)
- {
- snum=30;
- fnum=30;
- }
-
- if(knum==1) //調(diào)時(shí),分位閃爍
- {
- fnum++;
- snum=30;
- }
-
- if(knum==2) //調(diào)時(shí),時(shí)位閃爍
- {
- snum++;
- fnum=30;
- }
-
-
- if(snum>=30)
- {
- if((shi/10)<1) //如果小時(shí)十位小于1,
- {
- wela=1;
- P0=0xfe; //第1位
- wela=0;
-
- dula = 1;
- P0=d[10]; //共陰數(shù)碼管段碼送全0 小時(shí)十位就不顯示
- dula = 0;
- }
-
- else
- {
- wela=1;
- P0=0xfe; //第1位
- wela=0;
-
- dula=1;
- P0=d[shi/10];
- dula=0;
- P0=0xff;
- delay(2);
- }
- wela=1;
- P0=0xfd; //第2位
- wela=0;
- dula=1;
- P0=d[shi%10];
- dula=0;
- P0=0xff;
- delay(2);
-
- if(snum==60)
- snum=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=d[11]; //第三位數(shù)碼管顯示“— ”
- dula=0;
- P0=0xff;
- delay(2);
- }
-
- else
- {
- wela=1;
- P0=0xfb; //第3位
- wela=0;
-
- dula=1;
- P0=d[10]; //第三位數(shù)碼管不顯示
- dula=0;
- P0=0xff;
- delay(2);
- }
-
-
- if(fnum>=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(fnum==60)
- fnum=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=d[11]; //第六位數(shù)碼管顯示“— ”
- dula=0;
- P0=0xff;
- delay(2);
- }
-
- else
- {
- wela=1;
- P0=0xdf; //第6位
- wela=0;
- dula=1;
- P0=d[10]; //第六位數(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]; //秒個(gè)位
- dula=0;
- P0=0xff;
- delay(2);
- }
- void write_1302(uchar add,dat)//寫1302函數(shù)
- {
- 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ù)
- {
- 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;
- dat=dat%16;
- dat=dat1*10+dat;
- ce=0;
- sclk=0;
- return dat;
- }
- void init_1302() //自動(dòng)初始化函數(shù)
- {
- if(read_1302(read_ram) != 0xaa) //如果初始化標(biāo)志RAM的值不是0xaa,才初始化
- {
- write_1302(0x8e,0x00); //保護(hù)取消,可以進(jìn)行寫操作
- write_1302(write_miao,0x57); //寫秒57
- write_1302(write_fen,0x55); //寫分55
- write_1302(write_shi,0x15); //寫時(shí)15
- write_1302(write_ram,0xaa); //寫入初始化標(biāo)志RAM(第00個(gè)RAM位置)
- write_1302(0x8e,0x80); //保護(hù)啟動(dòng),不能進(jìn)行寫操作
- }
- }
- void read_sf() //讀時(shí)分秒并顯示
- {
- shi=read_1302(read_shi);
- fen=read_1302(read_fen);
- miao=read_1302(read_miao);
- display(shi,fen,miao);
- }
- void keyscan() //按鍵掃描函數(shù)
- {
- static uchar count; //這里要定義為靜態(tài)變量
-
- if(key1==0) //按鍵按下
- {
- TR1=1;
- count++; //消抖,也是連加一次的間隔時(shí)間
- f1=1;
- if(key1==0 && count>10)//按鍵按下,計(jì)數(shù)變量加到12,
- {
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- while(!key1) //這里不需要連加,就加一句松手檢測(cè)
- display(shi,fen,miao);
- count=0;
- TR0=0; //關(guān)閉T0定時(shí)器,數(shù)碼管兩‘-’停止閃爍
- knum++;
- if(knum==1)
- {
- write_1302(0x8e,0x00); //DS1302寫保護(hù)取消
- write_1302(write_miao,0x80); //寫秒80,時(shí)鐘停止走時(shí);
- }
-
- if(knum==3) //調(diào)時(shí)完畢,時(shí)鐘啟動(dòng)
- {
- TR0=1; //啟動(dòng)T0定時(shí)器,數(shù)碼管兩‘-’開(kāi)始閃爍
- knum=0;
- write_1302(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
- write_1302(0x8e,0x80); //保護(hù)啟動(dòng)
- }
- }
- }
- if(knum==1) //分鐘調(diào)節(jié)
- {
- if(key2==0) //加
- {
- f2=1;
- count++;
- if(key2==0 && count>12)//短按加1,長(zhǎng)按連加
- {
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- count=0;
- fen++;
- fen=fen/10*16+fen%10; //轉(zhuǎn)為16進(jìn)制
- if(fen==0x60)
- fen=0x00;
- write_1302(write_fen,fen); //寫入1302
- }
- }
-
- if(key3==0) //減
- {
- f3=1;
- count++;
- if(key3==0 && count>12)//短按減1,長(zhǎng)按連減
- {
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- count=0;
- fen--;
- fen=fen/10*16+fen%10; //轉(zhuǎn)為16進(jìn)制
- if(fen==-1)
- fen=0x59;
- write_1302(write_fen,fen);
- }
- }
- }
-
-
- if(knum==2) //小時(shí)調(diào)節(jié)
- {
- if(key2==0)
- {
- f2=1;
- count++;
- if(key2==0 && count>12 )//短按加1,長(zhǎng)按連加
- {
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- count=0;
- shi++;
- shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
- if(shi==0x24)
- shi=0x00;
- write_1302(write_shi,shi);
- }
- }
-
-
- if(key3==0)
- {
- f3=1;
- count++;
- if(key3==0 && count>12 )//短按減1,長(zhǎng)按連減
- {
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- count=0;
- shi--;
- shi=shi/10*16+shi%10;//轉(zhuǎn)為16進(jìn)制
- if(shi==-1)
- shi=0x23;
- write_1302(write_shi,shi);
- }
- }
- }
- /*按鍵超過(guò)3秒沒(méi)有動(dòng)作,時(shí)鐘回到走時(shí)狀態(tài)*/
- if(f1==1 || f2==1 || f3==1)
- {
- if(ms>3000) //時(shí)間超過(guò)3秒
- {
- TR1=0; //關(guān)閉T1
- ms=0; //自啟動(dòng)計(jì)時(shí)變量清零
- knum=0; //key1按鍵次數(shù)清零
- TR0=1; //啟動(dòng)T0,數(shù)碼管兩‘-’開(kāi)始閃爍
- write_1302(write_miao,0x00); //寫秒0,時(shí)鐘啟動(dòng)走時(shí)
- write_1302(0x8e,0x80); //保護(hù)啟動(dòng)
- }
-
- }
- }
- /*主函數(shù)*/
- void main()
- {// uchar i;
- t0_init();
- init_1302();
- while(1)
- {
- // for(i=0;i<4;i++)
- // display(shi,fen,miao);
- read_sf();
- keyscan();
- }
- }
- /*中斷函數(shù)*/
- void temer1() interrupt 1
- {
- TH0=(65536-46080)/256;
- TL0=(65536-46080)%256;
- ss++;
- if(ss==20)
- ss=0;
- }
- void temer2() interrupt 3
- {
- TH1=(65536-921)/256;
- TL1=(65536-921)%256;
- ms++;
- }
復(fù)制代碼
0.png (49.85 KB, 下載次數(shù): 54)
下載附件
2018-1-31 17:06 上傳
附件里面有完整的源碼,仿真文件,hex文件
下載:
DS1302數(shù)碼管時(shí)鐘.rar
(122.87 KB, 下載次數(shù): 59)
2018-1-31 16:45 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|