采用四位一体数码管俩个,限流电阻4.7k欧,主控为STC89c52单片机。以下程序作为参考。实物图可以去相册里观看。
呵呵,在编写这个程序时遇到了一些问题,拿出来与大家共勉。
刚开始我就把位定义的接口弄错,单片机怎么都不工作,看来看去终于发现刚开始就错了;之后发现我的时间走得比标准时钟快好多,可能我的芯片晶振更快吧,但怎么想真么不合理,那个后来我只好计算一下,只好把时钟改了;再之后我发现有时调节时和分时,秒针要等很久(大约一分钟)才工作,后来经过排查发现,当你调节时,如果正好等于time==16,那么time将继续增加,直至走到下一个16,。
本程序应用了定时器中断。
#include<reg52.h>
#define DIG P0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit k0=P3^1;
sbit k1=P3^0;
void timerconfiguration();
void digdisplay();
void clock();
void keydown();
unsigned char num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char state[10];
unsigned char time;
unsigned char a;
unsigned char b;
unsigned char d;
unsigned char c;
unsigned char e;
void main()
{
char k;
for(k=7;k>0;k--)
state[k]=num[0];
state[2]=0x40;
state[5]=0x40;
time=0;
a=0;
b=0;
c=0;
d=0;
e=0;
timerconfiguration();
while(1)
{
digdisplay();
keydown();
clock();
}
}
void timerconfiguration(void)
{
TMOD=0X01;
TH0=0X3C;
TL0=0XB0;
EA=1;
ET0=1;
TR0=1;
}
void digdisplay(void)
{
unsigned char i;
unsigned char j;
i=0;
while(i<8)
{
switch(i)
{
case (0): LSA=0; LSB=0; LSC=0; break;
case (1): LSA=1; LSB=0; LSC=0; break;
case (2): LSA=0; LSB=1; LSC=0; break;
case (3): LSA=1; LSB=1; LSC=0; break;
case (4): LSA=0; LSB=0; LSC=1; break;
case (5): LSA=1; LSB=0; LSC=1; break;
case (6): LSA=0; LSB=1; LSC=1; break;
case (7): LSA=1; LSB=1; LSC=1; break;
}
DIG=state[i];
i++;
j=10;
while(j--);
DIG=0x00;
}
}
void timer() interrupt 1
{
time++;
}
void keydown(void)
{
unsigned char q;
unsigned char w;
unsigned char p;
unsigned char number;
if((k0==0) || (k1==0))
{
for(q=38; q>0; q--)
for(w=100; w>0; w--);
if(k0==0)
{
if(state[3]!=num[9])
{
c++;
state[3]=num[c];
}
else
{
c=0;
state[3]=num[c];
if(state[4]!=num[5])
{
d++;
state[4]=num[d];
}
else
{
d=0;
state[4]=num[d];
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
d=0;
e=0;
}
}
}
}
if(k1==0)
{
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
e=0;
}
}
p=50;
while((p>0) && ((k0==0) ||(k1==0)))
{
p--;
for(q=38; q>0; q--)
for(w=100; w>0; w--);
}
}}
void clock(void)
{
unsigned char number;
if(time>=16)
{
time=0;
if(state[0]!=num[9])
{
a++;
state[0]=num[a];
}
else
{
a=0;
state[0]=num[a];
if(state[1]!=num[5])
{
b++;
state[1]=num[b];
}
else
{
b=0;
state[1]=num[b];
if(state[3]!=num[9])
{
c++;
state[3]=num[c];
}
else
{
c=0;
state[3]=num[c];
if(state[4]!=num[5])
{
d++;
state[4]=num[d];
}
else
{
d=0;
state[4]=num[d];
if(state[6]!=num[9])
{
e++;
state[6]=num[e];
}
else
{
e=0;
state[6]=num[e];
state[7]=num[1];
}
if((state[7]==num[1]) && (state[6]==num[3]))
{
for(number=7; number>0; number--)
state[number]=num[0];
state[2]=0x40;
state[5]=0x40;
e=0;
}
}
}
}
}
}
}
robots brother 之 牧雷(爱昵空间)
欢迎喜欢电子的朋友加我的新qq一起讨论,以后作品将很少发在这个qq。
robots brother 2300862512
|