|
設(shè)計方案:
(1)時鐘由6位LED數(shù)碼管顯示,左邊兩位顯示小時,中間兩位顯示分鐘,右邊兩位顯示秒;
(2)時間能夠有按鍵調(diào)整,三個按鍵分別連接在單片機(jī)I/O口上,這三個按鍵的功能分別為切換、加、減;
(3)時間運行到鬧鐘設(shè)定時間時,鬧鐘響(持續(xù)響3秒)。
具體控制原理:SET鍵為切換鍵,按一下SET鍵,進(jìn)入時間顯示的小時設(shè)定狀態(tài);按兩下SET,進(jìn)入時間顯示的分鐘設(shè)定狀態(tài);按三下SET,進(jìn)入定時的小時設(shè)定狀態(tài);按四下SET,進(jìn)入定時的分鐘設(shè)定狀態(tài);按五下SET退出設(shè)定,進(jìn)入當(dāng)前時間顯示狀態(tài),UP和DOWN鍵分別為當(dāng)前狀態(tài)設(shè)定值加一鍵和減一鍵。
源程序:
#include<reg52.h>
unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一維數(shù)組定義0-9、橫杠、全滅
unsigned char a[8];
unsigned char second=0,minute=0,hour=0;
unsigned char minute1=0,hour1=0;
unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //掃描
unsigned char k=0; unsigned int temp; // 記錄毫秒為秒的變量
unsigned char M,S_flag; //M是模式,更新時間的種模式加上正常模式 S_flag閃爍標(biāo)志
sbit K1=P1^0;
sbit K2=P1^1;
sbit K3=P1^2;
sbit BEEP=P3^3;
void delay(unsigned n) //0.2毫秒
{
int x,y;
for(x=0;x<n;x++)
for(y=0;y<24;y++);
}
void time1()
interrupt 3 //定時器中斷函數(shù)
{
TH1=0xfc; //定時ms
TL1=0x18;
temp++;
if(temp==1000) //配合定時器定時s
{
temp=0;
second++;
}
if(second==59)
{
second=0;
if(minute<59)
minute++;
else
{
minute=0;
hour++;
hour%=24;
}
}
if(hour1==hour&&minute1==minute&&second<10) //鬧鐘時間到
{
if(M==0)
BEEP=!BEEP;
}
if(temp%250==0) //每ms
S_flag=!S_flag; //閃爍標(biāo)志位取反
if(k==8)
k=0;
P0=a[k];
P2=b[k++];
delay(1);
P2=0xff;
}
void display()
{
switch(M)
{
case 0:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 1:
{
if(S_flag==1)
{
a[0]=led[hour/10];
a[1]=led[hour%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute/10];
a[4]=led[minute%10];
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 2:
{
a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute/10];
a[4]=led[minute%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[10];
a[6]=led[second/10];
a[7]=led[second%10];
}
break;
case 3:
{
if(S_flag==1)
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
}
else
{
a[0]=led[11];
a[1]=led[11];
}
a[2]=led[10];
a[3]=led[minute1/10];
a[4]=led[minute1%10];
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}break;
case 4:
{
a[0]=led[hour1/10];
a[1]=led[hour1%10];
a[2]=led[10];
if(S_flag==1)
{
a[3]=led[minute1/10];
a[4]=led[minute1%10];
}
else
{
a[3]=led[11];
a[4]=led[11];
}
a[5]=led[11];
a[6]=led[11];
a[7]=led[11];
}
}
}
剩余源代碼見附件
|
評分
-
查看全部評分
|