標(biāo)題:
1302時(shí)鐘數(shù)碼管顯示時(shí)間帶掉電保存鬧鐘功能 單片機(jī)程序+Proteus仿真
[打印本頁]
作者:
青青梓衿
時(shí)間:
2019-6-21 00:57
標(biāo)題:
1302時(shí)鐘數(shù)碼管顯示時(shí)間帶掉電保存鬧鐘功能 單片機(jī)程序+Proteus仿真
很久沒玩單片機(jī)了,最近收拾東西又找到很多以前在網(wǎng)上買的東西,感覺浪費(fèi)了可惜。想做個(gè)東西玩玩好多東西都忘了,搜資料的過程中發(fā)現(xiàn)這個(gè)論壇感覺壇友都好厲害。又有學(xué)單片機(jī)的沖動了,以前做的東西都拆掉了。我就分享個(gè)我以前做的東西。電路圖仿真通過。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(23.29 KB, 下載次數(shù): 73)
下載附件
2019-6-21 03:54 上傳
單片機(jī)源程序如下:
#include<reg52.h>
#include"ds1302.h"
#include"e2prom.h"
#define uchar unsigned char
#define uint unsigned int
sbit Jdq=P2^2;
bit S_flag;
uchar k1num,k4num,Al_num,Sh_num,num,shi,fen,miao;
char A_shi,A_fen,A_miao,S_shi,S_fen,S_miao;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xbf,0xff,0x88,0xc7,0x89};
void delayms(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Time0_init()
{
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void Display(uchar shi1,uchar shi2,uchar fen1,uchar fen2,uchar miao1,uchar miao2)
{
P1=0x01;
P0=table[shi1];
delayms(2);
P1=0x02;
P0=table[shi2];
delayms(2);
P0=table[11];//消隱
P1=0x04;
P0=table[10];//間隔
delayms(2);
P0=table[11];//消隱
P1=0x08;
P0=table[fen1];
delayms(2);
P1=0x10;
P0=table[fen2];
delayms(2);
P0=table[11];//消隱
P1=0x20;
P0=table[10];//間隔
delayms(2);
P0=table[11];//消隱
P1=0x40;
P0=table[miao1];
delayms(2);
P1=0x80;
P0=table[miao2];
delayms(2);
P0=table[11];//消隱
}
void Shan_Display()
{
switch(k4num)
{
case 1: //開鬧鐘時(shí)間顯示
switch(Al_num)
{
case 1: //小時(shí)閃爍
if(S_flag)
Display(11,11,A_fen/10,A_fen%10,12,13);
else
Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
break;
case 2: //分鐘閃爍
if(S_flag)
Display(A_shi/10,A_shi%10,11,11,12,13);
else
Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
break;
default :
Display(A_shi/10,A_shi%10,A_fen/10,A_fen%10,12,13);
}
break;
case 2: //關(guān)鬧鐘時(shí)間顯示
switch(Sh_num)
{
case 1: //小時(shí)閃爍
if(S_flag)
Display(11,11,S_fen/10,S_fen%10,5,14);
else
Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
break;
case 2: //分鐘閃爍
if(S_flag)
Display(S_shi/10,S_shi%10,11,11,5,14);
else
Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
break;
default : Display(S_shi/10,S_shi%10,S_fen/10,S_fen%10,5,14);
}
break;
default: //當(dāng)前時(shí)間顯示
switch(k1num)
{
case 1: //小時(shí)閃爍
if(S_flag)
Display(11,11,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
else
Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
break;
case 2: //分鐘閃爍
if(S_flag)
Display(now[2]/16,now[2]%16,11,11,now[0]/16,now[0]%16);
else
Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
break;
case 3: //秒閃爍
if(S_flag)
Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,11,11);
else
Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
break;
default : Display(now[2]/16,now[2]%16,now[1]/16,now[1]%16,now[0]/16,now[0]%16);
}
}
}
void Mode_keyscan()
{
if(k4==0)
{
delayms(10);
if(k4==0)
{
k4num++;
if(k4num>=3)k4num=0;
switch(k4num)
{
case 1:k1num=0;
break;
case 2:Al_num=0;
break;
default:Sh_num=0;
}
while(!k4);
}
}
}
void Move_keyscan()
{
if(k1==0)
{
delayms(10);
if(k1==0)
{
if(k4num==0)
{
k1num++;
if(k1num>=4)k1num=0;
}
else if(k4num==1)
{
Al_num++;
if(Al_num>=3)Al_num=0;
}
else if(k4num==2)
{
Sh_num++;
if(Sh_num>=3)Sh_num=0;
}
while(!k1);
}
}
}
void Add_keyscan()
{
if(k2==0)
{
delayms(10);
if(k2==0)
{
switch(k4num)
{
case 1:
switch(Al_num)
{
case 1:
A_shi++;
if(A_shi>=24)
A_shi=0;
while(!k2);
SectorErase(0x2000);
byte_write(0x2000,A_shi);
break;
case 2:
A_fen++;
if(A_fen>=60)
A_fen=0;
while(!k2);
SectorErase(0x2200);
byte_write(0x2200,A_fen);
break;
}
break;
case 2:
switch(Sh_num)
{
case 1:
S_shi++;
if(S_shi>=24)
S_shi=0;
while(!k2);
SectorErase(0x2400);
byte_write(0x2400,S_shi);
break;
case 2:
S_fen++;
if(S_fen>=60)
S_fen=0;
while(!k2);
SectorErase(0x2600);
byte_write(0x2600,S_fen);
break;
}
break;
default:
switch(k1num)
{
uchar dat ;
case 1:
dat=DS1302_ReadData(0x85);
shi=dat+1;
if((shi&0x0f)>9)shi=shi+6;
if(shi>=0x24)shi=0;
while(!k2);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x84,shi);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
case 2:
dat=DS1302_ReadData(0x83);
fen=dat+1;
if((fen&0x0f)>9)fen=fen+6;
if(fen>=0x60)fen=0;
while(!k2);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x82,fen);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
case 3:
dat=DS1302_ReadData(0x81);
miao=dat+1;
if((miao&0x0f)>9)miao=miao+6;
if(miao>=0x60)miao=0;
while(!k2);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x80,miao);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
}
break;
}
}
}
}
void Reduce_keyscan()
{
if(k3==0)
{
delayms(10);
if(k3==0)
{
switch(k4num)
{
case 1:
switch(Al_num)
{
case 1:
A_shi--;
if(A_shi==-1)
A_shi=23;
while(!k3);
SectorErase(0x2000);
byte_write(0x2000,A_shi);
break;
case 2:
A_fen--;
if(A_fen==-1)
A_fen=59;
while(!k3);
SectorErase(0x2200);
byte_write(0x2200,A_fen);
break;
}
break;
case 2:
switch(Sh_num)
{
case 1:
S_shi--;
if(S_shi==-1)
S_shi=23;
while(!k3);
SectorErase(0x2400);
byte_write(0x2400,S_shi);
break;
case 2:
S_fen--;
if(S_fen==-1)
S_fen=59;
while(!k3);
SectorErase(0x2600);
byte_write(0x2600,S_fen);
break;
}
break;
default:
switch(k1num)
{
uchar dat ;
case 1:
dat=DS1302_ReadData(0x85);
if(dat==0)
shi=0x23;
else
shi=dat-1;
if((shi&0x0f)>9)shi=shi-6;
while(!k3);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x84,shi);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
case 2:
dat=DS1302_ReadData(0x83);
if(dat==0)
fen=0x59;
else
fen=dat-1;
if((fen&0x0f)>9)fen=fen-6;
while(!k3);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x82,fen);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
case 3:
dat=DS1302_ReadData(0x81);
if(dat==0)
miao=0x59;
else
miao=dat-1;
if((miao&0x0f)>9)miao=miao-6;
while(!k3);
DS1302_WriteData(0x8e, 0x00);//允許寫操作
DS1302_WriteData(0x80,miao);
DS1302_WriteData(0x8e, 0x80);//寫保護(hù)
break;
}
break;
}
}
}
}
void AL_SHRead()
{
A_shi=byte_read(0x2000);
A_fen=byte_read(0x2200);
S_shi=byte_read(0x2400);
S_fen=byte_read(0x2600);
}
void AL_SHCheck()
{
uchar j;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
電路圖.zip
(80.85 KB, 下載次數(shù): 120)
2019-6-21 00:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
源程序.zip
(44.51 KB, 下載次數(shù): 145)
2019-6-21 00:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
yit1268
時(shí)間:
2019-8-28 09:49
好,學(xué)習(xí)一下
作者:
蘇蘇ss
時(shí)間:
2020-1-2 17:45
樓主優(yōu)秀,受教了
作者:
wuxiandian
時(shí)間:
2020-2-27 19:44
沒有三八譯碼器控制位選嗎?
作者:
灰太狼2020
時(shí)間:
2020-2-28 17:27
非常好!感謝分享
作者:
whwitp
時(shí)間:
2020-6-2 10:20
感謝樓主分享1302時(shí)鐘數(shù)碼管顯示時(shí)間帶掉電保存鬧鐘功能
作者:
danq
時(shí)間:
2020-7-4 11:05
感謝樓主1302時(shí)鐘數(shù)碼管顯示時(shí)間資源!
作者:
wr1213
時(shí)間:
2020-7-4 19:56
這個(gè)用共陰的還是共陽的數(shù)碼管
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1