51的单片机的数码管显示
- 基于51单片机的LED数码管动态显示 LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8位I/O口。
以下附一个
以下是一个电子秒表的代码
```c
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit we=P2^7;
sbit du=P2^6;
sbit s2=P3^0;
sbit s3=P3^1;
sbit s4=P3^2;
uchar a,b,c,d,e,f,t,x, num,num1,num2;
uchar code yidaojiu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(uint);
void play1(uchar,uchar,uchar,uchar,uchar,uchar);
void play2(uchar);
void main()
{
TMOD=0x01;
TH0=(65535-9216)/256;
TL0=(65535-9216)%256;
EA=1;
ET0=1;
TR0=1;
while(s2)
play1(a,b,c,d,e,f);
}
void play1(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
{
du=1;
P0=yidaojiu[a];
du=0;
P0=0xff;
we=1;
P0=0X7f;
we=0;
delay(3);
du=1;
P0=yidaojiu[b];
du=0;
P0=0XFF;
we=1;
P0=0Xbf;
we=0;
delay(3);
du=1;
P0=yidaojiu[c];
du=0;
P0=0XFF;
we=1;
P0=0XDF;
we=0;
delay(3);
du=1;
P0=yidaojiu[d];
du=0;
P0=0xff;
we=1;
P0=0Xef;
we=0;
delay(3);
du=1;
P0=yidaojiu[e];
du=0;
P0=0xff;
we=1;
P0=0Xf7;
we=0;
delay(3);
du=1;
P0=yidaojiu[f];
du=0;
P0=0xff;
we=1;
P0=0Xfb;
we=0;
delay(3);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void dingshizhongduan0() interrupt 1
{
char flat;
TH0=(65535-9216)/256;
TL0=(65535-9216)%256;
if(s4==0)
flat2=0;
if(flat==0)
num++;
if(num==100)
{
num=0;
num1++;
}
if(num1==60)
{
num1=0;
num2++;
}
if(num2==100)
num2=0;
s2=1;
a=num%10;
b=num/10;
c=num1%10;
d=num1/10;
e=num2%10;
f=num2/10;
}