小学期课程设计的一个小作品,肝了16个小时。这是我第一次能够独立完成课程设计。(以前都是靠别人带)不过首先我选的题目比较简单,再加上老师说我的数字钟没有用RTC,这是一个极大的扣分点。所以最终老师只给打了个D+。D+就是65到70的水平吧。
首先来演示下。(本次课设用的普中开发板。)
通电,下载程序后,数字钟从00:00:00开始计时:
按K1加一分钟,K2加一小时,K3加一秒。
按K4切换模式,下一个模式是闹钟,(其实是倒计时读秒,到00:00:00蜂鸣器响起)同样按K1,K2,K3调整时间,如果我按下K1,蜂鸣器将在1分钟后响起。
接下来还有秒表模式。(老师说我的作品只有这个功能做的亮眼一点)
按K4切换至秒表。为了区分我把秒表的数字间隔改了一下。
按下S1开始计时,再按一次S1就暂停计时。
然后按下S2可以将秒表数字清零。
主要功能就这么多,接下来展示下代码作为参考。
#include
#include
sbit u5A = P2^2;
sbit u5B = P2^3;
sbit u5C = P2^4;
sbit beep=P2^5;
sbit AddHour=P3^0;//加一小时
sbit AddMin=P3^1;//加一分钟
char num=0;//时钟计数
char NewNum=0;//闹钟计数
char Pattern=0;//模式计数
char SecCount=0;//秒表启动/暂停控制计数
unsigned char Nixie[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//数码管0~9
//时钟用
unsigned char i = 0;//秒(个位)
unsigned char k = 0;//秒(十位)
unsigned char l = 0;//分(个位)
unsigned char m = 0;//分(十位)
unsigned char n = 0;//时(个位)
unsigned char z = 0;//时(十位)
//闹钟用
unsigned char x = 0;//秒(个位)
unsigned char c = 0;//秒(十位)
unsigned char v = 0;//分(个位)
unsigned char b = 0;//分(十位)
unsigned char w = 0;//时(个位)
unsigned char q = 0;//时(十位)
//秒表用
unsigned char hg= 0;//毫秒(个位)
unsigned char hs= 0;//毫秒(十位)
unsigned char mg= 0;//秒(个位)
unsigned char ms= 0;//秒(十位)
unsigned char fg= 0;//分(个位)
unsigned char fs= 0;//分(十位)
void Delay10ms() //@12.000MHz
{
unsigned char i, j;
i = 117;
j = 184;
do
{
while (--j);
} while (--i);
}
void Delay1ms() //@12.000MHz
{
unsigned char i, j;
i = 12;
j = 169;
do
{
while (--j);
} while (--i);
}
void Delay400us() //@12.000MHz
{
unsigned char i, j;
i = 5;
j = 168;
do
{
while (--j);
} while (--i);
}
void Delay30ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 2;
j = 95;
k = 43;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void TimerAndInterruptInit(void) //定时器0:50毫秒,定时器1:10毫秒@12.000MHz
{
TMOD = 0x11;
TL0 = 0x01;
TH0 = 0x4C;
TL1 = 0xF0;
TH1 = 0xD8;
TCON = 0x55;
IE = 0x8F;
}
void ShowClock()//闹钟显示
{
unsigned char j;
beep=0;
for(j=0;j<8;j++)
{
switch(j)
{
case 0:u5A=1;u5B=1;u5C=1;break;
case 1:u5A=0;u5B=1;u5C=1;break;
case 2:u5A=1;u5B=0;u5C=1;break;
case 3:u5A=0;u5B=0;u5C=1;break;
case 4:u5A=1;u5B=1;u5C=0;break;
case 5:u5A=0;u5B=1;u5C=0;break;
case 6:u5A=1;u5B=0;u5C=0;break;
case 7:u5A=0;u5B=0;u5C=0;break;
}
if(j==2 || j==5)
{
P0=0x40;
}
else if(j==7)
{
P0=Nixie[x];
}
else if(j==6)
{
P0=Nixie[c];
}
else if(j==4)
{
P0=Nixie[v];
}
else if(j==3)
{
P0=Nixie[b];
}
else if(j==1)
{
P0=Nixie[w];
}
else if(j==0)
{
P0=Nixie[q];
}
Delay400us();
}
if(x==0 && c==0 && v==0 && b==0 && w==0 && q==0)
{
beep=1;
Delay1ms();
beep=0;
Delay1ms();
}
}
void ShowTime() //时钟显示
{
unsigned char j;
beep=0;
for(j=0;j<8;j++)
{
switch(j)
{
case 0:u5A=1;u5B=1;u5C=1;break;
case 1:u5A=0;u5B=1;u5C=1;break;
case 2:u5A=1;u5B=0;u5C=1;break;
case 3:u5A=0;u5B=0;u5C=1;break;
case 4:u5A=1;u5B=1;u5C=0;break;
case 5:u5A=0;u5B=1;u5C=0;break;
case 6:u5A=1;u5B=0;u5C=0;break;
case 7:u5A=0;u5B=0;u5C=0;break;
}
if(j==2 || j==5)
{
P0=0x40;
}
else if(j==7)
{
P0=Nixie[i];
}
else if(j==6)
{
P0=Nixie[k];
}
else if(j==4)
{
P0=Nixie[l];
}
else if(j==3)
{
P0=Nixie[m];
}
else if(j==1)
{
P0=Nixie[n];
}
else if(j==0)
{
P0=Nixie[z];
}
Delay400us();
}
}
void SecondChronograph() //秒表显示
{
unsigned char j;
beep=0;
for(j=0;j<8;j++)
{
switch(j)
{
case 0:u5A=1;u5B=1;u5C=1;break;
case 1:u5A=0;u5B=1;u5C=1;break;
case 2:u5A=1;u5B=0;u5C=1;break;
case 3:u5A=0;u5B=0;u5C=1;break;
case 4:u5A=1;u5B=1;u5C=0;break;
case 5:u5A=0;u5B=1;u5C=0;break;
case 6:u5A=1;u5B=0;u5C=0;break;
case 7:u5A=0;u5B=0;u5C=0;break;
}
if(j==2 || j==5)
{
P0=0x5C;
}
else if(j==7)
{
P0=Nixie[hg];
}
else if(j==6)
{
P0=Nixie[hs];
}
else if(j==4)
{
P0=Nixie[mg];
}
else if(j==3)
{
P0=Nixie[ms];
}
else if(j==1)
{
P0=Nixie[fg];
}
else if(j==0)
{
P0=Nixie[fs];
}
Delay400us();
}
}
void SecondChronographSet() //秒表开启/暂停,清零控制
{
P1=0x7F;
if(P1!=0x7F)
{
Delay10ms();
if(P1==0x77)
{
SecCount=!SecCount;
}
else if(P1==0x7B)
{
hg= 0;
hs= 0;
mg= 0;
ms= 0;
fg= 0;
fs= 0;
}
}
while(P1!=0x7F);
}
void HourSet() //加一小时
{
if(AddHour==0)
{
if(Pattern==0)
{
Delay30ms();
if(n<9)
{
n++;
if(z==2 && n==4)
{
n=0;
z=0;
}
}
else
{
n=0;
if(z<2)
{
z++;
}
}
}
else if(Pattern==1)
{
Delay30ms();
if(w<9)
{
w++;
if(q==2 && w==4)
{
q=0;
w=0;
}
}
else
{
w=0;
if(q<2)
{
q++;
}
}
}
}
}
void MinSet()//加一分钟
{
if(AddMin==0)
{
if(Pattern==0)
{
Delay30ms();
if(l<9)
{
l++;
}
else
{
l=0;
if(m<5)
{
m++;
}
else
{
m=0;
}
}
}
else if(Pattern==1)
{
Delay30ms();
if(v<9)
{
v++;
}
else
{
v=0;
if(b<5)
{
b++;
}
else
{
b=0;
}
}
}
}
}
void main()
{
beep=0;
TimerAndInterruptInit();
while(1)//模式0:时间,模式1:闹钟,模式2:秒表
{
if(Pattern==2)
{
SecondChronograph();
SecondChronographSet();
}
else if(Pattern==0)
{
ShowTime();
}
else if(Pattern==1)
{
ShowClock();
}
HourSet();
MinSet();
}
}
void TimeAndClockGoes() interrupt 1//时间流动和闹钟运行
{
TL0 = 0x01;
TH0 = 0x4C;
num=num+1;
NewNum+=1;
if (num==20)
{
if(i<9)
{
i++;
}
else
{
i=0;
if(k<5)
{
k++;
}
else
{
k=0;
if(l<9)
{
l++;
}
else
{
l=0;
if(m<5)
{
m++;
}
else
{
m=0;
if(n<9)
{
n++;
if(z==2 && n==4)
{
i=0;
k=0;
l=0;
m=0;
n=0;
z=0;
}
}
else
{
n=0;
if(z<2)
{
z++;
}
}
}
}
}
}
num=0;
}
if(NewNum==20)
{
if(x>0)
{
x--;
}
else
{
if(c>0)
{
c--;
x=9;
}
else
{
if(v>0)
{
v--;
c=5;
x=9;
}
else
{
if(b>0)
{
b--;
v=9;
c=5;
x=9;
}
else
{
if(w>0)
{
w--;
b=5;
v=9;
c=5;
x=9;
}
else
{
if(q>0)
{
q--;
w=9;
b=5;
v=9;
c=5;
x=9;
}
}
}
}
}
}
NewNum=0;
}
}
void SecSet() interrupt 0 //加一秒
{
if(Pattern==0)
{
if(i<9)
{
i++;
}
else
{
i=0;
if(k<5)
{
k++;
}
else
{
k=0;
}
}
}
else if(Pattern==1)
{
if(x<9)
{
x++;
}
else
{
x=0;
if(c<5)
{
c++;
}
else
{
c=0;
}
}
}
}
void SwitchPattern() interrupt 2 //切换模式
{
Pattern++;
if(Pattern>2)
{
Pattern=0;
}
}
void SecondChronographRun() interrupt 3 //秒表运行
{
TL1 = 0xF0;
TH1 = 0xD8;
if(SecCount==1)
{
if(hg<9)
{
hg++;
}
else
{
hg=0;
if(hs<9)
{
hs++;
}
else
{
hs=0;
if(mg<9)
{
mg++;
}
else
{
mg=0;
if(ms<5)
{
ms++;
}
else
{
ms=0;
if(fg<9)
{
fg++;
}
else
{
fg=0;
if(fs<9)
{
fs++;
}
else
{
fs=0;
}
}
}
}
}
}
}
}
各位有什么意见欢迎指出。