利用单片机和3位数码管实现从0到9分59秒的计时,计时的秒通过空操作延时实现,具体代码如下:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit key1=P2^7;
sbit key2=P2^6;
sbit weiH=P3^0;
sbit weiM=P3^1;
sbit weiL=P3^2;
uint num=0,ge=0,shi=0,fen=0,k; //num用来计数,ge为各位显示,shi为十位显示,fen为分钟显示
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
key1scan()
{if(key1==0)
{delayms(10);
if(key1==0)
{while(!key1);
return 1;
}
}
}
key2scan()
{if(key2==0)
{delayms(10);
if(key2==0)
{while(!key2);
return 1;
}
}
}
void showtime() //时间显示
{while(1)
{weiL=1; //显示秒的个位
P1=0xff;
P1=table[ge];
delayms(5);
weiL=0;
weiM=1; //显示秒的十位
P1=0xff;
P1=table[shi];
delayms(5);
weiM=0;
weiH=1; //显示分钟,只显示0-9
P1=0xff;
P1=table[fen];
delayms(5);
weiH=0;
}
}
void main()
{num=0;
if((key1scan()==1)&&(key2scan()!=1)) //按键1按下,按键2未按下开始计时
{
++num;
if(num<10)
{ge=num;}
if(num=10)
{num=num-10; //个位到10清零
if(shi==6) //十位到6清零
{shi=0;
++fen;
}
++shi;
ge=num;
}
showtime();
}
}
请问为什么数码管时钟显示000,而不是计时状态?如何修改(不要太大面积修改)?
这个是利用·中断的,数码管跳变,但是显示都一样,而且到后面不清晰
唉,没办法了,这是根据你提供的资料画的proteus的原理图,可以自己试一下。